基于IP的VirtualHost需为网卡配置多个IP,httpd.conf中每个<VirtualHost>块须明确指定对应IP:端口,路由仅依据目标IP,ServerName不参与判断,无需NameVirtualHost指令。
在 httpd.conf 中配置基于 ip 的 virtualhost,核心是让每个站点绑定**独立的 ip 地址 + 端口(通常是 :80)**,apache 通过请求到达的 ip 区分站点。不需要域名解析参与,适合测试或有多个公网/内网 ip 的环境。
前提:系统已绑定多个 IP 地址
Apache 不能凭空“拥有”多个 IP,需先在操作系统层面为网卡添加额外 IP(如 `eth0:1` 或使用 `ip addr add`)。例如:
- CentOS/RHEL:编辑 `/etc/sysconfig/network-scripts/ifcfg-eth0:1`,填入 `IPADDR=192.168.1.101`,然后 `systemctl restart network`
- Ubuntu/Debian:运行 `sudo ip addr add 192.168.1.102/24 dev eth0`(临时),或写入 `/etc/netplan/` 配置(永久)
httpd.conf 中的 VirtualHost 块写法
每个 <VirtualHost> 块必须明确指定 IP 和端口,且与实际监听地址一致。示例(两个站点):
<VirtualHost 192.168.1.101:80>
ServerName site1.local
DocumentRoot "/var/www/site1"
<Directory "/var/www/site1">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.102:80>
ServerName site2.local
DocumentRoot "/var/www/site2"
<Directory "/var/www/site2">
Require all granted
</Directory>
</VirtualHost>
注意点:
- 无需启用
NameVirtualHost指令(该指令仅用于基于域名的虚拟主机,基于 IP 时禁用或注释掉它) -
ServerName是可选的,仅用于日志和重定向参考,不参与路由判断——路由只看目标 IP - 确保
Listen已包含对应端口(默认已有Listen 80;若用非标端口,如Listen 192.168.1.101:8080,则<VirtualHost>也必须写成<VirtualHost 192.168.1.101:8080>)
验证与重启
配置完成后执行:
-
sudo httpd -t(RHEL/CentOS)或sudo apache2ctl -t(Debian/Ubuntu)检查语法是否正确 -
sudo systemctl restart httpd(或apache2)生效配置 - 用浏览器或
curl http://192.168.1.101、curl http://192.168.1.102分别访问,确认返回对应站点内容


















