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

Nyx*_*nyx 109 php fastcgi nginx

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

错误:

504 Gateway Time-out
nginx/1.2.7
Run Code Online (Sandbox Code Playgroud)

pym*_*kin 185

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

request_terminate_timeout = 180
Run Code Online (Sandbox Code Playgroud)

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

fastcgi_read_timeout 180;
Run Code Online (Sandbox Code Playgroud)

整个位置块看起来像这样:

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;
} 
Run Code Online (Sandbox Code Playgroud)

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

  • 可悲的是,无论我在`location`块中设置`fastcgi_read_timeout`,它仍然会在60秒后超时. (4认同)
  • 如果其他人想知道,我的默认值(nginx + php5-fpm)是 60 秒,所以如果你看到脚本的“网关超时”@ 60 秒,应该添加“fastcgi_read_timeout”设置 (2认同)

arp*_*arp 48

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

  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;
    
    Run Code Online (Sandbox Code Playgroud)

    注意:如果已存在,请更改值.

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

    $ service nginx reload
    $ service php5-fpm reload
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 问题不是要求缓慢脚本的原因,而是要求一种方法使服务器等待更长时间.有时你需要运行特殊的脚本来执行需要很长时间的任务,这并不是件坏事. (12认同)
  • 这并不能找到原因,它只是增加了错误的次数。但更好的办法是找到解决方案,为什么它加载这么长时间。当在本地主机上时,我是唯一的客户端,它加载的时间太长,开发时根本不适合等待。 (2认同)
  • 对于那些可能想知道什么会合法地花费这么多时间的人来说,它可能是例如来自 Web 界面的安装脚本,它试图连接到数据库,然后创建许多初始表并用数据填充它......可能需要相当长的时间才能得到回应。 (2认同)

Bar*_*art 10

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

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

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

tfo*_*ont 8

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


Gay*_*hne 8

在这种情况下可能发生三种超时。可以看出,每个答案都只关注这些可能性的一个方面。所以,我想把它写下来,这样将来来这里的人就不需要在不知道哪个有效的情况下随机检查每个答案并获得成功。

  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
});
Run Code Online (Sandbox Code Playgroud)

  1. nginx 客户端超时

    http{
         #in seconds
        fastcgi_read_timeout 600;
        client_header_timeout 600;
        client_body_timeout 600;
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. nginx 代理服务器超时

    http{
      #Time to wait for the replying server
       proxy_read_timeout 600s;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

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


kab*_*bus 6

 sudo nano /etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)

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

http {  
  # .....
  proxy_connect_timeout       600;
  proxy_send_timeout          600;
  proxy_read_timeout          600;
  send_timeout                600;
}
Run Code Online (Sandbox Code Playgroud)

然后重启:

service nginx reload
Run Code Online (Sandbox Code Playgroud)