如何在Nginx上使用FastCGI避免网关超时问题

214

我正在运行Django、FastCGI和Nginx。我正在创建一种API,允许用户通过XML发送数据,我将处理这些数据并返回每个节点的状态码。

问题在于,如果我处理XML的时间太长(超过60秒),Nginx会抛出504网关超时错误。

因此,我想设置Nginx,使得匹配位置/api的任何请求都不会超时120秒钟。哪个设置可以实现这一点。

我目前拥有的是:

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

编辑:我所拥有的并没有起作用 :)


7
您可以将超时时间设置为“2m”而不是“120”。 - Cenk Alti
1
数据没有被流式传输似乎很糟糕...也就是说,服务器需要在60秒或更长时间内开始响应似乎是不可接受的。 - Adam Gent
5个回答

257

代理超时适用于代理服务器,而不适用于FastCGI...

影响FastCGI超时的指令有client_header_timeout, client_body_timeout以及send_timeout

编辑: 考虑到nginx wiki上的内容,send_timeout指令负责设置响应的通用超时时间(这有点误导人)。对于FastCGI,我们需要使用fastcgi_read_timeout来影响FastCGI进程的响应超时时间


8
如果您正在使用uwsgi并且遇到此错误,则将uwsgi_read_timeout 600;设置为解决方法。 - Homer6
2
我的问题是(作为服务器管理员业余爱好者),我应该去哪里更改这个?httpd.conf文件? - jeffkee
2
如果有帮助的话,我的是在Media Temple的DV系统中的/etc/nginx/。 - jeffkee
Abdo 提供了一种很好的调试方式。如果您仍然遇到问题,您可能需要在 nginx.conf 中增加最大客户端消息大小 (client_max_body_size **M;)。 - Sam Grondahl
2
增加超时时间不是一个合适的解决方案。 - JazzCat
是的,uwsgi_read_timeout 600; 在 flask + uwsgi + nginx 中也解决了我的问题。 - Stan Zeez

25

对于那些在使用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;
}

3
我想人们之所以给它点了踩,是因为这个问题是关于 Django 的,但是你的答案却解决了我在 Rails + Unicorn 中遇到的网关超时问题 :) - ZiggyTheHamster

9
http nginx 部分(/etc/nginx/nginx.conf)中添加或修改以下内容:
keepalive_timeout 300s

在服务器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秒,会发生什么“不好”的事情吗? - utdev
没有出现任何问题,但是你的服务等待时间有点长。你可以根据自己的需要更改它的值。 - Jose Carlos Ramos Carmenates

1
在服务器代理中设置如下。
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;
       }
}

1
如果您使用独角兽。
查看服务器上的top。 独角兽现在可能正在使用100%的CPU。 这个问题有几个原因。
- 您应该检查HTTP请求,其中一些可能非常困难。 - 检查独角兽的版本。 可能您最近更新了它,并且出现了故障。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接