【问题标题】:What happens AFTER Apache says "Script timed out before returning headers" to the running script?在 Apache 对运行脚本说“脚本在返回标头之前超时”之后会发生什么?
【发布时间】:2016-05-04 06:10:04
【问题描述】:

我有一个由 Apache httpd 提供的 Perl Web 应用程序,它使用普通的 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 的行为方式,因为我似乎没有找到关于该主题的太多信息。这只是增加配置值并首先尝试避免问题,这很好,但不是我目前需要知道的。

谢谢!

【问题讨论】:

  • 使用 mod_cgi 时的逐字错误是什么?
  • “脚本在返回标头之前超时”,但这真的不是问题,我想知道发送该错误后服务器端会发生什么。

标签: apache perl timeout cgi mod-perl2


【解决方案1】:

mod_cgi 和 mod_cgid 都在请求范围内设置了一个清理函数来杀死子进程,但它们的执行方式略有不同。这将在报告超时后不久发生(mod_cgi 返回控制、写入错误响应、记录请求等的一点时间)

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

【讨论】:

  • 所以我的成功过程只是幸运地在 3 秒的时间间隔内?除了增加超时之外,还有什么方法可以影响这个清理功能?也许还有其他文档,所以我也可以获得一些关于 mod_per 的背景信息?
  • 在 mod_cgi 或 mod_cgid 中不可配置。在前者中,它是任何需要在超时后终止的子进程的监视列表的一部分。模块和这个工具之间的 API 是 apr_pool_note_subprocess。在 mod_perl 中有一个调用,但我不知道它是否用于例行脚本执行(我的猜测是否定的,因为 mod_perl 甚至不应该有一个子进程?)进程生命周期的东西在 APR 中,见上面的方法和 free_process_chain在 srclib/apr/memory/unix/apr_pools.c
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-08
  • 2019-01-31
相关资源
最近更新 更多