在Apache将“返回标题之前的脚本超时”发送到正在运行的脚本之后会发生什么?

时间:2016-01-27 10:32:25

标签: apache perl timeout cgi mod-perl2

我有一个Perl Web应用程序,由Apache httpd使用普通mod_cgi或可选mod_perlPerlHandler ModPerl::Registry提供。最近,应用程序在某些调用中遇到错误Script timed out before returning headers,之后表现不同:虽然某些请求似乎在后台成功处理,但在httpd发送状态504到客户端后,其他请求却没有。

那么httpd在达到配置的超时并将错误发送到客户端之后究竟如何表现?请求/响应周期现在已经完成,所以我想KeepAlive之类的东西会起作用来决定TCP连接是否保持活动状态等等。但是运行脚本会在哪个环境中发生,例如mod_cgi与mod_perl?

特别是在mod_cgi中,为每个请求启动了新进程,我猜想httpd会让进程保持简单运行。因为我们所有的Perl文件都有一个shebang,我甚至不确定httpd是否能够跟踪进程并且是否这样做。这可能与mod_perl完全不同,因为在这种情况下,httpd知道解释器以及它们正在做什么等等。事实上,使用普通mod_cgi超时的相同操作成功使用mod_perl而没有任何超时,但即使有超时在mod_cgi中,之后至少有一个请求成功。

我发现这个问题对于其他运行时也比Perl有趣,因为它们共享了普通的mod_cgi与嵌入到httpd进程中的一些持久运行时或使用一些外部守护进程的概念。

所以,我的问题不是关于如何获取错误消息。相反,我想了解httpd在错误发生后的行为,因为我似乎没有找到关于该主题的更多信息。这只是增加配置值并尽量避免问题,这很好,但不是我目前需要知道的。

谢谢!

1 个答案:

答案 0 :(得分:1)

mod_cgi和mod_cgid都在请求范围上设置了一个清理函数来杀死子进程,但是它们以稍微不同的方式执行。报告超时后不久就会发生这种情况(mod_cgi返回控制,写入错误响应,记录请求等等)

mod_cgi使用httpd中的核心工具执行SIGTERM,休眠3秒,然后执行SIGKILL。