要真正开启Nginx与后端服务器之间的HTTP长连接,必须同时配置proxy_http_version 1.1、proxy_set_header Connection ""和upstream keepalive N。

要真正开启 Nginx 与后端服务器之间的 HTTP 长连接,仅设置 proxy_http_version 1.1 是不够的——它只是必要前提,必须配合另外两项关键配置,三者缺一不可。
为什么必须显式写 proxy_http_version 1.1
Nginx 默认以 HTTP/1.0 代理请求,而 HTTP/1.0 不支持长连接语义。即使客户端发来 Connection: keep-alive,Nginx 若未升级协议版本,仍会:
- 忽略 keep-alive 指示,不向后端发送该头
- 每次请求后主动关闭 TCP 连接
- 无法识别或响应后端返回的 Keep-Alive: timeout=60, max=100 等字段
设为 1.1 后,Nginx 才能:
- 主动在转发请求中带上 Connection: keep-alive
- 正确解析后端的 keep-alive 响应头
- 将空闲连接交还给 upstream 连接池复用
配套的两个强制配置项
只加 proxy_http_version 1.1 会导致连接仍被频繁断开,必须同步完成以下两项:
-
清除透传的 Connection 头:添加
proxy_set_header Connection "",避免把客户端可能携带的Connection: close或其他异常值传给后端,干扰其长连接判断 -
启用 upstream 连接池:在
upstream块中配置keepalive N(例如keepalive 32),表示每个 worker 进程对每个后端 server 最多缓存 N 个空闲长连接
完整配置示例
以下是最小可用配置,可直接套用:
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;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}注意:keepalive 32 写在 upstream 块内才生效;proxy_set_header Connection "" 中的引号内为空字符串,不能省略或写成 "keep-alive"。
验证是否成功启用
可通过以下方式确认长连接已实际复用:
- 使用
tcpdump或 Wireshark 抓包:观察同一客户端 IP:Port 到某台后端的 TCP 连接,在多个 HTTP 请求间未出现重复的 SYN/FIN - 在后端服务器执行
netstat -an | grep :8000 | grep TIME_WAIT | wc -l:若数值明显下降,说明短连接大幅减少 - 检查 Nginx access log 中的
$upstream_http_connection变量(需开启日志变量支持),确认响应头中含keep-alive


















