在实际运维工作中,我们常常需要让一台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出现前),现在较少使用。
六、注意事项与可能出现的报错
-
目录权限与SELinux:
chmod -R 755 /var/www/ restorecon -R /var/www/ # 若启用SELinux -
配置检查与重载:
这里我把头步错误的多加了一个“/”。

-
修改配置后,使用
httpd -t检查语法。 -
确认无误后执行
systemctl restart httpd重启服务。
-
-
混合匹配优先级:
-
若混合使用多种虚拟主机类型,Apache会优先匹配 IP + 端口,再匹配
ServerName。
-
-
默认站点声明:
-
启用虚拟主机后,务必显式声明默认站点的
<VirtualHost>块,否则可能出现非预期跳转。
-

被折叠的 条评论
为什么被折叠?



