⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
单纯开启keepalive不能自动提升性能,必须upstream连接池、proxy层HTTP/1.1升级与Connection头清理三者协同生效;缺一不可,否则仍新建连接消耗TCP/TLS开销。

单纯开启 keepalive 并不能自动提升反向代理性能,关键在于 upstream 连接池、HTTP/1.1 协议升级和请求头清理三者协同生效。否则 Nginx 仍会为每个请求新建后端连接,白白消耗 TCP 握手与 TLS 协商开销。
upstream 中必须定义 keepalive 连接池
这是复用的物理基础。Nginx 默认不缓存空闲连接,需显式声明:
- keepalive N:每个 worker 进程最多缓存 N 个空闲长连接(不是总连接数)。建议值 = 后端单实例稳定并发数 × 0.6~0.8。例如后端 Tomcat maxConnections=200,可设为 120~160
- keepalive_requests N:单个 keepalive 连接最多承载 N 次请求后关闭。默认 100 容易导致频繁断连,生产环境推荐 1000~10000
- keepalive_timeout Ns:空闲连接在池中保留时长(秒)。必须小于后端服务的 keepalive timeout(如 Nginx 设 60s,后端至少设 75s),推荐 30s~60s
proxy 层强制启用 HTTP/1.1 并清除 Connection 头
即使 upstream 配了 keepalive,若协议降级或头信息干扰,复用就会失效:
- proxy_http_version 1.1:必须显式声明。HTTP/1.0 不支持 keepalive,Nginx 会默认降级
- proxy_set_header Connection '':清空客户端传来的 Connection 头(如 close),避免误传给后端导致其主动断连
- 推荐补充:proxy_set_header Host $host 和 proxy_set_header X-Real-IP $remote_addr,保持原始上下文
后端服务必须真正维持长连接
Nginx 的 keepalive 只控制“发出端”,后端才是连接生命周期的最终决定者:
- 检查后端响应头是否含 Connection: keep-alive(HTTP/1.1 默认行为,一般无需手动加)
- 确认后端配置:Tomcat 的 connectionTimeout 应 ≥ Nginx 的 keepalive_timeout;Node.js 的 server.keepAliveTimeout、Go 的 http.Server.IdleTimeout 同理
- 避免使用禁用 keepalive 的老服务(如某些 IIS 默认配置或旧版 PHP-FPM)
验证是否真实复用而非纸面配置
不能只看配置文件,要从连接状态和流量行为确认:
- 用 ss -tan | grep :后端端口 | grep ESTAB | wc -l 观察连接数是否稳定在 keepalive 设定值附近(如设 32,压测中维持在 25~32)
- 用 tcpdump -i any port 后端端口 -nn -c 100 抓包,查看是否有大量重复 SYN/SYN-ACK(未复用典型特征)
不复杂但容易忽略










