Nginx upstream 必须显式启用 HTTP/1.1:在 location 块中配置 proxy_http_version 1.1 和 proxy_set_header Connection "",并在 upstream 块中设置 keepalive(如 keepalive 32),配合 keepalive_timeout 和 keepalive_requests 控制连接池生命周期。

nginx → upstream 必须显式启用 HTTP/1.1
Nginx 默认向上游发 HTTP/1.0 请求,哪怕后端支持 keep-alive,连接也用一次就断。不改协议版本,keepalive 指令完全无效。
- 必须在
location块中加proxy_http_version 1.1; - 不能写在
upstream或server块里——Nginx 会忽略或报错 - HTTP/1.0 不带语义化的持久连接机制,
Connection: keep-alive是 HTTP/1.1 才正式定义的
Connection 头必须清空,不是设成 keep-alive
proxy_set_header Connection "" 这一行极容易写错。填 "keep-alive" 反而会让后端误判为“客户端要关闭连接”,直接断连。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 空字符串
""的作用是清除客户端传来的Connection: close等干扰头 - 不加这行,Nginx 默认透传原始
Connection头,上游服务看到close就立刻关连接 - 不需要、也不应该加
proxy_set_header Keep-Alive—— 这是客户端行为,Nginx 不生成该头
upstream 块里的 keepalive 是连接池大小,不是全局数
keepalive 32 不代表整个 upstream 最多 32 个连接,而是每个 worker 进程对每台后端最多缓存 32 个空闲连接。
- 必须写在
upstream块内,且该块必须定义在http块下;写在server或location中会报unknown directive "keepalive" - 若你有 4 个
worker_processes、2 台后端服务器,理论最大空闲连接数是4 × 2 × 32 = 256 - 数值不是越大越好:Go 默认
MaxIdleConnsPerHost=2,Nginx 设 100 就连不上;Node.js 默认不限,但设太高可能触发EMFILE
keepalive_timeout 和 keepalive_requests 控制的是 upstream 连接池生命周期
这两个参数从 Nginx 1.15.3+ 才真正作用于 upstream 长连接池;老版本(如 1.12)设了也无效。
-
keepalive_timeout 60s:池中空闲连接最长存活 60 秒,超时即关闭;建议比后端connectionTimeout小 5–10 秒 -
keepalive_requests 1000:单个空闲连接最多转发 1000 次请求后强制关闭,防状态泄漏;默认 100 太保守 - 它们和
http块下的同名参数无关——后者只管 client → nginx 这段
ss -tnp | grep :8080 输出里同一对 IP:PORT 是否持续复用;如果 ESTABLISHED 连接数随请求量线性上涨,八成是 proxy_set_header Connection "" 漏了,或者后端没返回 Connection: keep-alive。

















