文件下载期间Gunicorn超时

时间:2019-05-31 23:00:38

标签: python django python-3.x nginx gunicorn

我正在使用 nginx 作为反向代理,以便能够访问我的Django API并提供静态文件。 我的Django API使用的是 gunicorn

我有一个端点,允许用户下载csv文件。我按照此处的说明进行操作,流式处理大型CSV文件:https://docs.djangoproject.com/en/2.2/howto/outputting-csv/

这是nginx的配置:

upstream docker-api {
    server api;
}

server {
    listen 443 ssl;
    server_name xxxx.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to//privkey.pem;
    include /path/to/options-ssl-nginx.conf;
    ssl_dhparam /path/to/ssl-dhparams.pem;


    location /static {
        autoindex on;
        alias /static/;
    }

    location /uploads {
        autoindex on;
        alias /uploads/;
    }

    location / {
        proxy_pass         http://docker-api;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

这是我用来启动 gunicorn 服务器的命令:

gunicorn my_api.wsgi -b 0.0.0.0:80 --enable-stdio-inheritance -w 2 -t 180 -k gevent

当我尝试下载文件时,Gunicorn总是在3分钟后使我的请求超时。它不应使流式HTTP响应超时。

2 个答案:

答案 0 :(得分:0)

问题出在您的Gunicorn命令上。

让我们看看:

  

gunicorn my_api.wsgi -b 0.0.0.0:80 --enable-stdio-heritance -w 2 -t 180 -k gevent

您的gunicorn命令上的

-t代表timeout,以秒为单位,并且您的gunicorn工作者超时,因为您已将超时设置为180秒(3分钟)。

  

当我尝试下载文件时,Gunicorn总是在3分钟后使我的请求超时。

要解决此问题,您可以简单地增加超时时间,例如,以下gunicorn命令会将超时时间设置为5分钟:

  

gunicorn my_api.wsgi -b 0.0.0.0:80 --enable-stdio-heritance -w 2 -t 300 -k gevent

查看文档以获取更多信息:http://docs.gunicorn.org/en/stable/settings.html#timeout

答案 1 :(得分:0)

此错误通常由两件事引起:

  1. Nginx超时:您应在其中将这两行代码添加到 Nginx文件:

    • 首先,转到您在以下目录中创建的文件(在我的情况下为ng serve --open

$ nano / etc / nginx / sites-available / myproject

  • 文件的myproject部分应如下所示:(请注意 超时部分):

location /

  • 然后重新启动Nginx:

$ systemctl start nginx

  1. gunicorn超时:转到确切的目录:

$ nano /etc/systemd/system/gunicorn.service

  • location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; proxy_connect_timeout 300s; proxy_read_timeout 300s; }添加到文件中--timeout 300下的位置。要获得更多帮助,请查看link下的整个文件:

[service]

  • 接下来,重新启动gunicorn:

$ systemctl守护程序重新加载

$ systemctl重新启动gunicorn.socket gunicorn.service