如何让Nginx等待PHP-FPM处理?504超时问题求助
网站采用PHP-FPM + Nginx架构,支持大型Excel文件导入,但Nginx总是在60秒后返回504网关超时。已经修改过以下配置,但问题依然存在:
已修改的Nginx配置
proxy_connect_timeout 600s; proxy_send_timeout 600s; proxy_read_timeout 600s; fastcgi_send_timeout 600s; fastcgi_read_timeout 600s;
已修改的PHP配置
request_terminate_timeout = 600s; max_execution_time = 600s;
需要让Nginx等待PHP-FPM处理完成或最多等5分钟再响应,但找不到哪里还设置了60秒超时,求解决办法。
检查Nginx upstream的超时配置
如果Nginx用了upstream块指向PHP-FPM,得在upstream里单独设置keepalive_timeout 600s,否则upstream的默认超时会覆盖server块的fastcgi超时。示例:upstream php-fpm { server unix:/var/run/php-fpm.sock; keepalive_timeout 600s; }确认PHP-FPM pool的超时配置
PHP-FPM是按pool分配置的(比如默认的www.conf),全局php.ini里的request_terminate_timeout优先级低于pool配置,要去对应pool的配置文件里把这个值改成600s,改完重启PHP-FPM服务。检查前端代理层的超时限制
如果网站前端挂了CDN、Cloudflare或其他反向代理,这些服务可能默认有60秒超时限制,需要去对应服务的控制台调整超时时间。比如Cloudflare的默认HTTP超时就是60秒,得手动改长。调整PHP的max_input_time
处理大文件上传时,max_input_time控制PHP接收请求数据的时间,默认可能是60秒,把它改成600s:max_input_time = 600s;修改Nginx的客户端超时配置
Nginx的client_body_timeout和client_header_timeout默认是60秒,这两个是等待客户端发送请求体、请求头的超时时间,也需要改成600s:client_body_timeout 600s; client_header_timeout 600s;验证配置是否生效
修改配置后必须重启Nginx和PHP-FPM(别只reload),然后用命令确认:- 查看PHP生效配置:
php -i | grep max_execution_time - 查看Nginx生效配置:
nginx -T | grep timeout,排查是否还有残留的60秒超时项。
- 查看PHP生效配置:
检查脚本自身的超时设置
导入Excel的代码里有没有手动设置set_time_limit(60)?部分框架或自定义代码会强制设置脚本超时,改成set_time_limit(600)或者set_time_limit(0)(0表示依赖php.ini的全局配置)。
内容的提问来源于stack exchange,提问作者Tommy Hoang

