爬虫抓取超时Nginx超时参数调整优化
爬虫抓取数据时,经常遇到“504 Gateway Timeout”或“Upstream timed out”错误。
这通常是因为Nginx的反向代理超时参数太短,导致后端处理慢就被强行中断。
本文专门处理这个场景,帮你一步步把Nginx超时参数调大,让爬虫稳定采集。
调整前先搞清楚三件事
- 你需要一台安装了Nginx的服务器,并且有root或sudo权限。
- 找到Nginx配置文件:一般是
/etc/nginx/nginx.conf,或者你的站点配置文件在/etc/nginx/conf.d/或/etc/nginx/sites-enabled/下。 - 最重要:先备份原配置文件!执行
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak,万一改错了能恢复。
动手修改Nginx超时参数
Nginx与上游服务器(比如PHP-FPM、Gunicorn)通信时,有三个关键超时项:
- proxy_connect_timeout:连接上游的超时时间,默认60秒。
- proxy_send_timeout:向上游发送请求的超时,默认60秒。
- proxy_read_timeout:等待上游返回响应的超时,默认60秒。
爬虫抓取慢,最常需要加大的是proxy_read_timeout。
打开你的站点配置文件,在location或server块中加入(或修改)如下参数:
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 300s;
如果担心内存,也可以在http块中统一设置。
300秒(5分钟)对大多数爬虫足够;
如果数据返回特别慢,可以再调大。
注意单位必须是s(秒)。
改完后保存文件,测试配置是否正确:
nginx -t
如果输出“syntax is ok”,再重载Nginx:
nginx -s reload
现在超时参数已经生效。
容易踩的坑和避坑方法
- 改错位置:
proxy_*参数只对代理请求生效。如果你用的是fastcgi_pass(例如PHP),需要改fastcgi_read_timeout,写法类似。 - 超时设得过大:比如设为3600秒,会导致Nginx长期占用连接,浪费资源。建议先从300秒起步,观察爬虫实际用时再微调。
- 只改了Nginx没改后端:如果后端程序本身执行超过设定时间,还需调整PHP-FPM的
request_terminate_timeout或应用本身的超时配置,否则Nginx改再大都没用。 - 忘记重载Nginx:改完配置必须重载,否则不会生效。
确认参数是否生效的方法
- 用curl模拟慢请求:在服务器上执行
curl -v --max-time 5 http://你的站点/api/slow,如果Nginx因为超时报错,会直接显示“upstream timed out”等。 - 检查访问日志:Nginx默认日志
/var/log/nginx/access.log中,记录着每个请求的响应时间和状态码。如果之前是504,改完之后应该变200或其他正常码。 - 查看爬虫输出:如果你在爬虫里打印了异常信息,如果之前报
ConnectionTimeout,现在不再出现,说明调整有效。
高频问题速答
Q:改了proxy_read_timeout还是超时?
A:先确认重载了Nginx;再查看后端程序(如PHP-FPM)的超时设置;也可以抓包确认到底是哪个环节超时。
Q:所有location都要改吗?
A:不需要。爬虫请求通常走特定的location(如/api),只改那一块就行。如果你希望全局生效,就在http块设置。
Q:参数设成多少最合适?
A:没有标准值。建议先设为300秒,运行一周看日志。如果还有超时就再加大50-100秒,直到爬虫稳定。但一般不超过600秒,否则风险增大。
如果你正在处理爬虫抓取超时问题,建议先按本文调整proxy_read_timeout,再检查后端程序。
若仍异常,可回看避坑部分排查后续环节。