要让nginx在企业级大并发长连接场景下真正发挥多路复用网关能力,核心是分清客户端连接复用、后端连接复用和协议层多路复用三层逻辑:http/1.1靠keep-alive实现连接复用,http/2才支持单连接并发多请求的真正多路复用,stream模块则用于tcp/udp非http协议复用,三者目标一致但配置路径不同。

要让 Nginx 在企业级大并发长连接场景下真正发挥多路复用网关能力,核心不是堆参数,而是分清“客户端连接复用”“后端连接复用”和“协议层多路复用”三层逻辑——HTTP/1.1 的 keep-alive 是连接复用,HTTP/2 才是真正的多路复用(单连接并发多请求),而 stream 模块的 TCP 复用则适用于非 HTTP 协议。三者目标一致:降握手、减延迟、控资源,但配置路径完全不同。
明确协议选型:HTTP/1.1 还是 HTTP/2?
HTTP/1.1 的长连接只能串行或半并行处理请求(受队头阻塞限制),而 HTTP/2 支持单 TCP 连接上多个请求/响应帧并发传输,这才是高并发下真正的“多路复用”。企业级网关应优先启用 HTTP/2:
- SSL/TLS 必须开启:HTTP/2 要求 TLS(主流浏览器强制),配置中需含 ssl_certificate 和 ssl_certificate_key
- listen 指令加 http2:例如 listen 443 ssl http2;,仅加 ssl 不等于启用 HTTP/2
- 禁用不兼容头:HTTP/2 不允许传 Connection、Keep-Alive 等 hop-by-hop 头,需显式清除:proxy_set_header Connection '';
- 后端若支持 HTTP/2(如 gRPC 或现代应用服务器),可配 proxy_http_version 2.0;;否则保持 1.1 即可,Nginx 会自动降级
客户端长连接复用:控制空闲生命周期
客户端是否复用连接,取决于它发不发 Connection: keep-alive,以及 Nginx 是否愿意留着这个连接。服务端需主动管理:
- keepalive_timeout 75s;(建议值):响应结束后,Nginx 保持该连接打开最多 75 秒,等待下一个请求;设太短(如 10s)会导致客户端频繁重连
- keepalive_requests 100;:单个长连接最多承载 100 次请求,防内存泄漏或状态累积;金融/交易类系统可适度调低(如 50),提升连接轮转率
- 避免全局滥用:该配置放在 http 块生效于所有 server;若某 location(如文件下载)不适合长连,可在 location 内覆盖为 keepalive_timeout 0;
后端连接池复用:减少 upstream 频繁建连
反向代理时,Nginx 默认对每个请求都新建到后端的 TCP 连接。在万级并发下,这会打爆后端 TIME_WAIT 或连接数上限。必须启用 upstream 连接池:
- upstream 块内加 keepalive 32;:每个 worker 进程缓存最多 32 个空闲连接到同一后端;数值参考后端单机最大空闲连接数的 1/2~1/3(如后端 Tomcat maxConnections=2000,则设 32~64 合理)
- 配套设置 keepalive_timeout 60s;:连接池中空闲连接最长保留 60 秒,超时即关闭,防僵死
- 关键组合指令不能少:proxy_http_version 1.1; + proxy_set_header Connection '';,确保与后端协商长连接且不透传干扰头
- 若后端是 Redis/MySQL 等 TCP 服务,改用 stream 模块,并配 proxy_responses 1;(短会话)或省略(长会话)
连接调度与稳定性加固
长连接持续时间长,传统轮询易造成连接数倾斜。需结合健康检查与智能算法保障均衡和可用:
- 启用 least_conn;:优先将新请求发给当前活跃连接数最少的后端,比轮询更适合长连接场景
- 健康检查显式开启:max_fails=3 fail_timeout=30s;,再配合 health_check interval=5s fails=2 passes=3;(需编译 health_check 模块)
- 备份节点标注 backup;,只在全部主节点不可用时启用,避免误入故障链路
- DNS 动态解析(如 K8s Service):用 server svc-name resolve; + resolver 10.96.0.10 valid=5s;,实现后端 IP 变更自动感知











