使用PHP set_time_limit()防止nginx 504网关超时

时间:2013-04-14 17:47:03

标签: php nginx fastcgi

当我的PHP脚本运行时间超过平常时,我从nginx收到504超时消息。 set_time_limit(0)似乎没有阻止这一点!在nginx上运行php5-fpm时它不起作用吗?如果是这样,那么设定时间限制的正确方法是什么?

错误:

504 Gateway Time-out
nginx/1.2.7

11 个答案:

答案 0 :(得分:176)

有几种方法可以设置php-fpm的超时。在/etc/php5/fpm/pool.d/www.conf我添加了这一行:

request_terminate_timeout = 180

此外,在/etc/nginx/sites-available/default中,我将以下行添加到相关服务器的位置块中:

fastcgi_read_timeout 180;

整个位置块如下所示:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_read_timeout 180;
    include fastcgi_params;
} 

现在只需重新启动php-fpm和nginx,对于少于180秒的请求,不应再有超时。

答案 1 :(得分:39)

试试这个link,它有一个更好的解决方案来解决这个问题。所以步骤是:

  1. 打开位于nginx.conf目录中的/etc/nginx文件。
  2. http {部分下面添加以下代码:

    client_header_timeout 3000;
    client_body_timeout 3000;
    fastcgi_read_timeout 3000;
    client_max_body_size 32m;
    fastcgi_buffers 8 128k;
    fastcgi_buffer_size 128k;
    

    注意:如果已经存在,请按照更改值。

  3. 重新加载Nginx和php5-fpm。

    $ service nginx reload
    $ service php5-fpm reload
    

    如果错误仍然存​​在,请考虑增加值。

答案 2 :(得分:9)

您不能使用PHP来防止nginx发出超时。

要配置nginx以允许更多时间,请参阅proxy_read_timeout directive

答案 3 :(得分:7)

正确答案是在Nginx配置中增加 fastcgi_read_timeout
很简单!

答案 4 :(得分:3)

 sudo nano /etc/nginx/nginx.conf

将这些变量添加到nginx.conf文件中:

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}

然后重启:

service nginx reload

答案 5 :(得分:1)

您需要在ngx_http_proxy_module中添加额外的nginx指令(适用于nginx.conf),例如:

proxy_read_timeout 300;

基本上,nginx proxy_read_timeout指令会更改代理超时,FcgidIOTimeout用于安静太长的脚本,FcgidBusyTimeout用于执行时间过长的脚本。

此外,如果您使用的是FastCGI应用程序,请同时增加以下选项:

FcgidBusyTimeout 300
FcgidIOTimeout 250

然后重新加载nginx和PHP5-FPM。

的Plesk

在Plesk中,您可以将其添加到附加nginx指令下的 Web服务器设置中。

对于FastCGI,请检查 HTTP附加指令下的 Web服务器设置

请参阅:How to fix FastCGI timeout issues in Plesk?

答案 6 :(得分:0)

由于你使用的是php-fpm,你应该利用fastcgi_finish_request()来处理你知道可能需要更长时间的请求。

答案 7 :(得分:0)

使用php-fpm或类似的流程管理器时,使用set_time_limit(0)是没用的。

使用set_time_limit时底线不使用php-fpm,以增加执行超时,请检查tutorial

答案 8 :(得分:0)

在这种情况下可能会发生三种超时。可以看出,每个答案仅集中在这些可能性的一个方面。因此,我想把它写下来,这样以后再来这里的人就不必随意检查每个答案并获得成功,而无需知道哪个有效。

  1. 使请求者的请求超时-需要设置超时标头(请参见请求库中的标头配置)
  2. 在发出请求时 nginx超时(在转发到代理服务器之前),例如:正在上传大量文件
  3. 超时转发到代理服务器后,服务器不会及时回复nginx。例如:在服务器上运行的耗时脚本

因此,每个问题的修复方法如下。

  1. 设置超时标头,例如:在ajax中

$.ajax({
    url: "test.html",
    error: function(){
        // will fire when timeout is reached
    },
    success: function(){
        //do something
    },
    timeout: 3000 // sets timeout to 3 seconds
});

  1. nginx客户端超时

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
    
  2. nginx代理服务器超时

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }
    

因此,请使用您需要的那个。也许在某些情况下,您需要所有这些配置。 我需要。

答案 9 :(得分:0)

在长时间寻找这个问题的答案后,我看到了一件事。

我的应用程序还有一层:

  1. 负载均衡器(问题一直在这里)
  2. 网络服务器 (nginx)
  3. 应用程序 (php)

从 make 请求转义到 LB,我可以在 php 中使用“sleep”看到测试的成功响应。

答案 10 :(得分:-6)

我使用配置APACHE解决了这个问题! 所有方法(在本主题中)对我来说都是不正确的...然后我尝试使用chanche apache config:

Timeout 3600

然后我的脚本工作了!