nginx 后端长连接需在 upstream 块配 keepalive n,location 块配 proxy_http_version 1.1 和 proxy_set_header connection "",三者缺一不可;keepalive_timeout 和 keepalive_requests 仅作用于客户端连接,不影响 upstream。

Linux 中 Nginx 默认不启用长连接,client → nginx 和 nginx → upstream 两条链路都默认走短连接;不显式配置,后端服务会频繁重建 TCP 连接、TLS 握手,QPS 上不去,TIME_WAIT 暴涨,WebSocket 更是直接断连。
client 到 Nginx 的长连接怎么开
这一层不需要加 proxy_set_header,只要客户端发的是 HTTP/1.1 请求且没带 Connection: close,Nginx 就默认复用连接。但必须调两个关键参数:
-
keepalive_timeout:空闲多久关闭连接,默认 75 秒,建议设为keepalive_timeout 7200(2 小时)或按业务心跳周期设 -
keepalive_requests:单个连接最多处理多少请求,默认 100,高并发场景建议设为10000以上,否则连接刚复用几次就被强制断开
漏掉 keepalive_requests 是最常见误操作——只改了超时时间,结果连接被“用完即弃”,完全起不到复用效果。
nginx 到 upstream 的长连接必须显式启用
Nginx 默认向上游发 HTTP/1.0 请求,哪怕后端支持 keep-alive,Nginx 也不会复用连接。必须在 location 块中加两行:
-
proxy_http_version 1.1:强制使用 HTTP/1.1,否则 upgrade、keep-alive 都无效 -
proxy_set_header Connection "":注意是空字符串,不是"keep-alive";填字符串可能被后端误解为要关闭连接
如果 upstream 是 Node.js/Go 等自研服务,确保它响应头里有 Connection: keep-alive(多数框架默认返回,但需确认);否则 Nginx 下次仍会新建连接。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
upstream 块里的 keepalive 参数怎么设
这个 keepalive 是每个 worker 进程维护的「空闲连接池大小」,单位是连接数,和 keepalive_requests 完全无关:
-
keepalive 32表示每个 worker 最多缓存 32 个空闲到该 upstream 的连接 - 初始值建议按
(预估峰值并发 / worker_processes) × 1.2计算;比如并发 5000、4 个 worker,就设keepalive 1500 -
keepalive_requests 10000推荐设高些(默认 100 太保守),避免连接过早释放;但别远超实际,否则空闲连接长期占资源 -
keepalive_timeout 60s控制空闲连接存活时间,比 client 端的keepalive_timeout略小即可,避免上游提前断连
很多人把 upstream keepalive 当成全局连接数,结果设太小导致连接池打满,新请求被迫建新连接——这是性能瓶颈的典型诱因。
WebSocket 长连接必须额外透传 Upgrade 头
WebSocket 握手依赖 Upgrade: websocket 和 Connection: Upgrade,而这两个是 hop-by-hop 头,Nginx 默认丢弃。只配 proxy_http_version 1.1 不够,还必须:
proxy_set_header Upgrade $http_upgrade-
proxy_set_header Connection $connection_upgrade(配合map指令动态生成) -
proxy_buffering off:开启会导致帧粘包或延迟 -
proxy_read_timeout 86400、proxy_send_timeout 86400:默认 60 秒,不够 WebSocket 心跳间隔
用 $http_connection 替代 "upgrade" 是错的——客户端发来的是 Connection: Upgrade, keep-alive,Nginx 会清理掉 Upgrade 后只转发 keep-alive,后端根本收不到升级意图。










