Perl CGI工具中的Apache超时

z31licg0  于 2023-05-29  发布在  Perl
关注(0)|答案(3)|浏览(162)

我正在运行一个Perl CGI工具,它执行一个系统命令(Unix),可能会运行几秒钟到一个小时。脚本完成后,工具应在屏幕上(在浏览器中)显示结果日志。问题是,大约5分钟后,我得到一个超时消息“网关超时”-系统命令继续运行,但我无法向用户显示运行结果。
在Apache配置文件(httpd.conf)中:超时300
是否有一个简单的方法命令Apache只为特定的运行增加超时?我真的不想永久地更改Apache超时(或者我应该这样做吗?))而不大幅更新代码(大量的回归测试)。

lxkprmvk

lxkprmvk1#

让脚本每隔一段时间生成一些输出。超时不是为了运行程序完成,而是Apache等待数据时的超时。因此,如果你设法让你的程序在运行时有规律地输出一些东西,你会很好的。
请注意,HTTP客户端,即浏览器也有自己的超时时间。如果您的浏览器在五分钟内没有从Web服务器获得任何新数据(通常),浏览器将声明超时并给予,即使服务器仍在处理。如果您的长时间运行的处理会时不时地给出一些输出,这也会帮助您防止浏览器超时!

6bc51xsx

6bc51xsx2#

完整性:
虽然公认的答案是最好的(它在TCP/IP中被称为KeepAlive包,或者在appletalk时代被称为Tickle包),但你确实问过你是否可以做动态Apache配置。
Apache模块可以做到这一点。哦,但这是一个痛苦的写在C。请记住,mod_perl(以及某种程度上的mod_python,尽管它已被弃用)不仅处理程序,而且还 Package 了perl中的内部配置。您可以编写一些复杂的代码来增加某些情况下的超时。但是,这将是一个熊编写和测试,你最好做什么Krisku说。

0ve6wy6x

0ve6wy6x3#

似乎没有任何方法可以在<!--#include virtual=... -->指令上指定超时,但是如果你使用mod_cgid而不是mod_cgi,那么从Apache 2.4.10开始,有一个可配置的超时参数,你可以在httpd.conf或.htaccess中指定:
CGIDScriptTimeoutnnns
其中 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 with the prefork MPM," that doesn't seem to be correct,because mod_cgid seems to work fine with prefork MPM and PHP,for me,with Apache 2.4.46.
虽然这不能给予您完全控制服务器超时,但您可以为特定目录指定不同的CGIDScriptTimeout设置(例如,将slow .cgi文件放在./slowstuff/文件夹中)。
(Of当然,正如krisku在接受的答案中提到的,更改CGIDScriptTimeout不会解决用户的Web浏览器超时的问题。

相关问题