Apache2 代理超时

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 上运行)

我也试过把TimeoutProxyTimeout放在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 地址中找到的。

  • 我已经通过在 ProxyPassMatch 行的末尾添加参数“timeout=120”解决了上述问题。 (4认同)
  • 我还需要两件事:首先,您必须在全局 apache 配置文件中将“超时”和“代理超时”设置为比其他 FPM 超时更长的时间。其次,我的 FPM 池正在侦听 unix 套接字,我像这样使用 SetHandler:[ SetHandler "proxy:unix:/var/run/php/example.com-php7.0-fpm.sock|fcgi://localhost: 8000"]。但是 &lt;Proxy&gt; 匹配 SetHandler 行的 fcgi://localhost 部分(在 |... 之后的部分甚至没有实际使用!)而不是 unix:/var/run/ 部分。所以要为上述使用配置超时:&lt;Proxy fcgi://localhost:8000&gt; 而不是 &lt;Proxy unix:/var/run/... (2认同)

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)