nginx必须通过tls终止(ssl卸载)实现https解密转发,即持有并配置域名证书与私钥,在443端口解密后以http明文转发至内网服务,同时设置x-forwarded-proto、x-real-ip等头信息,并禁用二次tls握手。

直接让 Nginx 在边缘层终止 HTTPS,解密后以 HTTP 明文转发给内网服务——这是最主流、最高效的做法,不需要后端再处理证书或 TLS。
必须在 Nginx 上完成 TLS 终止
Nginx 不能“透传并解密”HTTPS 流量;它只能选择:要么做 TLS 终止(即自己持有证书、解密、再转发),要么做 TLS 透传(不看内容、不解密、原样转发)。要实现“解密后转发”,必须启用 SSL 终止。
- 准备有效的域名证书(如
example.com.crt)和对应私钥(example.com.key),可由 Let’s Encrypt 签发或企业 CA 颁发 - 确保 Nginx 编译时已启用
http_ssl_module(主流发行版默认开启) - 在
server块中监听443 ssl http2,并正确指定ssl_certificate和ssl_certificate_key
转发时保留原始协议与客户端信息
后端服务虽走 HTTP,但仍需知道请求原本是 HTTPS、来自哪个真实 IP,否则重定向、安全判断会出错。
- 设置
proxy_set_header X-Forwarded-Proto https(若只走 HTTPS 入口,可固定写死) - 添加
proxy_set_header X-Real-IP $remote_addr和proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for - 务必开启
proxy_set_header Host $host,避免后端因 Host 头缺失而路由失败
内网转发目标用 HTTP 协议地址
既然已在 Nginx 层完成解密,后续链路处于可信内网环境,应避免重复加解密开销,全部使用 HTTP 明文通信。
-
proxy_pass指向后端时,地址必须以http://开头,例如http://192.168.1.100:8080或http://service-gateway - 不要写成
https://,否则会触发二次 TLS 握手,浪费 CPU 且可能因证书不可信失败 - 建议配置
upstream并启用keepalive,复用连接降低延迟
安全与性能配套配置不可省略
仅解密还不够,还需保障握手效率、协议合规和策略统一。
- 强制跳转:在 80 端口 server 块中加
return 301 https://$host$request_uri; - 启用现代 TLS:限制为
TLSv1.2及以上,禁用弱密码套件,开启ssl_session_cache shared:SSL:10m提升会话复用率 - 开启 OCSP Stapling 和 HSTS(
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains")











