如何在 Nginx 上使用 FastCGI 防止网关超时

Posted

技术标签:

【中文标题】如何在 Nginx 上使用 FastCGI 防止网关超时【英文标题】:How do I prevent a Gateway Timeout with FastCGI on Nginx 【发布时间】:2010-10-08 09:32:12 【问题描述】:

我正在运行 Django、FastCGI 和 nginx。我正在创建一种 API,有人可以通过 XML 发送一些数据,我将处理这些数据,然后为每个发送过来的节点返回一些状态代码。

问题是,如果我处理 XML 的时间过长,Nginx 会抛出 504 Gateway Time-out -- 我认为超过 60 秒。

所以我想设置 Nginx,这样如果任何与位置 /api 匹配的请求都不会超时 120 秒。什么设置可以做到这一点。

到目前为止我所拥有的是:

    # Handles all api calls
    location ^~ /api/ 
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    

编辑:我没有工作:)

【问题讨论】:

您可以将超时值设置为“2m”而不是“120”。 数据没有被流式传输似乎很糟糕......即服务器在 60 秒或更长时间内开始响应似乎是不可接受的。 【参考方案1】:

代理超时很好,对于代理,而不是对于 FastCGI...

影响 FastCGI 超时的指令是 client_header_timeoutclient_body_timeoutsend_timeout

编辑:考虑到 nginx wiki 上的内容,send_timeout directive 负责设置响应的一般超时(这有点误导)。对于 FastCGI,fastcgi_read_timeout 会影响 FastCGI process response timeout。

【讨论】:

对于任何使用 uwsgi 并出现此错误的人,uwsgi_read_timeout 600;解决了我的问题。 我的问题是(作为服务器管理员业余爱好者)我该去哪里改变这个? httpd.conf 文件? 如果有帮助,我在 Media Temple 的 DV 系统的 /etc/nginx/ 中。 Abdo 提供了一种很好的调试方式。如果还是有问题,可能需要在 nginx.conf 中增加最大客户端消息大小 (client_max_body_size **M;) 增加超时恕我直言不是一个合适的解决方案。【参考方案2】:

对于那些使用 nginx 和 unicorn 和 rails 的用户,超时很可能在您的 unicorn.rb 文件中

在 unicorn.rb 中设置一个较大的超时时间

timeout 500

如果您仍然遇到问题,请尝试在 nginx 的上游设置 fail_timeout=0,看看这是否能解决您的问题。这是出于调试目的,在生产环境中可能很危险。

upstream foo_server 
        server 127.0.0.1:3000 fail_timeout=0;

【讨论】:

我认为人们反对它是因为这是关于 Django 的,但是你的回答解决了我使用 Rails + Unicorn 的网关超时问题 :)【参考方案3】:

httpnginx部分(/etc/nginx/nginx.conf)添加或修改:

keepalive_timeout 300s

server nginx 部分 (/etc/nginx/sites-available/your-config-file.com) 添加以下行:

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

php文件中的case 127.0.0.1:9000 (/etc/php/7.X/fpm/pool.d/www.conf) 修改:

request_terminate_timeout = 300

希望对你有帮助。

【讨论】:

如果我将时间更改为 10000 秒,会发生什么“坏事”吗? 不会发生什么坏事,但您的服务会等待更多时间。您可以根据需要更改它的值。【参考方案4】:

如果你使用独角兽。

查看您服务器上的top。 Unicorn 现在可能正在使用 100% 的 CPU。 这个问题有几个原因。

您应该检查您的 HTTP 请求,其中一些可能非常困难。

检查独角兽的版本。可能是您最近更新了它,但出现了问题。

【讨论】:

【参考方案5】:

在这样的服务器代理设置中

location / 

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            

在这样的服务器 php 设置中

server 
        client_body_timeout 120;
        location = /index.php 

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       

【讨论】:

以上是关于如何在 Nginx 上使用 FastCGI 防止网关超时的主要内容,如果未能解决你的问题,请参考以下文章

Windows下配置Nginx + PHP环境

ubuntu上安装nginx+mysql+php5-fpm(PHP5 - FastCGI Process Manager)

Nginx + fastcgi 截断问题

请教如何配置nginx的fastcgi-cache

Nginx 之 fastcgi配置

使用 Nginx/Fastcgi 在子 URL 下部署 django