Nginx + uWSGi + Django长任务错误网关错误

时间:2019-03-12 14:03:19

标签: django nginx uwsgi

在我的django视图之一中,我的任务很长,需要120-200秒才能生成响应。

对于此特定视图,Nginx在记录后的错误消息出现1分钟后引发502 Bad Gateway

[error] 7719#7719: *33 upstream prematurely closed connection while reading response header from upstream,

这是我的Nginx配置:

upstream DjangoServer {
    server      127.0.0.1:8000;
    keepalive   300;
}
location / {
    include             proxy_params;
    proxy_pass          http://DjangoServer;
    allow               all;
    proxy_http_version  1.1;
    proxy_set_header    X-Cluster-Client-Ip $remote_addr;

    client_max_body_size    20M;
    keepalive_timeout       300;
    proxy_connect_timeout   300;
    proxy_send_timeout      300;
    proxy_read_timeout      300;
    send_timeout            300;
}

这是我的uWSGI配置:

uid=www-data
gid=www-data
http=127.0.0.1:8000
http-keepalive=300
master=1
vacuum=1
workers=2
threads=5
log-5xx=1

注意:

  • Nginx和uWSGI对于所有其他视图都可以正常工作。
  • Django开发服务器可以毫无问题地运行任务。
  • 在Nginx 502错误发生之后,uWSGI会继续在后台运行并完成作业(根据视图中的打印语句)。
  • 如果我尝试通过浏览器连接到uWSGI,则过一会儿(少于120秒)它将显示ERR_EMPTY_RESPONSE

您可以承担这样的任务

def long_task_view(request):
    start_time = time.time()
    print(start_time)
    # doing stuff
    time.sleep(130)
    print(time.time() - start_time)
    return HttpResponse("The result")

1 个答案:

答案 0 :(得分:0)

您可以尝试增加Nginx的超时时间:

vim /etc/nginx/nginx.conf

将此添加到http:

http {
     ...
     fastcgi_read_timeout 300;
     ...
}

但是最佳实践是创建一个异步过程来处理所采用的方法。我通常会芹菜做异步任务。