Apache 2.0 版及以上版本将请求的 TimeOut 指令加倍

Apache 2.0 版及以上版本将请求的 TimeOut 指令加倍

我们一直在测试 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 输出:

http://pastebin.com/h4dHU64X

系统信息:

操作系统: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

相关内容