wyq*_*syq 25 php mod-proxy httpd.conf php-fpm apache-2.2
我有 Apache2 与 PHP + PHP-FPM 配置根据:
http://wiki.apache.org/httpd/PHP-FPM
我正在编写一个脚本,需要很长时间才能在内部 Vhost 上执行,但一直超时,如果脚本在 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:
Run Code Online (Sandbox Code Playgroud)
尝试运行脚本时,我在503 Service Unavailable执行时间刚好 30 秒后得到了一个。从逻辑上讲,这意味着我有一个超时指令或设置为 30 秒,但我在 Vhost 的配置中有这些:
Timeout 600
<IfModule proxy_module>
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/home/pyrokinetiq/scripts/$1 timeout=600
ProxyTimeout 600
</IfModule>
Run Code Online (Sandbox Code Playgroud)
(php-fpm 对我来说在端口 9001 上运行)
我也试过把Timeout和ProxyTimeout放在httpd.conf没有区别的地方。
似乎有另一个特定于 的超时设置mod_proxy_fcgi,但我找不到它。我从官方 tarball 安装了 Apache2 httpd,似乎没有一个 mod 带有任何配置文件。
如果有人能指出我正确的方向,我将不胜感激。
小智 34
在测试了几个配置参数后,我终于解决了这个问题。我对该解决方案进行了两次测试,删除了之前的所有更改。我只需要一个参数来修复它。
对于最新版本的 httpd 和 mod_proxy_fcgi,您可以简单地添加timeout=到ProxyPassMatch行尾,例如:
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1 timeout=1800
Run Code Online (Sandbox Code Playgroud)
对于旧版本,它有点复杂,例如:
<Proxy fcgi://127.0.0.1:9000>
ProxySet timeout=1800
</Proxy>
ProxyPassMatch ^/(.+\.php.*)$ fcgi://127.0.0.1:9000/<docroot>/$1
Run Code Online (Sandbox Code Playgroud)
我需要添加 Proxy 指令以将超时设置为 30 分钟。在一些应用中,通常在操作数据库时,有一些例程可能需要10分钟以上才能执行。我临时将超时设置为 30 分钟以确保它们完成。在使用安装向导时特别有用,这需要太多时间(以我的拙见)。
顺便说一下,帮助我解决这个问题的初始输入是在以下URL 地址中找到的。
Ste*_*dam 10
我想指出的是,虽然这个答案对旧版本很有效,但它在 Apache 2.4 的最新版本下会中断,错误代码为 AH00526。ProxyPassandProxyPassMatch或<Proxy>and<ProxyMatch>不能在同一个工人名称中一起使用。这曾经运行得很好,所以不知道这是设计更改还是错误。
无论哪种方式,您都可以仅使用带有参数“timeout=120”(或任何您想要的值)的 ProxyPassMatch 来解决此问题,例如:
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9001/path/to/webroot/$1 timeout=120
Run Code Online (Sandbox Code Playgroud)
小智 7
我有 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84628 次 |
| 最近记录: |