我有Apache2与PHP + PHP-FPMconfiguration根据:
http://wiki.apache.org/httpd/PHP-FPM
我正在编写一个需要很长时间才能在内部虚拟主机上执行的脚本,但是如果脚本在30秒内执行,所有内容都将保持超时。
我的apache日志告诉我:
[Wed Apr 17 21:57:23.075175 2013] [proxy_fcgi:error] [pid 9263:tid 140530454267648] (70007)The timeout specified has expired: [client 58.169.202.172:49017] AH01075: Error dispatching request to :, referer:
当试图运行脚本时,我会在执行完30秒后收到503 Service Unavailable 。 从逻辑上讲,这意味着我有超时指令或设置为30秒,但我有这些在我的Vhost的configuration:
Timeout 600 <IfModule proxy_module> ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600 ProxyTimeout 600 </IfModule>
(php-fpm在我的端口9001上运行)
我也试着把httpd.conf的Timeout和ProxyTimeout没有区别。
似乎有另一个超时设置的某个特定于mod_proxy_fcgi ,但我找不到它。 我从官方tarball安装了Apache2的httpd,没有一个mods似乎有任何configuration文件。
如果任何人都可以指出我正确的方向,将不胜感激。
我在testing几个configuration参数后终于解决了这个问题。 我testing了两次解决scheme,删除了以前的所有更改。 我只需要一个参数来修复它。
对于最新版本的httpd和mod_proxy_fcgi,您可以简单地将timeout=添加到ProxyPassMatch行的末尾,例如:
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800
对于旧版本来说,这有点复杂,例如:
<Proxy fcgi://127.0.0.1:9000> ProxySet timeout=1800 </Proxy> ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1
我需要添加Proxy指令来将超时设置为30分钟。 在某些应用程序中,通常在运行数据库时,有10多分钟的执行例程。 我暂时将超时设置为30分钟,以确保完成。 在使用安装向导时特别有用,这需要花费太多时间(以我的愚见)。
顺便说一下,帮助我解决这个问题的初始input在以下URL地址中find 。
我想指出的是,虽然这个答案对旧版本来说很好,但是在最新版本的Apache 2.4中却出现了错误代码AH00526。 ProxyPass和ProxyPassMatch或<Proxy>和<ProxyMatch>不能在同一工作人员名称中一起使用。 这用于function很好,所以不知道是否由devise更改或如果它是一个错误。
无论哪种方式,你可以通过使用参数“timeout = 120”(或任何你想要的值)的ProxyPassMatch来解决这个问题,例如:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120
我有Apache 2.4.6,但修补程序的补丁是在Apache> = 2.4.8中提供的。 这里的关键是立即开始输出,以便Apache(mod_proxy_fcgi)认为连接是活动的。
例如,我正在使用PHP和我的AJAX调用的数据库查询需要> 30秒。 因为我知道总的响应将是“Content-Type:application / json”,所以我立刻发送这个头文件。
#1: Start output immediately #Note: Sending the header is innocuous # it can be changed later using the $replace parameter # (see #3) header( 'Content-Type: application/json' ); #2: Run slow query mysql_query( "SELECT * FROM giant_table" ); #3: Change header as needed header( 'Content-Type: application/csv', true ); #output content
不应该是:
<IfModule mod_proxy.c>
请确保php.ini设置max_execution_time也设置为600。 (检查活页上的phpinfo()以确保您看到实际使用的值)
正如Jenny所说,设置php-fpm设置
request_terminate_timeout 610s
(注意最后的s)
使用mod_proxy_fcgi本身并不需要太多configuration,就像你在apache页面上看到的一样。 http://httpd.apache.org/docs/current/mod/mod_proxy_fcgi.html
打开php-fpmdebugging日志logging也可以看到它在那里的时间。 http://php-fpm.org/wiki/Configuration_File (也打开catch_workers_output)
因为你使用的是Apache 2.4,所以打开mod_proxy和mod_proxy_fcgi模块的debugging级别日志logging。 非常好的function,只需打开你需要的模块: http : //httpd.apache.org/docs/current/mod/core.html#loglevel
如果这些没有帮助,张贴您的php-fpmconfiguration文件。
作为最后的手段,也许一些守护进程正在杀死漫长的运行过程?
我注意到你正在使用PHP-FPM。 我也使用它,但与Apache 2.4.6。
假设这个问题已经存在了一段时间,似乎mod_proxy_fcgi的超时值是硬编码的 。 我写了我在这里find的
既然你已经修复了Apache的timout设置,那不应该是问题。 第二个地方是任何networking设备,但是因为你是代理到你自己的服务器,这也不太可能。 所以余下的地方是在后端服务器。
呃php-pfm的configuration文件,寻找
; This is a hard kill switch on php execution. It ignores the ; max_execution_time that can be set/changed with php_ini. Basically ; it avoids timeout issues between apache and php-fpm. request_terminate_timeout=30
这应该设置为与apache中的超时设置相同或略低。
除了超时之外,请设置enablereuse = off。 我发现,当一些请求长时间运行的脚本将正常工作,其他人会被提前杀死。