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


116

当我的PHP脚本运行时间比平时长时,我从nginx收到504超时消息。set_time_limit(0)似乎并不能阻止这种情况!在nginx上运行php5-fpm时不起作用吗?如果是这样,设置时限的正确方法是什么?

错误:

504 Gateway Time-out
nginx/1.2.7

Answers:


193

您可以通过多种方式设置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秒就不会再有超时了。


2
如果其他人想知道,我的默认设置(nginx + php5-fpm)为60秒,因此如果您在60秒后看到脚本的“网关超时”,则应添加“ fastcgi_read_timeout”设置
Michael Nguyen

1
我已经尝试了好几天了,@ pymkin的答案对我有用。对于像我这样的其他业余爱好者,他们想知道如何重新启动nginx和php5-fpm,请运行以下两个命令:sudo service nginx restart和sudo service php5-fpm restart我的网站,而不是服务器上所有网站的配置。
帕梅拉2014年

4
可悲的是,无论我fastcgi_read_timeout在该location块中设置了什么,它在60秒后仍会超时。
斯宾塞·威廉姆斯

这应该是公认的答案。尝试了很多解决方案,但仅此有效。我使用的是laravel homestead,并且发生504网关超时错误,因此可以解决。
Anbu369 '19

如果使用Laravel,则需要在location处理php脚本而不是docroot 的块中进行设置。
瑞安·杜瓦尔

50

试试这个链接,它有一个更好的解决方案。因此,步骤如下:

  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

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


1
这没有找到原因,只是增加了直到出错的时间。但是更好的办法是找到为什么它会加载这么长时间的解决方案。当在localhost上时,我是唯一的客户端,并且加载时间如此长,以至于在开发时根本无法等待。
Darius.V 2014年

16
问题不是要问脚本运行缓慢的原因,而是要让服务器等待更长的时间。有时您需要运行特殊的脚本来执行需要很长时间的任务,这并不是一件坏事。
2016年

更新的(以上)链接:codetweet.com/nginx/…–
nadavkav

2
对于那些可能想知道合法花费那么多时间的人来说,例如可能是来自Web界面的安装脚本,该脚本试图建立与数据库的连接,然后创建许多初始表并用数据填充它。可能需要一段时间才能做出回应。
imme

请注意,这些全局设置将被中的每个站点设置覆盖/etc/nginx/sites-available/mysite.com
Mac

11

您不能使用PHP阻止nginx发出的超时。

要配置nginx允许更多时间,请参阅proxy_read_timeout指令


这解决了我所遇到的问题,即504将开始出现在我的无业游民的盒子上(使用vaprobash)。
安迪·弗莱明

2
我相信只有在使用Nginx作为代理服务器时,此答案才适用。如果您使用Nginx作为主要的Web服务器(使用PHP-FPM),则此方法将无效。
2016年

10

正确的答案是增加Nginx配置中的fastcgi_read_timeout
就那么简单!


7
 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

4

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

  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;
    
    }

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


1

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

proxy_read_timeout 300;

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

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

FcgidBusyTimeout 300
FcgidIOTimeout 250

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

普列斯克

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

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

请参阅:如何解决Plesk中的FastCGI超时问题?


是不是FcgidBusyTimeout变量只为Apache的存在?
斯拉维克

0

由于您使用的是php-fpm,因此您应该利用fastcgi_finish_request()来处理可能会花费更长时间的请求。


-1

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

使用set_time_limit时不要使用底线php-fpm,要增加执行超时,请查看本教程


8
可能会在此处提供答案的一些说明,并且如果链接过期,此答案可能会变得过时。
Lakshmi 2014年

-7

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

Timeout 3600

然后我的脚本工作了!


5
问题是nginx,如果您在使用Apache时遇到问题,应该进行搜索。
hogan

问题是在Nginx和php-fpm而不是Apache上。
凯文·卡布鲁
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.