Apache 对 运行 脚本说 "Script timed out before returning headers" 之后会发生什么?
What happens AFTER Apache says "Script timed out before returning headers" to the running script?
我有一个由 Apache httpd 使用普通 mod_cgi
或可选 mod_perl
和 PerlHandler ModPerl::Registry
提供的 Perl 网络应用程序。最近,该应用程序在某些调用中遇到错误 Script timed out before returning headers
,之后的行为有所不同:虽然某些请求似乎在后台成功处理,但在 httpd 向客户端发送状态 504 后,其他请求却没有。
那么 httpd 在达到其配置的超时并将错误发送给客户端后究竟表现如何? request/response 循环现在结束了,所以我想像 KeepAlive 这样的东西开始发挥作用来决定 TCP 连接是否保持活动等。但是 运行 脚本在哪个环境中会发生什么,例如mod_cgi 与 mod_perl?
特别是在 mod_cgi 中,每个请求都会启动新进程,我猜想 httpd 会简单地保持进程 运行。因为我们所有的 Perl 文件都有一个 shebang,我什至不确定 httpd 是否能够跟踪进程并且是否这样做。这可能与 mod_perl 完全不同,因为在那种情况下 httpd 知道解释器以及他们在做什么等。事实上,使用普通 mod_cgi 超时的相同操作,使用 [= 成功30=] 没有任何超时,但即使在 mod_cgi 中出现超时,之后至少有一个请求也成功了。
我发现这个问题对于 Perl 以外的其他运行时也很有趣,因为它们共享普通 mod_cgi 与嵌入 httpd 进程或使用某些外部守护进程的某些持久运行时的概念。
所以,我的问题不是关于如何消除错误消息。相反,我想了解发生错误后 httpd 的行为方式,因为我似乎没有找到关于该主题的太多信息。只是增加配置值,尽量在第一时间避免问题,这很好,但不是我目前需要知道的。
谢谢!
mod_cgi 和 mod_cgid 都在请求作用域上设置了清理函数来终止子进程,但它们的实现方式略有不同。这将在报告超时后不久发生(mod_cgi 到 return 控制的一小段时间,要写入的错误响应,记录的请求等)
mod_cgi 使用 httpd 中的核心设施执行 SIGTERM,休眠 3 秒,然后执行 SIGKILL。
我有一个由 Apache httpd 使用普通 mod_cgi
或可选 mod_perl
和 PerlHandler ModPerl::Registry
提供的 Perl 网络应用程序。最近,该应用程序在某些调用中遇到错误 Script timed out before returning headers
,之后的行为有所不同:虽然某些请求似乎在后台成功处理,但在 httpd 向客户端发送状态 504 后,其他请求却没有。
那么 httpd 在达到其配置的超时并将错误发送给客户端后究竟表现如何? request/response 循环现在结束了,所以我想像 KeepAlive 这样的东西开始发挥作用来决定 TCP 连接是否保持活动等。但是 运行 脚本在哪个环境中会发生什么,例如mod_cgi 与 mod_perl?
特别是在 mod_cgi 中,每个请求都会启动新进程,我猜想 httpd 会简单地保持进程 运行。因为我们所有的 Perl 文件都有一个 shebang,我什至不确定 httpd 是否能够跟踪进程并且是否这样做。这可能与 mod_perl 完全不同,因为在那种情况下 httpd 知道解释器以及他们在做什么等。事实上,使用普通 mod_cgi 超时的相同操作,使用 [= 成功30=] 没有任何超时,但即使在 mod_cgi 中出现超时,之后至少有一个请求也成功了。
我发现这个问题对于 Perl 以外的其他运行时也很有趣,因为它们共享普通 mod_cgi 与嵌入 httpd 进程或使用某些外部守护进程的某些持久运行时的概念。
所以,我的问题不是关于如何消除错误消息。相反,我想了解发生错误后 httpd 的行为方式,因为我似乎没有找到关于该主题的太多信息。只是增加配置值,尽量在第一时间避免问题,这很好,但不是我目前需要知道的。
谢谢!
mod_cgi 和 mod_cgid 都在请求作用域上设置了清理函数来终止子进程,但它们的实现方式略有不同。这将在报告超时后不久发生(mod_cgi 到 return 控制的一小段时间,要写入的错误响应,记录的请求等)
mod_cgi 使用 httpd 中的核心设施执行 SIGTERM,休眠 3 秒,然后执行 SIGKILL。