proxy_http_version 1.1 是启用 upstream 长连接复用的强制前提,因 Nginx 默认以 HTTP/1.0 向后端发起请求,即使客户端使用 HTTP/1.1,不显式配置该指令则后端无法进入 Keep-Alive 流程;必须配合 proxy_set_header Connection ''; 清除客户端传入的 Connection 头,避免干扰,并在 upstream 块中同步配置 keepalive、keepalive_timeout 和 keepalive_requests 才能生效。

要让 Nginx 与后端服务之间复用 TCP 连接,必须确保双方使用 HTTP/1.1 协议通信,而 proxy_http_version 1.1 就是这个环节的强制开关——它不只声明版本,更是启用长连接复用的前提条件。
为什么 proxy_http_version 1.1 是必需的
HTTP/1.0 默认关闭长连接,每次请求都新建连接;HTTP/1.1 默认启用持久连接(Keep-Alive),但前提是代理明确告知后端“我按 1.1 规则说话”。Nginx 默认向上游发的是 HTTP/1.0 请求,即使客户端用了 1.1,不显式配置该指令,后端仍会收到 1.0 请求头,无法进入长连接流程。
简单说:没有 proxy_http_version 1.1,upstream 的 keepalive 配置就完全失效。
必须同步清除 Connection 头
仅设 1.1 不够,还需配合:
proxy_set_header Connection '';
这是因为客户端请求中可能带 Connection: close 或 Connection: keep-alive,Nginx 若原样转发,会干扰后端对连接复用的判断。清空该头后,Nginx 才能按自身 upstream 配置(如 keepalive 数量、超时)自主管理连接生命周期。
- 不要写成
proxy_set_header Connection "keep-alive"—— 这反而可能触发后端兼容逻辑或被中间设备拦截 - 也不要遗漏分号,否则配置不生效
- 该指令需放在 location 或 server 块中,作用于实际代理请求
配套 upstream 长连接配置不能少
在 upstream 块中,必须显式启用连接池:
- keepalive 32;:每个 worker 进程最多缓存 32 个空闲到该后端的连接(建议从 32 起步,高并发可调至 128)
- keepalive_timeout 60s;:空闲连接在 Nginx 端保留最长 60 秒(超时即关闭,避免堆积)
- keepalive_requests 1000;:单个长连接最多承载 1000 次请求(防止单连接长期占用、资源泄漏)
注意:这些参数和 proxy_http_version 1.1 必须同时存在,缺一不可。
验证是否生效的简单方法
用 curl 模拟请求并观察响应头和连接行为:
- 检查后端响应是否含
Connection: keep-alive(说明后端认可长连接) - 用
netstat -an | grep :后端端口 | grep ESTABLISHED查看 Nginx 与后端之间是否有稳定复用的连接,而非大量短连 TIME_WAIT - 对比开启前后,后端新建连接数、TLS 握手耗时、首字节延迟等指标变化
不复杂但容易忽略。


















