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

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

错误:

504 Gateway Time-out
nginx/1.2.7
324242 次浏览

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

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

由于您正在使用 php-fpm,因此应该利用 fastcgi _ Finish _ request ()来处理可能需要更长时间的请求。

有几种方法可以设置 php-fpm 的超时:

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. 打开位于 /etc/nginx目录中的 nginx.conf文件。
  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
    

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

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

底线是在使用 php-fpm时不要使用 set_time_limit,为了增加执行超时,请选中此 教程

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

proxy_read_timeout 300;

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

另外,如果你正在使用 FastCGI 应用程序,也增加这些选项:

FcgidBusyTimeout 300
FcgidIOTimeout 250

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

普莱斯克

在 Plesk,你可以把它加入到 abc0中的 附加的 nginx 指令

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

见: 如何解决 Plesk 的快速 cgi 超时问题?

正确的答案是在 Nginx 配置中增加 Fastcgi _ read _ timeout

 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

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

  1. 来自请求者的超时请求-需要设置超时标头(请参阅请求库中的标头配置)
  2. 超时从 在发出请求的时候(之前转发到代理服务器)例如: 巨大的文件正在上传
  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. 客户端超时

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

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

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

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

在我的应用程序中还有一层:

  1. 负载平衡器(问题一直在这里)
  2. Webserver (nginx)
  3. 申请(php)

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

别忘了查看 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!