必须显式配置proxy_http_version 1.1,因为Nginx默认以HTTP/1.0代理请求,而HTTP/1.0不支持长连接;设为1.1后才能启用Connection: keep-alive、复用TCP连接,并配合proxy_set_header Connection ""和upstream keepalive N实现连接池复用。

直接在 Nginx 的 location 块中设置 proxy_http_version 1.1,是启用后端长连接复用的必要前提——它告诉 Nginx 与上游服务器通信时使用 HTTP/1.1 协议,从而支持 Connection: keep-alive 行为。
为什么必须显式配置 proxy_http_version 1.1
Nginx 默认以 HTTP/1.0 代理请求,而 HTTP/1.0 不默认启用长连接。即使客户端发来 Connection: keep-alive,Nginx 若未升级协议版本,仍会按 HTTP/1.0 处理:响应头中不带 Keep-Alive 字段,且每次请求后主动关闭 TCP 连接。
只有设为 1.1,Nginx 才会:
- 在发往后端的请求中保留或主动添加
Connection: keep-alive - 理解并遵守后端返回的
Keep-Alive响应头(如timeout=60, max=100) - 将连接归还至 upstream 连接池,而非立即断开
配套关键配置不能少
单设 proxy_http_version 1.1 不足以真正复用连接,还需同步处理连接头和连接池:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
-
清除透传的 Connection 头:加上
proxy_set_header Connection "",避免把客户端的Connection: close或其他异常值传给后端,干扰其长连接判断 -
启用 upstream 空闲连接池:在
upstream块中配置keepalive N(例如keepalive 32),表示每个 worker 进程最多缓存 N 个空闲长连接供复用 -
确保后端服务支持 keep-alive:如 Tomcat 需开启
connectionTimeout并设为非 0 值;Node.js 的http.Server默认支持,但需确认未显式禁用
典型配置示例
以下是最小可行配置片段:
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
keepalive 32; # 启用后端连接池
}
<p>server {
location /api/ {
proxy_pass <a href="https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e">https://www.php.cn/link/65b5b8d1f89bf53a5713bc3afdd83e9e</a>;
proxy_http_version 1.1; # 关键:启用 HTTP/1.1
proxy_set_header Connection ""; # 关键:清空 Connection 头
proxy_set_header Host $host;
}
}</p>验证是否生效
可通过以下方式确认长连接已复用:
- 抓包观察:同一客户端 IP:Port 到后端某服务器的 TCP 连接,在多个 HTTP 请求间未断开(SYN/FIN 次数远少于请求数)
- 查看 Nginx 状态:启用
stub_status,关注Active connections和Reading/Writing/Waiting中 Waiting 数值是否稳定,而非剧烈波动 - 检查后端连接数:对比开启前后,后端
netstat -an | grep :8000 | wc -l的 ESTABLISHED 连接数是否显著下降










