Django + uWSGI + Nginx立即导致上游过早关闭的连接

时间:2019-04-22 14:23:42

标签: django nginx uwsgi

首先,我可能已经阅读了这个复活节周末与此主题相关的所有stackoverflow帖子。例如。 upstream prematurely closed connection (uwsgi + nginx + django)不能解决我的问题,因为那是糟糕的代码,甚至没有通过manage.py runserver运行。大多数帖子都是关于超时的。在小于30KB的文件上立即 引发此错误。我在Nginx和uWSGI上的所有超时都设置为默认值60s。这不是超时问题,但可能是缓存问题。

我使用openpyxl将数据库中的一些信息写入.xlsx文件。当我返回文件时,它大约为27KB,大约有50%的机会不抛出错误。如果它较大,则每次都会失败;如果它较小,则每次都可以。所有其他网页对该网站都适用。这是错误消息:

2019/04/21 20:14:52 [error] 19712#19712: *46 upstream prematurely closed connection while reading response header from upstream, client: ipaddress, server: request: "GET / HTTP/1.1", upstream: "uwsgi://unix:////var/run/uwsgi.sock:", host: "www.mysite.com"

可以通过 manage.py runserver 成功下载文件。当我直接启动uWSGI时,它也成功运行。唯一不起作用的是Nginx将请求传递给uWSQI,然后Nginx在检索响应时立即失败。因此,我一直在浏览Nginx文档,试图找到一些东西。

这是我的Nginx设置,设置一个缓存区域:

uwsgi_cache_path /var/www/my_site/public/nginx_uwsgi_temp levels=1:2 keys_zone=myzone:64m inactive=10m;

虚拟主机部分,尝试从http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html

中进行一系列失败的尝试
# Finally, send all non-media requests to the Django server.
location / {
    uwsgi_pass django;
    # the uwsgi_params file you installed
    include /home/somefolders/uwsgi_params;

    # http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
    # Timeouts when talking to uWSGI
    # proxy_read_timeout 60s; # Default 60s
    # proxy_send_timeout 60s; # Default 60s
    # proxy_connect_timeout 60s; # Default 60s
    # Trying uwsgi protocol, within uwsgi .ini set "protocol = uwsgi"
    # http://nginx.org/en/docs/http/ngx_http_uwsgi_module.html
    uwsgi_read_timeout 60s; # Default value 60s
    uwsgi_send_timeout 60s; # Default value 60s
    # uwsgi_cache
    # uwsgi_buffering on;
    # uwsgi_buffer_size 8k;
    # uwsgi_max_temp_file_size 1024m;
    # uwsgi_temp_path /var/www/public/nginx_uwsgi_temp 1 2;
    # client cache
    uwsgi_cache myzone;
    # uwsgi_cache_revalidate on;
    # uwsgi_cache_key $uri;
    # uwsgi_cache_valid any 10m;want
    # add_header X-Cache-Status $upstream_cache_status ;
    uwsgi_buffer_size 320k;
    uwsgi_buffers 8 320k;
    uwsgi_busy_buffers_size 320k;
    uwsgi_next_upstream off;
}

我可能会拨错树,但我的所有尝试都指向某些Nginx缓存配置。

我发现有趣的是,默认情况下Nginx设置为:

uwsgi_buffers 8 4k

大约8 * 4 = 24kb,大约是事物开始崩溃的时刻。

1 个答案:

答案 0 :(得分:0)

根据墨菲法则,在花了几天时间之后,每次我花时间问一个问题后,我都会弄清楚。 在我的uWSGI配置中,我有:

[uwsgi]
limit-as = 128

当它太大时,它会终止该进程。 奇怪的是,当直接运行uWSGI时,直接调用相同的uwsgi .ini文件,但是只有Nginx调用时,它才超过128MB。

翻转。删除该行,一切正常。 我一直拖延询问原因,因为我知道这会发生。