nginx在云lb后应配置为http后端,禁用ssl监听,通过x-forwarded-proto识别原始https协议,并信任云内网ip段还原真实客户端ip;需透传协议头给下游应用,避免重定向循环与hsts误配。

Nginx 在云平台负载均衡(如阿里云 SLB、腾讯云 CLB、AWS ALB/NLB)后配置 HTTPS 终端卸载,关键在于明确 SSL 终止位置——此时 Nginx 不再直接面向公网,而是作为后端服务器接收云 LB 转发的 HTTP 流量。SSL 卸载由云平台完成,Nginx 只需处理纯 HTTP 请求,但必须正确适配信任头、协议识别与安全转发逻辑。
云平台侧 SSL 终止是前提
云厂商的负载均衡器支持在监听层配置 HTTPS:上传证书、启用 TLS 协议、设置重定向(HTTP→HTTPS)。所有入站 HTTPS 请求在此解密,之后以明文 HTTP(或 HTTP/2)转发至后端 Nginx 服务器(通常走内网 IP + 端口,如 10.0.1.10:80)。这意味着:
- Nginx 本机无需配置
ssl_certificate和ssl_certificate_key - 若错误开启 Nginx 的
listen 443 ssl,会导致连接拒绝或 502 错误 - 后端通信走内网,不暴露 HTTPS,也无需 Nginx 再做加解密,节省 CPU 资源
Nginx 必须识别“实际 HTTPS 请求”
虽然 Nginx 收到的是 HTTP 请求,但用户原始请求是 HTTPS。若应用依赖 https:// 协议生成跳转链接、Cookie 安全标记(Secure)、CSRF Token 判断等,Nginx 需通过云 LB 添加的头部还原原始协议信息。主流云平台默认透传以下关键头:
-
X-Forwarded-Proto: https -
X-Forwarded-For: <client_ip></client_ip> -
X-Real-IP: <client_ip></client_ip>
在 server 块中启用信任并重写协议判断:
set $the_scheme $scheme;
if ($http_x_forwarded_proto = 'https') {
set $the_scheme https;
}
# 或更稳妥:使用 map 指令(推荐,避免 if 在 location 外滥用)
map $http_x_forwarded_proto $real_scheme {
default $scheme;
https https;
}
然后在响应头、重定向或 proxy_pass 中使用 $real_scheme。
正确配置反向代理与信任链
当 Nginx 后端还接有应用服务器(如 Node.js、Django),需确保它把原始协议和客户端 IP 透传下去:
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $real_scheme; # 关键:告诉后端“用户是走 HTTPS 来的”
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port 443; # 可选,配合后端端口感知
proxy_pass http://backend_app;
}
同时,在 http 块顶部添加:
# 显式声明可信代理(云 LB 内网 IP 段) set_real_ip_from 10.0.0.0/8; # 阿里云 VPC 内网段 set_real_ip_from 172.16.0.0/12; set_real_ip_from 192.168.0.0/16; real_ip_header X-Forwarded-For; real_ip_recursive on;
这样 $remote_addr 才会变成真实客户端 IP,而非云 LB 的内网出口 IP。
安全加固与常见陷阱
-
禁用 HSTS 头(除非云 LB 已统一配置):Nginx 不应自行加
Strict-Transport-Security,否则可能因证书非由 Nginx 管理而引发浏览器警告 -
Cookie Secure 标志需后端控制:Nginx 无法自动给 Cookie 加
Secure,必须由应用根据X-Forwarded-Proto判断后设置 -
避免重复重定向循环:检查是否在 Nginx 中写了
return 301 https://$host$request_uri;——云 LB 已做 HTTP→HTTPS 重定向,此处再跳将导致死循环 -
健康检查路径保持 HTTP:云 LB 对 Nginx 的健康检查走 HTTP(如
/healthz),Nginx 必须开放对应location且返回 200
不复杂但容易忽略











