SSL终止点必须唯一设在云LB层,Nginx仅监听HTTP端口且禁用ssl指令;LB需透传X-Forwarded-Proto头,Nginx须信任该头并禁用自身HTTPS重定向;LB与Nginx间应使用HTTP而非HTTPS通信,避免双TLS引发兼容性问题。

排查云厂商负载均衡(如阿里云SLB、腾讯云CLB、AWS ALB)到 Nginx 的 SSL 卸载问题,核心是厘清 TLS 终止位置是否明确、头信息是否可信传递、以及链路各环节是否一致。常见故障表现为 400 错误、跳转错乱(HTTP ↔ HTTPS 混乱)、后端无法识别安全上下文、或响应时间突增。以下从三个关键层面切入:
一、确认 SSL 终止点是否唯一且在云 LB 层
若云厂商 LB 已配置 HTTPS 监听并上传证书,则它应完成 TLS 终止,向后端 Nginx 发送明文 HTTP 请求(即 LB → Nginx 是 HTTP)。此时 Nginx 的 server 块不应监听 443 ssl,也不应配置 ssl_certificate;否则会因收到明文却按 HTTPS 解析而报 SSL_ERROR_RX_RECORD_TOO_LONG。
- 检查云 LB 控制台:确认监听协议为 HTTPS,后端转发协议为 HTTP(非 HTTPS),目标端口通常是 Nginx 的 80 或自定义 HTTP 端口(如 8080)
- 检查 Nginx 配置:server 块中仅需
listen 80;或listen 8080;,删除所有 ssl_* 指令 - 验证方式:直接 curl 云 LB 的公网域名,同时抓包或查看 Nginx access_log 中的
$scheme和$http_x_forwarded_proto—— 正常应为http和https
二、确保可信头信息正确透传
云 LB 默认会添加 X-Forwarded-Proto: https 和 X-Forwarded-For,但部分厂商需手动开启“透传客户端协议”或“保留原始请求头”。Nginx 必须信任并使用这些头,否则后端业务会误判为非 HTTPS 请求。
- 在 Nginx 的 location 或 server 块中显式设置:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;proxy_set_header X-Forwarded-For $http_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr; - 若后端依赖
request.is_secure()或类似逻辑,务必检查它是否读取X-Forwarded-Proto而非直接看scheme - 禁用 Nginx 自动重定向:移除
return 301 https://$host$request_uri;类配置,避免与 LB 的 HTTPS 强制跳转冲突
三、排查 LB 与 Nginx 之间连接异常
云 LB 到 Nginx 若走 HTTPS(即双 TLS 终止),不仅增加延迟,还易引发证书链、SNI、ALPN 不一致等问题。绝大多数场景下应避免。
- 检查 LB 后端健康检查:探测路径应为 HTTP(如
GET /health),状态码设为 2xx,不要启用 TLS 验证(否则 LB 会尝试握手,而 Nginx 若未开 443 ssl 就会失败) - 检查 Nginx 日志中的
$upstream_connect_time和$upstream_header_time:若连接耗时高,可能是 LB 与 Nginx 网络策略(如安全组、ACL)未放行对应端口,或 Nginx worker 连接数达上限 - 验证 LB 是否启用了 HTTP/2:若启用,而 Nginx 版本低于 1.9.5 或未编译
--with-http_v2_module,可能导致连接复位;建议 LB 侧降级为 HTTP/1.1 测试











