perl CGI工具中的Apache超时

时间:2014-08-19 06:26:00

标签: apache perl timeout cgi

我正在运行一个执行系统命令(Unix)的Perl CGI工具,该命令可能运行几秒钟到一个小时。 脚本完成后,该工具应在屏幕上显示结果日志(在浏览器中)。 问题是大约5分钟后我收到一条超时消息" Gateway Time-out" - 系统命令继续运行,但我无法向用户显示运行结果。

在Apache配置文件(httpd.conf)中:Timeout 300。

是否有简单方式命令Apache仅为特定运行增加超时? 我真的不想永久地更改Apache超时(或者我应该?)而不是大幅更新代码(很多回归测试)。

提前致谢。

麦克

3 个答案:

答案 0 :(得分:2)

让脚本每隔一段时间生成一些输出。超时不是用于运行程序完成,而是在Apache等待数据时超时。因此,如果你设法让你的程序在运行时定期输出内容,你会没事的。

请注意,HTTP客户端(即浏览器)也有自己的超时。如果您的浏览器在五分钟内(通常)没有从Web服务器获取任何新数据,则浏览器将声明超时并放弃即使服务器仍在处理。如果您的长时间运行处理会不时地提供一些输出,那么它也有助于防止浏览器超时!

答案 1 :(得分:0)

为了完整性:

虽然接受的答案是最好的(它在TCP / IP中被称为KeepAlive数据包,或者在appletalk时代就是Tickle数据包),但您确实询问是否可以进行动态Apache配置。

apache模块可以做到这一点。哦,但用C写作是一件痛苦的事。 请记住,mod_perl(在某种程度上mod_python,虽然它已被弃用)不只是处理程序,而且还包含perl中的内部配置。你可以写一些复杂的东西来增加某些情况下的超时。但是,这将是一个写作和测试的熊,你做Krisku说的更好。

答案 2 :(得分:0)

似乎没有任何方法可以在 <!--#include virtual=... --> 指令上指定超时,但是如果您使用 mod_cgid 而不是 mod_cgi,那么从 Apache 2.4.10 开始,您可以指定一个可配置的超时参数在 httpd.conf 或 .htaccess 中:

CGIDScriptTimeout nnns

...其中 nnn 是 Apache 允许思考 CGI 脚本继续运行的秒数。

警告:如果您将 PHP 与 Apache 一起使用,那么您的 Apache 可能在 /etc/httpd/conf.modules.d/00-mpm.conf 中配置为使用“prefork”MPM(因为PHP 需要它,除非使用线程安全标志构建),并且默认的 Apache 安装使用 mod_cgi 和 prefork MPM,因此您可能需要编辑 /etc/httpd/conf.modules.d/01-cgi.conf 来告诉Apache 使用 mod_cgid 而不是 mod_cgi。

尽管 01-cgi.conf 中的注释说,“mod_cgid 应该与线程 MPM 一起使用;mod_cgi 应该与 prefork MPM 一起使用,” 这似乎不正确,因为 mod_cgid 似乎对我来说,使用 Apache 2.4.46 可以很好地使用 prefork MPM 和 PHP。

虽然这不能让您完全控制服务器超时,但您可以为特定目录指定不同的 CGIDScriptTimeout 设置(例如,将慢速 .cgi 文件放在 ./slowstuff/ 文件夹中)。

(当然,正如 krisku 在接受的答案中提到的,更改 CGIDScriptTimeout 不会解决用户的 Web 浏览器超时的问题。)