You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu服务器Apache+PHP执行大任务60秒后报504错误求助

排查Apache 2.4 + 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:24:24