Nginx keepalive_timeout设置后为什么客户端连接还是频繁断开?
我给Nginx配置了keepalive_timeout 65;和keepalive_requests 100;,但前端用axios发送多个请求时,抓包发现连接还是在第6次请求后突然断开了。明明服务端配置支持100次复用啊,是不是哪里没配对?
尝试把超时时间调到75s后问题依旧,甚至出现444错误。这是我的配置片段:
http {
keepalive_timeout 65;
keepalive_requests 100;
server {
location /api {
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
客户端请求头已经加上了Connection: keep-alive,但错误日志显示:upstream timed out (110: Connection timed out) while reading response header,这和keepalive设置有关系吗?
你配了
keepalive_timeout 65和keepalive_requests 100,但这是Nginx和后端upstream之间的连接复用设置,不是客户端和Nginx之间的。客户端(比如浏览器或axios)和Nginx之间的keepalive行为,默认还是HTTP 1.1的持久连接,但实际能不能复用,得看双方都支持且不主动关闭。你抓包看到第6次请求后断开,很可能是以下几种情况之一:
1. 客户端主动关闭了连接
axios在某些场景下(比如跨域预检后、重定向后、或手动设置了
Connection: close)会主动断开,它不保证复用连接。你可以用axios.defaults.maxRedirects = 0或检查响应头里有没有Connection: close。2. 中间设备(比如负载均衡、CDN、反向代理链)断开了连接
比如前端用了Cloudflare、或本地开发时用了
webpack-dev-server代理,它可能有自己的keepalive限制(比如默认只复用5次),而且它和Nginx之间用的是HTTP 1.0,那根本就不会keepalive。3. Nginx配置缺了关键项
你只配了
proxy_http_version 1.1和清了Connection,但Nginx和upstream之间的keepalive连接池,还需要在upstream块里显式配置keepalive参数。否则Nginx虽然能和客户端保持长连接,但每次请求都会重新建立和后端的新连接,等同于没复用,而且容易把后端打爆。正确的配置应该是:
另外那个
upstream timed out错误,是Nginx等后端返回响应头等太久,跟keepalive没直接关系,但如果你没配proxy_read_timeout,默认是60秒,而你后端处理慢,就容易超时。建议先用
curl -v测试下直接访问Nginx,确认连接是否复用,再看是不是中间层(比如dev server)捣鬼。有时候你以为是Nginx的问题,其实是前端工具链偷偷关了keepalive,这种坑我踩过好几次了……然后把proxy_pass改成指向backend,超时问题就没了。444错误是因为你后端主动断开了空闲连接,调大后端的keepalive_timeout就行。