原因分析
- 后端服务挂了
- 后端应用性能达到瓶颈,比如 CPU、内存跑满,带宽跑满等
- 后端应用响应超时
- Nginx配置
- 防火墙配置问题
- HTTP 头部过大
- DNS 配置问题
解决方法
1 | 调整 nginx 主机内核参数,增加全连接队列、半连接队列长度,提高 nginx 并发能力 |
修改 /etc/sysctl.conf
,调整 Nginx 宿主机的内核配置:
1 | fs.file-max=1024000 |
生效配置:
1 | sudo sysctl -p |
调试过程中发现,nginx 会和后端应用建立大量连接,导致系统中存在大量 TIME_WAIT
状态的连接,消耗服务器的端口资源。
参考 nignx 调优文档,发现让 nginx 和后端应用使用 keepalive 保持长连接即可,可以利用 nginx 连接池中已经创建好的连接,不用每个请求都创建新连接。
1 | upstream s1 { |
让 nginx 和后端使用 http 1.1 协议,开启 keepalive 功能。
proxy_http_version
设置协议版本为 1.1,默认支持 keepalive
;
proxy_set_header
把 Connection
头清空,以免客户端发来的头部包含 Connection: close
,而意外地把长连接关闭;
keepalive
参数设置的是每个 nginx worker 可缓存的最大空闲连接数,不代表每个 worker 能创建的连接数。