virtual host 本身不参与故障转移,真正实现的是 keepalived 管理的 vip 漂移;其“无缝接管”依赖主备 nginx 配置完全同步(含 listen、server_name、root、ssl 路径等)及基于健康检查的 vip 动态绑定。

Virtual Host(虚拟主机)本身不参与故障转移,它只是 Nginx 配置中定义服务边界的一组规则。真正实现故障转移的是 Keepalived 管理的 VIP(虚拟 IP)漂移机制。Virtual Host 要能“无缝接管”,关键在于主备节点的配置一致性与服务状态感知——不是 VIP 漂了就自动好了,而是漂过去之后,Nginx 必须能立刻用完全相同的 Virtual Host 正常响应请求。
Virtual Host 配置必须完全同步
主备两台 Nginx 的 /etc/nginx/nginx.conf 及所有 include 的 server 块(即每个 server { ... })需逐字一致,包括:
-
listen 指令:端口、IP 绑定方式(如
listen 80或listen 192.168.1.100:443 ssl)必须相同;若监听 VIP,实际不建议硬写 VIP 地址,而应监听0.0.0.0:80或省略 IP,靠系统路由和 VIP 绑定生效 - server_name:域名必须一致,否则 VIP 漂移后可能因 Host 不匹配返回 default server 或 404
- root / location / proxy_pass:静态路径、反向代理目标、重写规则等逻辑不能有差异,否则用户会看到不同页面或 502 错误
-
SSL 证书路径与密钥:若启用 HTTPS,
ssl_certificate和ssl_certificate_key指向的文件必须存在且内容一致,建议使用绝对路径并确保权限相同(如nginx:nginx可读)
VIP 漂移时 Virtual Host 依赖底层网络就绪
VIP 是由 Keepalived 动态绑定到物理网卡的(如 ens33:1),不是配置在 Nginx 里。Nginx 启动时只认本地 IP 和通配地址,只要:
- 主备服务器在同一子网,且 VIP 属于该网段(如主 192.168.1.10、备 192.168.1.11、VIP 192.168.1.100)
- Nginx 配置中未强制绑定到某个具体物理 IP(避免写成
listen 192.168.1.10:80) - Keepalived 成功绑定 VIP 后,执行
ip a能看到该地址出现在对应网卡别名上
此时 Nginx 就能通过 listen 80 自动响应发往 VIP 的所有请求,Virtual Host 的路由逻辑照常工作。
防“假活”:让 Virtual Host 真正可用才允许 VIP 漂移
Keepalived 默认只检测网络连通性,不关心 Nginx 是否真能处理 HTTP 请求。如果 Nginx 进程僵死、配置错误或 worker 全卡住,VIP 仍留在故障节点,Virtual Host 实际不可用。
必须配置自定义健康检查脚本,例如:
- 写一个
/opt/check_nginx.sh,用curl -I http://127.0.0.1/health或nginx -t && systemctl is-active --quiet nginx判断服务状态 - 在 Keepalived 配置中通过
vrrp_script调用该脚本,并在vrrp_instance VI_1中用track_script关联 - 脚本失败时,Keepalived 主动降低 priority,触发 VIP 漂移 —— 这样漂过去的,才是能真正跑起 Virtual Host 的健康节点
验证与调试建议
部署后快速确认 Virtual Host 在 VIP 下是否正常工作:
- 在客户端直接访问 VIP(如
curl -H "Host: example.com" http://192.168.1.100),观察返回内容是否符合预期 Virtual Host 配置 - 手动停掉主节点 Nginx(
systemctl stop nginx),等待 3 秒,再 curl VIP,应得到相同响应(来自备节点) - 在两台机器上分别给对应 Virtual Host 页面加微小标识(如 HTML 注释
<!-- WEB01-Master -->),便于切换时一眼识别当前服务节点











