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


203

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

问题是,如果我花太长时间来处理XML,Nginx将抛出504网关超时-我认为该时间超过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;
    }

编辑:我有什么不工作:)


7
您可以将超时值设置为“ 2m”,而不是“ 120”。
恩克·阿尔蒂

1
似乎没有流传输数据似乎很糟糕……例如,使服务器在60秒或更长时间内开始响应,这似乎是不可接受的。
亚当·根特

Answers:


245

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

影响FastCGI的超时的指令是client_header_timeoutclient_body_timeoutsend_timeout

编辑:考虑到在nginx Wiki上找到的内容,send_timeout指令负责设置响应的一般超时时间(这有点误导)。对于FastCGI来说fastcgi_read_timeout,这会影响fastcgi进程响应超时

HTH。


8
对于使用uwsgi并出现此错误的任何人,uwsgi_read_timeout 600; 解决了我的问题。
Homer6

2
我的问题是(作为服务器管理员业余人员)我应该在哪里更改?httpd.conf文件?
jeffkee 2012年

2
如果有帮助,我的位置在Media Temple的DV系统的/ etc / nginx /处。
jeffkee 2012年

Abdo提供了一种调试的好方法。如果仍然遇到问题,则可能需要在nginx.conf中增加最大客户端消息大小(client_max_body_size ** M;)
Sam Grondahl

2
增加超时恕我直言不是正确的解决方案。
JazzCat

24

对于将Nginx与独角兽和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 2013年

4

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

keepalive_timeout 300s

servernginx部分(/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文件情况下127.0.0.1:9000(/etc/php/7.X/fpm/pool.d/www.conf)修改:

request_terminate_timeout = 300

希望对您有帮助。


如果我将时间更改为10000秒,会发生什么“不好”的事情吗?
utdev

不会发生什么不好,但是您的服务需要更多时间。您可以根据需要更改它的值。
何塞·卡洛斯·拉莫斯·卡门尼斯斯

1

如果您使用独角兽。

top您的服务器上查看。独角兽现在可能正在使用100%的CPU。此问题有多种原因。

  • 您应该检查HTTP请求,其中一些请求可能很难。

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


0

在服务器代理这样设置

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;
       }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.