Nginx均衡转发HTTPS请求应采用HTTPS终止+HTTP长连接池架构:客户端与Nginx间HTTPS终止,Nginx与后端间使用HTTP/1.1 keepalive连接池,并配置ssl_session_cache和ssl_session_tickets优化TLS会话复用。

要让 Nginx 均衡转发到后端 HTTPS 服务,同时复用连接、降低握手开销,关键不是简单加 proxy_pass https://,而是分两层处理:Nginx 与客户端之间做 HTTPS 终止(或透传),Nginx 与后端之间启用 HTTP/1.1 长连接池。直接代理 HTTPS 后端会失去连接复用能力,且无法控制后端连接行为。
明确代理模式:HTTPS 终止 + HTTP 长连接池
Nginx 通常作为 TLS 终止点,即它解密客户端 HTTPS 请求,再以明文 HTTP 协议转发给后端(即使后端本身也支持 HTTPS)。这样既能统一管理证书、实现会话复用,又能启用 keepalive 连接池。若必须直连后端 HTTPS(如后端强制要求加密内网通信),则需额外配置 SSL 连接池参数,但复用效率和调试难度显著上升。
- 推荐架构:客户端 ⇄ Nginx(HTTPS 终止) ⇄ 后端(HTTP,带 keepalive)
- 不推荐直连:客户端 ⇄ Nginx(HTTPS) ⇄ 后端(HTTPS)——此时 Nginx 无法复用到后端的 TLS 连接,每次请求都重建 TLS 握手
- 若必须后端 HTTPS,则需启用
proxy_ssl_*系列指令,并配合keepalive,但实际中极少需要
核心配置:upstream 中启用长连接池
在 upstream 块中定义后端时,必须显式设置 keepalive,并搭配正确的 HTTP 版本与头处理:
upstream api_backend {
server 10.0.0.20:8443; # 后端实际监听 HTTPS?不,这里应是 HTTP 端口(如 8080)
server 10.0.0.21:8080;
keepalive 64; # 每个 worker 进程维护最多 64 条空闲长连接
least_conn; # 长连接场景下比轮询更公平,避免某节点堆积大量连接
}
-
keepalive 64是连接池大小,不是总连接数;它指每个 worker 进程可缓存的空闲连接上限 - 值建议为:后端单实例平均并发连接数 × 1.2~1.5,过高浪费内存,过低导致频繁建连
-
least_conn调度算法比默认轮询更适合长连接,能感知各后端当前活跃连接数
location 中正确透传与协议升级
在 server 块的 location 中,需强制使用 HTTP/1.1 并清除 Connection 头,确保连接可复用:
location /api/ {
proxy_pass http://api_backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
<pre class="brush:php;toolbar:false;"># 超时控制(单位秒)
proxy_connect_timeout 15;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
-
proxy_http_version 1.1必须显式声明,否则默认 HTTP/1.0 不支持 keep-alive -
proxy_set_header Connection ""是关键:清空该头,防止客户端传来的Connection: close或keep-alive干扰 Nginx 与后端的连接复用逻辑 - 超时时间需与后端服务(如 Spring Boot 的
server.tomcat.connection-timeout)对齐,一般后端 timeout 应略大于proxy_read_timeout
HTTPS 层优化:启用会话复用减少 TLS 开销
虽然这是 Nginx 与客户端之间的 TLS 层,但它直接影响整体性能。务必开启 SSL 会话缓存与票证:
http {
ssl_session_cache shared:SSL:20m; # 共享内存缓存,20MB 可存约 8 万个会话
ssl_session_timeout 10m; # 会话有效期,10 分钟较平衡
ssl_session_tickets on; # 启用会话票证,进一步降低服务器计算负担
<pre class="brush:php;toolbar:false;"># 其他 TLS 安全加固(可选)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
}
-
shared:SSL:20m表示所有 worker 进程共享这块内存,避免多进程重复缓存同一会话 - 开启
ssl_session_tickets后,会话状态由客户端保存加密票据,Nginx 无需查表,适合横向扩展场景 - 这两项配合,能让 70% 以上的重复访问跳过完整 TLS 握手,首字节延迟下降明显











