我们一直在测试 Apache 2+ 版本,并且对所有请求,TimeOut 指令集都会针对一个请求处理 2 次。您可以看到下面的日志(TimeOut 设置为 2 秒):
[Wed Feb 12 18:04:20 2014] [warn] [client 192.168.19.117] Timeout waiting for output from CGI script /usr/local/cpanel/cgi-sys/php5
[Wed Feb 12 18:04:20 2014] [error] [client 192.168.19.117] Script timed out before returning headers: php5
[Wed Feb 12 18:04:22 2014] [warn] [client 192.168.19.117] Timeout waiting for output from CGI script /usr/local/cpanel/cgi-sys/php5
[Wed Feb 12 18:04:22 2014] [error] [client 192.168.19.117] File does not exist: /home/davetest/public_html/504.shtml
Apache 记录请求达到设置的超时时间,然后在返回错误之前允许另外 2 秒的间隔。
TimeOut 3、5、10 等也会发生相同的情况 - 超时时间加倍。
你能指出我在这里明显遗漏了什么吗?
编辑:正在执行的 php 脚本只是 60 秒睡眠。
strace 输出:
系统信息:
操作系统:CentOS 6.5
谢谢。
答案1
Apache 没有做错任何事:您有两次超时是因为您调用了 PHP 两次。
第一次是您尝试加载网页本身,但超时了。
第二次是 Apache 尝试加载ErrorDocument
由于它不存在,因此被传递给 PHP 进行处理。
要解决该问题,请设置ErrorDocument
为现有的静态 HTML 页面。
ErrorDocument 504 /failwhale.html
答案2
我自己无法解释这个问题,而且我也想知道为什么 Apache 会这样做”双超时“因为它对于实际的 Apache 文档来说相当奇怪且有争议。
当使用 PHP 的 CGI 包装器时,我想到了以下内容“边“ 解决方案:
timeout 30 /usr/bin/php-cgi
而不是使用:
exec /usr/bin/php-cgi
这样,当达到超时时,内核会直接终止执行。
答案3
我可以确认这个错误也存在于 Apache 2.4.41 中。我的配置是mod_cgid(使用外部 CGI 守护进程执行 CGI 脚本)和mod_event(针对静态内容的线程工作者)。
我的超时全局设置为 300 秒(5 分钟):
Timeout 300
添加以下指令mod_cgid没有帮助,并且即使超时后 CGI 脚本仍继续工作:
CGIDScriptTimeout 300
工作流程如下:
# execution started by the CGI daemon
suexec_log:[2019-11-07 12:43:59]: uid: (4260/vesselin) gid: (3751/vesselin) cmd: timeout2.php
# timeout logged after 5 minutes
error_log:www.example.com [Thu Nov 07 12:48:59 2019] [error] [pid 23226] util_script.c(506): [client 94.155.37.249:59500] Script timed out before returning headers: timeout2.php
# script continues to run; does not get any signal to terminate
# apache sends HTTP error 504 to the browser after *another* 5 minutes
access_log:www.example.com 1.1.1.1 - - [07/Nov/2019:12:43:58 +0200] "GET /timeout2.php HTTP/1.1" 504 417 "-" "curl/7.58.0" 0 0 "off:-:-" 92 600867987 2.2.2.2 www.example.com
# note that the execution time is correctly logged as 600867987 microseconds (600 seconds)
该错误已被报告为Debian 错误 #780123。