我有一个Perl Web应用程序,由Apache httpd使用普通mod_cgi
或可选mod_perl
和PerlHandler 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在错误发生后的行为,因为我似乎没有找到关于该主题的更多信息。这只是增加配置值并尽量避免问题,这很好,但不是我目前需要知道的。
谢谢!
答案 0 :(得分:1)
mod_cgi和mod_cgid都在请求范围上设置了一个清理函数来杀死子进程,但是它们以稍微不同的方式执行。报告超时后不久就会发生这种情况(mod_cgi返回控制,写入错误响应,记录请求等等)
mod_cgi使用httpd中的核心工具执行SIGTERM,休眠3秒,然后执行SIGKILL。