我正在运行一个Perl CGI工具,它执行一个系统命令(Unix),它可能运行几秒钟到一个小时。脚本完成后,该工具应该在屏幕上(在浏览器中)显示结果日志。问题是,大约5分钟后,我得到一个超时消息&;网关超时&;-系统命令继续运行,但我无法向用户显示运行结果。
在Apache配置文件(httpd.conf)中:Timeout 300.
是否有一种简单的方式命令Apache仅为特定的运行增加超时?我真的不想永久地改变Apache超时(或者我应该吗?),也不想大幅更新代码(大量的回归测试)。
让脚本每隔一段时间生成一些输出。这个超时不是为了让程序运行到完成,而是Apache等待数据时的超时。因此,如果你设法让你的程序在运行时有规律地输出一些东西,你就会很好。
注意HTTP客户端,即浏览器,也有自己的超时。如果你的浏览器没有从web服务器获得任何新的数据5分钟(通常),浏览器将声明超时并放弃,即使服务器仍在处理。如果您的长时间运行的处理时不时地给出一些输出,它也将有助于防止浏览器超时!
为了完整:
虽然公认的答案是最好的(它在TCP/IP中被称为KeepAlive数据包,或者appletalk时代的Tickle数据包),但你确实问过你是否可以动态配置Apache。
apache模块可以这样做。哦,但是用C写这个很痛苦。请记住,mod_perl(在某种程度上还有mod_python,尽管它已被弃用)不仅处理程序,而且还将内部配置包装在perl中。你可以写一些复杂的东西来增加某些情况下的超时。但是,这将是一个编写和测试的负担,您最好按照Krisku所说的去做。
似乎没有办法在<!--#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与预fork MPM,所以你可能需要编辑/etc/httpd/conf.modules.d/01-cgi.conf来告诉Apache使用mod_cgid而不是mod_cgi。
虽然01-cgi.conf中的注释说,"mod_cgid应该与线程MPM一起使用;mod_cgi与预叉MPM,"这似乎是不正确的,因为mod_cgid似乎与预叉MPM和PHP工作得很好,对我来说,与Apache 2.4.46。
虽然这不能让你完全控制服务器超时,但你可以为特定目录指定不同的CGIDScriptTimeout设置(例如,把你的慢cgi文件放在。/slowstuff/文件夹中)。
(当然,正如krisku在接受的答案中提到的,改变cgdscripttimeout并不能解决用户的web浏览器超时的问题。)