【发布时间】:2016-05-04 06:10:04
【问题描述】:
我有一个由 Apache httpd 提供的 Perl Web 应用程序,它使用普通的 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 的行为方式,因为我似乎没有找到关于该主题的太多信息。这只是增加配置值并首先尝试避免问题,这很好,但不是我目前需要知道的。
谢谢!
【问题讨论】:
-
使用 mod_cgi 时的逐字错误是什么?
-
“脚本在返回标头之前超时”,但这真的不是问题,我想知道发送该错误后服务器端会发生什么。
标签: apache perl timeout cgi mod-perl2