Nginx双机热备安全访问控制的核心是让安全策略随VIP高可用:监听必须绑定VIP端口(如listen 80;),证书路径、限流/黑白名单配置、SSL加固、健康检查脚本均需主备严格一致。

在 Nginx 双机热备环境中做安全访问控制,核心是“不因高可用架构削弱安全防护”,既要保障 VIP 切换时策略一致性,又要避免因主备同步滞后或配置偏差导致防护空窗。关键不在单独加规则,而在让安全策略随服务一起高可用。
确保安全策略与 VIP 绑定一致
Keepalived 管理的虚拟 IP(VIP)是客户端唯一入口,所有访问控制必须作用于 VIP 所在的监听端口(如 listen 80; 或 listen 443 ssl;),而非物理 IP。若在 server 块中错误绑定物理地址(如 listen 192.168.1.123:80;),VIP 切换后该配置将失效,规则形同虚设。
- 正确写法:使用通配或默认监听,例如 listen 80; 或 listen *:443 ssl;
- 验证方式:在主备机分别执行 nginx -t 后,用 ss -tlnp | grep :80 确认监听的是 *:80,而非具体 IP
- 特别注意:若启用 SSL,证书和密钥路径必须在两台机器上完全一致(建议存于相同绝对路径,如 /etc/nginx/ssl/),否则 VIP 切换后 HTTPS 会报错
限流与访问控制需共享状态或独立生效
Nginx 的 limit_req_zone 和 allow/deny 规则本身不跨节点同步。主备机各自维护独立状态,这既是限制也是优势——只要配置一致,切换后策略立即生效,无需额外同步机制。
- IP 限流(如防暴力登录):使用 $binary_remote_addr 作为 key,zone 存于本地共享内存。主备机各自计数,虽非全局统一,但单节点已能有效抑制攻击流量;若需强一致性,应前置 WAF 或用 Redis 集中式限流(Nginx + lua-resty-redis)
- 黑白名单控制:将 allow/deny 写在 http 或 server 块中,确保两台配置文件完全一致。推荐用 include 引入统一的 ip_whitelist.conf 文件,便于集中维护
- location 级细粒度控制:例如对 /admin/ 启用 basic auth 或 IP 白名单,这类规则直接嵌入 location,切换后自动继承,无需额外处理
SSL/TLS 与隐藏信息需双机严格对齐
安全加固配置若只在主节点设置,备节点接管后可能暴露版本号、使用弱协议,形成安全断层。
- 在 http { } 块中统一设置:server_tokens off;(隐藏 Nginx 版本)、add_header X-Content-Type-Options nosniff;、add_header X-Frame-Options DENY;
- 在 server { ssl on; } 块中强制协议与加密套件:ssl_protocols TLSv1.2 TLSv1.3;,禁用 SSLv3/TLSv1.0;ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
- 证书更新后,必须同步到两台机器的相同路径,并执行 nginx -t && nginx -s reload,切忌只重载主节点
健康检查脚本要兼顾安全逻辑
Keepalived 的 vrrp_script 不仅判断 Nginx 进程是否存在,还可集成基础安全探活,防止服务“活着但已被攻陷”。
- 示例检测脚本(/etc/keepalived/check_nginx_secure.sh):
#!/bin/bash # 检查 Nginx 是否响应且返回预期状态码 STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/healthz) if [ "$STATUS" != "200" ]; then exit 1 fi # 可选:检查敏感路径是否被意外开放(如 /phpinfo.php) SENSITIVE=$(curl -s -I http://127.0.0.1/phpinfo.php | head -1 | grep "200\|301\|302") if [ -n "$SENSITIVE" ]; then exit 1 fi - 在 keepalived.conf 中调用:vrrp_script chk_nginx_secure { script "/etc/keepalived/check_nginx_secure.sh"; interval 3; weight -5; }
- 该脚本失败时降低优先级,触发切换,把异常服务节点隔离出去


















