Nginx集群SSL卸载需前端节点统一TLS终止、后端仅处理HTTP;证书须集中管理(共享存储或自动化同步);配置需一致(会话缓存、OCSP、HSTS);健康检查与日志需适配明文链路。

在 Nginx 集群中配置 SSL 卸载与分发,核心是让前端 Nginx 节点统一处理 TLS 终止,后端服务只收明文 HTTP 请求,同时确保证书管理可集中、可同步、可滚动更新。这不是单台 Nginx 的简单复制,而是涉及集群协调、证书分发路径、健康状态感知和配置一致性的问题。
前端节点必须启用标准 SSL 卸载配置
每台作为入口的 Nginx 节点(如负载均衡层)都需独立完成 TLS 解密,并透传关键上下文:
- 监听必须明确写
listen 443 ssl;(Nginx 1.15+ 不再支持ssl on) -
proxy_pass必须指向http://后端地址,例如http://backend_pool,确保卸载真实发生 - 强制透传协议头:
proxy_set_header X-Forwarded-Proto $scheme;,避免后端误判为 HTTP 请求 - 完整传递客户端 IP:
proxy_set_header X-Real-IP $remote_addr;和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - 禁用 TLSv1.0/1.1,仅启用
TLSv1.2 TLSv1.3;密钥套件优先选用 ECDHE-ECDSA 或 ECDHE-RSA 加 AES-GCM 类型
证书集中管理与自动分发机制
集群中多节点共用同一域名证书时,不能靠人工逐台上传。推荐两种可靠路径:
-
共享存储挂载:将证书目录(如
/etc/nginx/certs/)通过 NFS 或云盘挂载到所有 Nginx 节点,修改权限为644(证书)和600(私钥),配置中直接引用统一路径 -
自动化部署工具同步:使用 Ansible、SaltStack 或 CI/CD 流水线,在 Let’s Encrypt 更新证书后,自动推送到所有节点的指定目录,并触发
nginx -t && nginx -s reload - 若使用 Certbot,可在
--deploy-hook中编写分发脚本,例如调用 rsync 或 API 更新各节点证书文件
集群内配置一致性与热更新保障
避免因某台节点配置滞后或证书过期导致 TLS 握手失败:
- 所有节点使用完全相同的 server 块结构,包括
ssl_session_cache shared:SSL:10m;和ssl_session_timeout 4h;,保证会话复用跨节点有效 - 启用 OCSP Stapling(
ssl_stapling on; ssl_stapling_verify on;),并确保各节点能访问 CA 的 OCSP 响应服务器(防火墙放行) - 配置 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;,由前端统一注入,后端无需感知 - 证书轮换时,先验证新证书在一台节点生效,再批量 reload 其余节点;reload 应使用
systemctl reload nginx而非 restart,避免连接中断
后端服务与健康检查协同设计
集群稳定性依赖于后端识别真实请求来源及健康探测不被协议干扰:
- upstream 块中 server 地址必须是
http://10.0.1.x:8080,严禁出现https://,否则形成“假卸载” - 健康检查接口(如
location /health { return 200; })必须走 HTTP,且响应头不含重定向,否则会被误判为故障 - 开启错误转移:
proxy_next_upstream error timeout http_502;,单台后端异常时流量秒级切至其他实例 - 日志格式中加入
$http_x_forwarded_proto和$upstream_http_x_forwarded_proto,便于快速定位“HTTPS 请求被后端跳回 HTTP”的链路断裂点


















