先把当时的情况摆出来。CentOS 7.9 + Apache 2.4 用 mod_proxy_fcgi 转给 PHP-FPM,导出接口固定六十秒返回五零四,httpd 配置里把 ProxyTimeout 调到 300 也没变化,日志只留一行 timeout。

这类报错背后常见的原因有几处,逐个排除就行。PHP-FPM 自己的 request_terminate_timeout 是六十秒,后端先断,前端等不到响应。另一种情况是ProxyPass 那一行带了 timeout 参数,行内值覆盖了全局配置。

另外,php.ini 的 max_execution_time 在脚本层又限了一次。少数情况下是前端还有一层负载均衡,它自己的超时更短,请求在更外层就被截断。

先看代理与超时相关配置写在哪几层

grep -rn 'ProxyTimeout\|ProxyPass' /etc/httpd/conf.d/*.conf

随后核对后端自己的超时设置

grep -E 'request_terminate_timeout' /etc/php-fpm.d/www.conf

接着把 Apache 与后端的超时一起放宽

sed -i 's/^ProxyTimeout.*/ProxyTimeout 300/' /etc/httpd/conf.d/php.conf && systemctl reload httpd

直接打后端量一次真实耗时

curl -o /dev/null -s -w '%{http_code} %{time_total}\n' http://127.0.0.1/export

恢复的判定其实很直接。导出接口返回 200 且耗时稳定在八十秒以内不再出现五零四,error.log 里没有新的 timeout 记录,前端负载均衡的超时也同步放宽。

这里还有个坑。超时要在整条链路上从内到外递增,任何一层最短的那个决定了实际上限,改最外层没有意义。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189