首先,我已经阅读了本复活节周末与此主题相关的每个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,大约是事情开始崩溃的时刻。
根据墨菲定律,花了好几天后,每次在我花时间提问之后,我都会弄明白。在我的uWSGI配置中,我有:
[uwsgi]
limit-as = 128
好吧,当它变得太大时,它正在杀死这个过程。奇怪的是在直接运行uWSGI时调用相同的uwsgi .ini文件,但是只有当Nginx调用它时才会超过128MB。
翻转。删除那条线,一切都很顺利。我一直在拖延,因为我知道这会发生。