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

问题描述 投票:0回答:1

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

我使用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,大约是事情开始崩溃的时刻。

django nginx uwsgi
1个回答
0
投票

根据墨菲定律,花了好几天后,每次在我花时间提问之后,我都会弄明白。在我的uWSGI配置中,我有:

[uwsgi]
limit-as = 128

好吧,当它变得太大时,它正在杀死这个过程。奇怪的是在直接运行uWSGI时调用相同的uwsgi .ini文件,但是只有当Nginx调用它时才会超过128MB。

翻转。删除那条线,一切都很顺利。我一直在拖延,因为我知道这会发生。

© www.soinside.com 2019 - 2024. All rights reserved.