Nginx双机热备必须配置完全一致(除极少数本地化项),包括主配置及所有include文件、listen端口、server_name、root路径、location规则、upstream定义、SSL设置等,需通过sha256sum校验;推荐统一路径软链、分离可变项、CI/CD自动化同步,并添加节点标识页验证切换效果。

Nginx 双机热备架构下,配置不一致会导致切换后服务异常——比如页面错乱、502 错误、跳转路径不同或静态资源 404。这不是“看起来一样就行”,而是必须逐字对齐的硬性要求。
Nginx 配置必须完全相同(除极少数本地化项)
两台机器的 /etc/nginx/nginx.conf 及所有 include 的子配置(如 conf.d/*.conf、sites-enabled/*)需内容一致。重点包括:
-
listen端口、server_name、root路径、index文件名 -
location块中的匹配规则、proxy_pass地址、重写逻辑 - 若用作反向代理,
upstream定义、max_fails、fail_timeout、proxy_next_upstream策略必须完全一致 - SSL 证书路径、密钥权限、TLS 版本与加密套件设置
可借助校验和快速验证:
# 在两台机器上分别执行
sha256sum /etc/nginx/nginx.conf $(grep -r "include" /etc/nginx/nginx.conf | awk '{print $2}' | sed 's/;//')输出结果应完全一致。
用符号链接 + 统一路径规避环境差异
避免在不同节点硬编码路径(如 /var/www vs /usr/share/nginx/html)。推荐统一根路径为 /srv/www/{app}/public,并通过软链指向实际部署目录:
ln -sf /opt/apps/myapp/current/public /srv/www/myapp/public
Nginx 配置中始终写 root /srv/www/myapp/public;,不拼接变量、不加条件判断。
分离可变项,保留配置主体纯净
把真正需要区分的项(如日志路径、worker_processes 数量、本地监控接口)抽离到独立文件,例如:
-
/etc/nginx/conf.d/local.conf(仅包含access_log /var/log/nginx/app1_access.log;) - 所有节点该文件内容可不同,但主配置中不嵌入逻辑分支
这样主配置文件本身仍是“一份源码”,不会因环境不同而产生 diff。
自动化同步机制不可依赖手工复制
禁止通过 scp 或 rsync 手动推配置。应纳入 CI/CD 流程:
- 修改配置提交至 Git 仓库
- 流水线自动校验语法(
nginx -t) - 成功后并发部署到主备两台机器(如 Ansible Playbook 或 SaltStack State)
- 部署完成触发
systemctl reload nginx
同时记录每次变更的 commit hash 到 /etc/nginx/VERSION,便于故障时快速比对。
加标识页辅助人工验证切换效果
在默认首页中嵌入节点标识,例如:
- 主节点:
<h1>WEB01 — MASTER</h1> - 备节点:
<h1>WEB02 — BACKUP</h1>
访问 VIP 时看到对应标识,说明当前服务来自预期节点;切换后标识应随之变化,是配置生效的最直观证据。
不复杂但容易忽略


















