为了省内存把 keepalive_timeout 改成 0,蜘蛛抓取时每条请求都新建 TCP 连接,日志里同一秒的握手明显变多,抓取速度掉了一半。

这类报错背后常见的原因有几处,逐个排除就行。关闭长连接后每次请求都要重新握手,额外消耗一个 RTT;蜘蛛按并发连接数抓取,握手慢会直接压低单位时间抓取量;TLS 会话无法复用,每页都要重新协商;上游 PHP-FPM 的连接数被打满,响应时间同步上升。

第一件事是统计单 IP 的连接建立次数

awk '{print $1}' access.log | sort | uniq -c | sort -rn | head

然后确认 keepalive 的当前取值

nginx -T | grep -n 'keepalive_timeout'

随后改回合理的连接保持时间

keepalive_timeout 65;

复查响应时间是否回落

curl -o /dev/null -s -w '%{time_connect} %{time_total}\n' https://www.example.com/a/

别只看报错消失,验证要多做一步。同一 IP 的连接建立次数明显下降,单页平均响应时间回落三成,日志里每秒请求数恢复到此前的水平。

省内存该从进程数和缓存下手,关掉长连接省下的那点内存,会用抓取效率和用户体验还回去。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189