nginx实现https负载均衡的核心是ssl终止+http长连接池:监听443端口并配置证书,upstream中使用http://地址+keepalive,proxy_pass指向http后端,禁用直连https后端以保障连接复用。

直接配置轮询负载均衡 + SSL 终止,核心是两件事:Nginx 解密 HTTPS 请求(SSL 终止),再以 HTTP 协议、长连接方式分发到后端——不是把 HTTPS 请求原样转发过去。
1. 启用 SSL 终止并监听 443 端口
在 server 块中开启 HTTPS 监听,加载证书,并关闭不必要的 TLS 特性(如旧协议):
- 使用 listen 443 ssl,指定证书与私钥路径
- 设置 ssl_protocols TLSv1.2 TLSv1.3,禁用不安全协议
- 启用会话复用:ssl_session_cache shared:SSL:10m; ssl_session_timeout 4h;
- 添加必要头信息,确保后端能识别真实客户端:proxy_set_header X-Forwarded-Proto https; 和 X-Real-IP
2. 定义 HTTP 后端轮询组(upstream)
后端服务应监听 HTTP(如 8080、9000),不要配成 HTTPS 地址;连接池和调度策略在此定义:
- 每个 server 行写 HTTP 地址,例如 server 10.0.1.10:8080;
- 加上 keepalive 32; 开启连接池(每 worker 最多缓存 32 条空闲连接)
- 用 least_conn; 替代默认轮询,更适合长连接场景,避免某台后端堆积大量活跃连接
- 若后端性能差异大,可加 weight=2 等参数调节流量比例
3. 在 location 中代理到 upstream
proxy_pass 指向 upstream 名称,且必须用 HTTP 协议前缀(http://backend),不能写 https://:
- proxy_pass http://backend; —— 这是关键,表示走内部 HTTP 长连接
- 保留 HTTP/1.1 并强制 keepalive:proxy_http_version 1.1; proxy_set_header Connection '';
- 设置超时防止连接僵死:proxy_connect_timeout 5s; proxy_read_timeout 60s;
4. 不要踩的坑
常见错误配置会破坏连接复用或导致握手开销飙升:
- 后端地址写成 https://10.0.1.10:8443 —— 这会让 Nginx 每次都新建 TLS 连接,无法复用
- upstream 里漏掉 keepalive 指令 —— 默认无连接池,等价于每次请求都建新 TCP 连接
- 没设 proxy_http_version 1.1 和清空 Connection 头 —— HTTP/1.0 或 Connection: close 会禁用 keepalive
- 证书路径错误或权限不足,导致 Nginx 启动失败或 400 错误











