一次 502 排查,最后发现是 nginx 的连接数不够
上周有台机器的接口开始零星报 502,不是全挂,是十几次里冒一次。这种最难查,因为它不持续,你盯着的时候它偏偏是好的。
先看后端服务的日志,一切正常,没有报错,请求量也没暴涨。再看服务器负载,CPU 和内存都很闲。这时候就有点没头绪了。
后来把 nginx 的 error log 翻出来仔细看,发现一行以前从没注意过的字:worker_connections are not enough。
原来是连接数不够。nginx 默认的 worker_connections 是 512,我们那台机并发一上来就顶到上限,多出来的连接直接被丢掉,客户端看到的就是 502。
但奇怪的是并发并不高。继续查才发现问题出在 keepalive。上游连接池没配好,每个请求都新建一条到后端的连接,用完不释放,攒着攒着就把 worker 的连接额度吃光了。
改的时候做了三件事。一是把 worker_connections 提到 4096,同时确认 worker_rlimit_nofile 也跟着调,不然文件描述符会先到顶。二是在 upstream 里打开 keepalive,让到后端的连接能复用。三是把 proxy_http_version 设成 1.1,并且把 Connection 头清掉——不设这两项,keepalive 根本不生效,这是我踩过的坑,配置写了等于没写。
改完之后 502 就没了。回头看,这个问题的教训是:502 不一定代表后端挂了,它也可能是 nginx 自己没接住。以前我遇到 502 第一反应就是去查后端,这次绕了不少弯路。
现在我的排查顺序改成了:先看 nginx 的 error log 里有没有 worker 相关的字样,再去看后端。顺序换一下,能省很多时间。
- 点赞
- 收藏
- 关注作者
评论(0)