ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在运行 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 秒或更长时间内开始响应似乎是不可接受的。

z
zgoda

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

影响 FastCGI 超时的指令是 client_header_timeoutclient_body_timeoutsend_timeout

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


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

对于将 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 的网关超时问题:)
J
Jose Carlos Ramos Carmenates

http nginx 部分 (/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;

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

request_terminate_timeout = 300

我希望能帮助你。


如果我将时间更改为 10000 秒,会发生什么“坏事”吗?
不会发生什么坏事,但您的服务会等待更多时间。您可以根据需要更改它的值。
P
Pavel Kalashnikov

如果你使用独角兽。

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

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

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


K
Kamil Dąbrowski

在这样的服务器代理集中

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