Apache虚拟主机:基于域名、端口与IP的三种测试方式

在实际运维工作中,我们常常需要让一台Web服务器同时承载多个网站。Apache提供了强大的虚拟主机(Virtual Host) 功能,支持通过域名端口IP地址三种方式区分不同的站点。本文将详细介绍这三种虚拟主机的配置过程。

环境说明

  • 操作系统:CentOS / RHEL 7+

  • Web服务:Apache (httpd)

  • 配置路径

    • 主配置文件:/etc/httpd/conf/httpd.conf

    • 虚拟主机配置目录:/etc/httpd/conf.d/*.conf


一、准备工作

1.1 安装并启动Apache

yum install -y httpd
systemctl start httpd
systemctl enable httpd

1.2 创建测试站点目录与页面

mkdir -p /var/www/{qq,baidu,ip-site,port8080}
echo "苗苗" > /var/www/qq/index.html
echo "倩倩" > /var/www/baidu/index.html
echo "IP站点" > /var/www/ip-site/index.html
echo "端口8080站点" > /var/www/port8080/index.html

二、基于域名的虚拟主机(Name-based Virtual Host)

这是最常见的方式,多个域名共享同一个IP和端口(通常是80),通过HTTP请求中的Host头部区分站点。

2.1 配置步骤

编辑配置文件 /etc/httpd/conf.d/haha.conf

<VirtualHost *:80>
    ServerName www.qq.com
    DocumentRoot /var/www/qq
</VirtualHost>

<VirtualHost *:80>
    ServerName www.baidu.com
    DocumentRoot /var/www/baidu
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    DocumentRoot /var/www/html
</VirtualHost>

注意:一旦启用虚拟主机,默认站点(/var/www/html)必须显式声明,否则可能无法访问。

2.2 重启服务

systemctl restart httpd

2.3 客户端测试(在测试机中操作)

编辑 /etc/hosts 添加域名解析:

echo "192.168.4.7 www.qq.com www.baidu.com www.example.com" >> /etc/hosts

使用curl测试访问:

curl http://www.qq.com      
curl http://www.baidu.com  


三、基于端口的虚拟主机(Port-based Virtual Host)

不同站点使用相同IP但不同端口,例如80、8080等。

3.1 添加端口监听

推荐在独立配置文件中添加(便于管理):

echo "Listen 8080" > /etc/httpd/conf.d/ports.conf

或在主配置文件 /etc/httpd/conf/httpd.conf 中添加 Listen 8080

3.2 配置虚拟主机

创建 /etc/httpd/conf.d/vhosts-port.conf

<VirtualHost *:80>
    ServerName port.example.com
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *:8080>
    ServerName port8080.example.com
    DocumentRoot /var/www/port8080
</VirtualHost>

3.3 重启服务

systemctl restart httpd

3.4 测试访问

curl http://192.168.4.7          # 默认80端口
curl http://192.168.4.7:8080    # 预期返回:端口8080站点

防火墙配置:若启用防火墙,需放行8080端口:

firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload


四、基于IP地址的虚拟主机(IP-based Virtual Host)

服务器需绑定多个IP地址(物理网卡或虚拟IP),每个IP对应一个站点。

4.1 添加额外IP地址(临时生效示例)

假设主IP为 192.168.4.7,添加一个额外IP:

ip addr add 192.168.4.8/24 dev ens33

永久配置:可写入网络脚本 /etc/sysconfig/network-scripts/ifcfg-eth0:0

验证IP地址:

ip addr show ens33

4.2 配置虚拟主机

创建 /etc/httpd/conf.d/vhosts-ip.conf

<VirtualHost 192.168.4.7:80>
    ServerName ip1.example.com
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost 192.168.4.8:80>
    ServerName ip2.example.com
    DocumentRoot /var/www/ip-site
</VirtualHost>

4.3 重启服务并测试

systemctl restart httpd
curl http://192.168.4.7    # 返回默认页面
curl http://192.168.4.8    # 预期返回:IP站点

提示:基于IP的虚拟主机不需要域名解析,直接通过IP访问即可区分站点。


五、三种虚拟主机对比总结

类型区分依据是否需多IP是否需多端口是否依赖DNS/hosts
基于域名Host请求头❌ 否❌ 否✅ 是
基于端口端口号❌ 否✅ 是❌ 否
基于IP目标IP地址✅ 是❌ 否❌ 否

实际应用建议

  • 基于域名:最常用,节省IP和端口资源,适用于绝大多数多站点场景。

  • 基于端口:适用于内部管理页面、测试环境或特殊服务。

  • 基于IP:早期多用于SSL证书兼容(SNI出现前),现在较少使用。


六、注意事项与可能出现的报错

  1. 目录权限与SELinux

    chmod -R 755 /var/www/
    restorecon -R /var/www/   # 若启用SELinux
  2. 配置检查与重载
    这里我把头步错误的多加了一个“/”。

    • 修改配置后,使用 httpd -t 检查语法。

    • 确认无误后执行 systemctl restart httpd 重启服务。

  3. 混合匹配优先级

    • 若混合使用多种虚拟主机类型,Apache会优先匹配 IP + 端口,再匹配 ServerName

  4. 默认站点声明

    • 启用虚拟主机后,务必显式声明默认站点的 <VirtualHost> 块,否则可能出现非预期跳转。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值