高可用架构中nginx虚拟主机配置核心是确保其随主备切换稳定运行、服务无感知,需做到配置可复用、域名解析不依赖单点、故障切换无缝;采用模块化管理(sites-available/sites-enabled)、基于域名的server_name匹配vip、同步配置与路径、配合keepalived健康检查真实服务状态。

高可用架构里配 Nginx 虚拟主机,核心不是“单独配好一个站点”,而是让虚拟主机配置能随高可用机制稳定运行、不因主备切换失效。重点在于三点:配置可复用、域名解析不依赖单点、故障切换时服务无感知。
虚拟主机配置本身要独立且可同步
别把所有 server 块堆在主配置文件里。推荐用模块化方式管理:
- 把每个站点的虚拟主机配置单独写成文件,比如 /etc/nginx/sites-available/www.site1.com
- 在 /etc/nginx/nginx.conf 的 http 块末尾加一行:include /etc/nginx/sites-enabled/*;
- 用软链接启用配置:ln -s /etc/nginx/sites-available/www.site1.com /etc/nginx/sites-enabled/
- 主备两台 Nginx 服务器上,保持 sites-available 和 sites-enabled 内容完全一致(可通过 rsync 或配置中心自动同步)
server_name 必须匹配实际访问方式
高可用场景下,用户访问的是 VIP(虚拟 IP)或统一域名,所以虚拟主机不能只靠 IP 或端口区分:
- 用基于域名的虚拟主机(server_name www.example.com;),这是最常用也最稳妥的方式
- 确保 DNS 解析指向 VIP,而不是某台具体 Nginx 的 IP;Keepalived 切换 VIP 时,域名仍生效
- 避免用 server_name _; 或空值作为兜底,否则可能被恶意请求命中默认站点
- 如需泛域名支持(如 *.example.com),用 server_name ~^([a-z0-9\-]+)\.example\.com$; 并配合 map 指令做路径映射
配合 Keepalived 时注意配置热加载与健康检查
虚拟主机本身不参与高可用决策,但它的状态会影响 Keepalived 的判断:
- Keepalived 的 check 脚本应检测真实服务(比如 curl -I http://127.0.0.1/healthz),而不是只 ping 端口——因为 Nginx 进程活着,但某个虚拟主机配置错误导致 500,服务其实已不可用
- Nginx 配置更新后,用 nginx -t && nginx -s reload,reload 不中断连接,适合高可用环境
- 主备机上的 worker_processes、worker_connections 等参数建议一致,避免切换后性能抖动
- 日志路径、root 目录等路径必须在两台机器上结构相同(或挂载同一共享存储),否则 reload 后静态资源找不到
扩展建议:大流量或多租户场景下的优化
如果虚拟主机数量多(几十上百),基础配置容易出问题:
- 调大哈希表容量:server_names_hash_bucket_size 512; 和 server_names_hash_max_size 8192;,防止 server_name 过多时报错
- 用 map 指令动态映射 root 路径,减少重复 server 块,例如根据 $host 自动指向 /var/www/$host
- 把 access_log 和 error_log 写入远程日志系统(如 rsyslog + ELK),避免主备切换后日志断层











