我在我的烧瓶上创建了一个端点,它从数据库查询(远程数据库)生成一个电子表格,然后在浏览器中将其作为下载发送。 Flask不会抛出任何错误。 Uwsgi不抱怨。
但是当我检查nginx的error.log时,我看到了很多
2014/12/10 05:06:24 [错误] 14084#0:* 239436上游过早关闭连接,同时从上游读取响应头,客户端:34.34.34.34,服务器:me.com,请求:“GET / download / export .csv HTTP / 1.1“,上游:”uwsgi://0.0.0.0:5002“,主机:”me.com“,推荐人:”https://me.com/download/export.csv“
我像uwsgi一样部署
uwsgi --socket 0.0.0.0:5002 --buffer-size=32768 --module server --callab app
我的nginx配置:
server {
listen 80;
merge_slashes off;
server_name me.com www.me.cpm;
location / { try_files $uri @app; }
location @app {
include uwsgi_params;
uwsgi_pass 0.0.0.0:5002;
uwsgi_buffer_size 32k;
uwsgi_buffers 8 32k;
uwsgi_busy_buffers_size 32k;
}
}
server {
listen 443;
merge_slashes off;
server_name me.com www.me.com;
location / { try_files $uri @app; }
location @app {
include uwsgi_params;
uwsgi_pass 0.0.0.0:5002;
uwsgi_buffer_size 32k;
uwsgi_buffers 8 32k;
uwsgi_busy_buffers_size 32k;
}
}
这是一个nginx或uwsgi问题,还是两者兼而有之?
将nginx.conf更改为include
sendfile on;
client_max_body_size 20M;
keepalive_timeout 0;
请参阅自我答案uwsgi upstart on amazon linux以获取完整示例
正如@mahdix所提到的,错误可能是由于Nginx使用uwsgi协议发送请求,而uwsgi正在该端口上侦听http数据包。
在Nginx配置中,你有类似的东西:
upstream org_app {
server 10.0.9.79:9597;
}
location / {
include uwsgi_params;
uwsgi_pass org_app;
}
Nginx将使用uwsgi协议。但是如果在uwsgi.ini
中你有类似的东西(或在命令行中它的等价物):
http-socket=:9597
uwsgi会说http,并出现问题中提到的错误。见native HTTP support。
可能的解决方法是:
socket=:9597
在这种情况下,Nginx和uwsgi将通过TCP连接使用uwsgi协议相互通信。
旁注:如果Nginx和uwsgi位于同一节点,则Unix套接字将比TCP快。见using Unix sockets instead of ports。
在我的情况下,问题是nginx正在使用uwsgi协议发送请求,而uwsgi正在该端口上侦听http数据包。所以要么我必须改变nginx连接到uwsgi的方式,要么改变uwsgi以使用uwsgi协议进行监听。
用uwsgi_pass 0.0.0.0:5002;
替换uwsgi_pass 127.0.0.1:5002;
或更好地使用unix套接字。
似乎很多原因可以支持这个错误消息。我知道你正在使用uwsgi_pass
,但是对于那些在使用proxy_pass
时遇到长问题的人来说,在uWSGI上设置http-timeout
可能有所帮助(它不是harakiri设置)。
我通过在uwsgi中传递socket-timeout = 65
(uwsgi.ini文件)或--socket-timeout=65
(uwsgi命令行)选项来修复此问题。我们必须检查不同的值取决于网络流量。 uwsgi.ini文件中的这个值socket-timeout = 65
适用于我的情况。
我在Elastic Beanstalk单容器Docker WSGI应用程序部署中遇到了相同的偶发错误。在环境上游配置的EC2实例上看起来像:
upstream docker {
server 172.17.0.3:8080;
keepalive 256;
}
使用此默认上游简单负载测试,如:
siege -b -c 16 -t 60S -T 'application/json' 'http://host/foo POST {"foo": "bar"}'
...在EC2上导致约70%的可用性。其余的是由上游过早关闭连接引起的502错误,同时从上游读取响应头。
解决方案是从上游配置中删除keepalive
设置,或者更容易和更合理的是,使用uWSGI
(--http-keepalive
)在available since 1.9侧启用HTTP keep-alive。