基于ip的virtualhost需为网卡配置多个ip,httpd.conf中每个块须明确指定对应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></virtualhost> 块必须明确指定 IP 和端口,且与实际监听地址一致。示例(两个站点):
<virtualhost>
ServerName site1.local
DocumentRoot "/var/www/site1"
<directory>
Require all granted
</directory></virtualhost><virtualhost>
ServerName site2.local
DocumentRoot "/var/www/site2"
<directory>
Require all granted
</directory></virtualhost>
注意点:
- 无需启用
NameVirtualHost指令(该指令仅用于基于域名的虚拟主机,基于 IP 时禁用或注释掉它) -
ServerName是可选的,仅用于日志和重定向参考,不参与路由判断——路由只看目标 IP - 确保
Listen已包含对应端口(默认已有Listen 80;若用非标端口,如Listen 192.168.1.101:8080,则<virtualhost></virtualhost>也必须写成<virtualhost></virtualhost>)
验证与重启
配置完成后执行:
-
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分别访问,确认返回对应站点内容











