140

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

错误:

504 Gateway Time-out
nginx/1.2.7
4

11 回答 11

215

有几种方法可以设置 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 秒的请求应该不会再有超时。

于 2013-07-07T10:48:31.103 回答
60

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

  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
    

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

于 2013-10-10T17:41:50.093 回答
15

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

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

于 2013-04-14T17:51:31.813 回答
14
 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
于 2017-12-23T06:54:52.923 回答
13

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

于 2016-10-19T14:37:46.780 回答
9

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

  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
    });
    
  2. nginx客户端超时

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

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

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

于 2019-03-07T13:31:52.227 回答
1

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

proxy_read_timeout 300;

基本上 nginxproxy_read_timeout指令会更改代理超时,FcgidIOTimeout适用于安静时间过长FcgidBusyTimeout的脚本,以及执行时间过长的脚本。

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

FcgidBusyTimeout 300
FcgidIOTimeout 250

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

普莱斯克

在 Plesk 中,您可以在Additional nginx 指令下的Web 服务器设置中添加它。

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

请参阅:如何修复 Plesk 中的 FastCGI 超时问题?

于 2016-04-06T23:27:47.243 回答
0

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

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

于 2014-06-27T08:10:43.317 回答
0

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

于 2013-04-15T16:20:22.903 回答
0

不要忘记查看您的 php-fpm 日志!

在我的 PHP 7.3 中,我遇到了:

警告:[pool www] 服务器达到 pm.max_children 设置 (5),考虑提高它

/etc/php/7.3/fpm/pool.d/www.conf我不得不将pm.max_children价值从5最高提高到50(我有时会做一些非常繁重的本地工作......)。

注意:请注意,它可能会使用更多 CPU!

于 2021-11-12T10:21:48.517 回答
0

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

我的应用程序还有一层:

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

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

于 2021-08-02T20:26:20.867 回答