客户端到 Nginx 是 HTTP/2,Nginx 到上游却每次新建 TCP,upstream 连接数比 QPS 还高。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
listen 443 ssl http2;
proxy_http_version 1.1;
proxy_set_header Connection "";
upstream api_backend {
server 10.0.1.11:8080;
keepalive 32;
}
listen 443 ssl http2 只影响客户端这一段,proxy_http_version 默认还是 1.0。HTTP/1.0 不支持长连接,请求完就关。这一点先确认清楚,后面就不用反复试。
「HTTP2 后端不匹配」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,proxy_http_version 设 1.1;proxy_set_header Connection 置空 清掉 close;upstream 里加 keepalive 连接池;对比改前后上游的 Established 连接数。
改完照着核一遍,上游 Established 稳定在 32 左右 不再随 QPS 线性增长。
