Ubuntu服务器Apache+PHP执行大任务60秒后报504错误求助
你已经确认了php.ini和Apache全局Timeout的配置,而且PHP进程还能在后台继续运行,这说明超时不是来自PHP的执行限制,而是请求链路里某个中间环节提前切断了客户端与服务器的连接。下面是几个你需要重点检查的潜在原因:
反向代理/CDN的超时限制
如果你的网站前面部署了Nginx、Cloudflare、AWS CloudFront这类反向代理或CDN服务,它们默认的连接超时通常是60秒。比如Nginx的proxy_read_timeout默认就是60s,Cloudflare免费版的“HTTP请求超时”也默认设为60秒。这些中间层会先于Apache主动切断连接,导致浏览器收到504,但后端的PHP进程不受影响,会继续完成任务。PHP-FPM的请求终止超时(若使用FPM模式)
如果你是通过PHP-FPM来运行PHP,除了php.ini里的参数,一定要检查FPM的配置文件(比如/etc/php/[版本]/fpm/pool.d/www.conf):request_terminate_timeout:这个参数会强制终止超过指定时长的请求,默认值可能是60秒;- 另外还要确认
pm.max_children、pm.process_idle_timeout等进程管理参数是否合理,避免因为进程池耗尽导致请求排队超时。
Apache的
ProxyTimeout参数(关键!)
如果你用了mod_proxy_fcgi来将请求转发给PHP-FPM(这是Apache搭配FPM的常见方式),那么全局的Timeout参数会被ProxyTimeout覆盖,而ProxyTimeout的默认值正好是60秒!哪怕你把Apache的Timeout设为300,只要ProxyTimeout没改,代理到FPM的请求还是会在60秒后超时断开,这是很多人容易踩的坑。TCP连接层面的系统超时
虽然概率较低,但可以检查Linux系统的TCP keepalive参数,比如:sysctl net.ipv4.tcp_keepalive_time sysctl net.ipv4.tcp_keepalive_intvl如果这些参数被修改过,导致TCP连接过早被回收,也可能触发504。默认情况下这些值都比较大(比如7200秒),但如果有自定义配置就需要调整。
输出缓冲导致的“假超时”
有些大型任务在执行过程中长时间没有输出任何内容,Apache或代理服务器会因为“感知不到请求活跃”而判定超时。你可以尝试在任务执行的关键节点添加输出缓冲刷新代码:echo ' '; // 输出一个空白字符,避免部分服务器忽略空输出 flush(); ob_flush();这样能让服务器知道请求还在处理中,避免被提前断开。
内容的提问来源于stack exchange,提问作者Eliacim Azor Dávila García

