servername 不绑定 ip,仅用于 host 头匹配;真正决定响应哪个 ip 的是 virtualhost 中显式声明的 ip 地址(或 *)及系统网卡实际配置,需确保 ip 已添加且防火墙放行。

ServerName 本身不绑定 IP,它只定义服务器对外宣称的主机名。在多网卡环境中,真正决定 Apache 响应哪个 IP 的,是 VirtualHost 指令中明确写的 IP 地址(或 *),以及系统网卡实际配置的 IP 列表。
关键逻辑:ServerName 不控制监听,只参与主机名匹配
Apache 启动后,默认监听所有可用网卡上的 80 端口(除非显式限制)。当请求到达时:
- 如果请求是通过 IP 直接访问(如
http://192.168.10.5),ServerName完全不参与路由;Apache 查找第一个匹配该 IP:端口 的<virtualhost></virtualhost>块; - 如果请求带 Host 头(如
curl -H "Host: www.example.com" http://192.168.10.5),Apache 才会用ServerName和ServerAlias去匹配 Host 头,从而选择对应虚拟主机。
想让某个站点只响应特定网卡的 IP,必须靠 VirtualHost 显式声明
例如服务器有两块网卡,IP 分别为 192.168.10.5(内网)和 203.0.113.8(公网):
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 要让 a.com 只在内网 IP 上生效,写:
<virtualhost><br> ServerName a.com<br> DocumentRoot /var/www/a<br></virtualhost>
- 要让 b.com 只在公网 IP 上响应,写:
<virtualhost><br> ServerName b.com<br> DocumentRoot /var/www/b<br></virtualhost>
- 不能写成
<virtualhost></virtualhost>并指望ServerName把它限定到某张网卡——这会响应所有网卡的 80 端口请求。
确保系统层面该 IP 确实存在且可路由
Apache 只能监听已分配给本机的 IP。操作前需确认:
- 用
ip addr show查看是否已为对应网卡(如 ens33)添加了目标 IP; - 临时添加示例:
sudo ip addr add 192.168.10.5/24 dev ens33; - 永久配置需写入网络配置文件(如 CentOS 的
/etc/sysconfig/network-scripts/ifcfg-ens33:0或 systemd-networkd 配置); - 防火墙允许该 IP 的 80 端口通信(如
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="80" protocol="tcp" accept')。
补充:Listen 指令可进一步缩小监听范围
若希望 Apache 根本不监听某张网卡,可在主配置中限制监听地址:
- 默认
Listen 80→ 监听所有接口; - 改为
Listen 192.168.10.5:80→ 只监听内网 IP; - 再配合
<virtualhost></virtualhost>,双重保障; - 注意:若同时需要响应多个 IP,
Listen需逐条写,如:Listen 192.168.10.5:80<br>Listen 203.0.113.8:80










