Python uwsgi&x2B;nginx+;烧瓶:上游提前关闭
我在flask上创建了一个端点,该端点从数据库查询(远程数据库)生成电子表格,然后在浏览器中作为下载发送。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”,推荐人: “” 我喜欢部署uwsgiPython uwsgi&x2B;nginx+;烧瓶:上游提前关闭,python,nginx,flask,uwsgi,Python,Nginx,Flask,Uwsgi,我在flask上创建了一个端点,该端点从数据库查询(远程数据库)生成电子表格,然后在浏览器中作为下载发送。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.
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问题,还是两者都有 替换
uwsgi_pass 0.0.0.0:5002代码>带有uwsgi_通道127.0.0.1:5002代码>或更好地使用unix套接字。更改nginx.conf以包括
sendfile on;
client_max_body_size 20M;
keepalive_timeout 0;
有关完整示例,请参见“自我回答”此错误消息背后似乎有许多原因。我知道您正在使用uwsgi\u pass
,但是对于那些在使用proxy\u pass
时长请求有问题的人,在uwsgi上设置http timeout
可能会有所帮助(这不是harakiri设置)。我通过传递socket timeout=65
(uwsgi.ini文件)或--socket timeout=65
(uwsgi命令行)uwsgi中的选项。我们必须根据web流量检查不同的值。uwsgi.ini文件中的该值套接字超时=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
设置,或者更简单、更合理的方法是使用--HTTP keepalive
()当uwsgi正在该端口上侦听http数据包时
在Nginx配置中,您会遇到如下情况:
upstream org_app {
server 10.0.9.79:9597;
}
location / {
include uwsgi_params;
uwsgi_pass org_app;
}
Nginx将使用uwsgi协议。但是如果在uwsgi.ini
中,您有类似的内容(或命令行中的等效内容):
uwsgi将使用http,出现问题中提到的错误。请参阅
一个可能的解决方案是:
socket=:9597
在这种情况下,Nginx和uwsgi将通过TCP连接使用uwsgi协议相互通信
旁注:如果Nginx和uwsgi在同一个节点中,Unix套接字将比TCP更快。请参阅。此问题有许多潜在原因和解决方案。在我的情况下,后端代码运行时间太长。修改这些变量为我修复了此问题
Nginx:
proxy\u-connect\u-timeout
,proxy\u-send\u-timeout
,fastcgi\u-send\u-timeout
,fastcgi\u-read\u-timeout
,keepalive\u-timeout
,uwsgi-read\u-timeout
,uwsgi-send\u-timeout
,uwsgi-socket-keepalive>
uWSGI:限制post
我曾经遇到同样的错误,结果是我忘记了“包含uWSGI_参数”。或者检查nginx conf下的uwsgi_参数
文件,是否可以在回答中添加解决方案的详细信息?我相信您需要使用uwsgi_pass
,然后将socket
值设置为uwsgi.ini文件中的端口或nginx中的proxy_pass
,并将http socket
设置为uwsgi的港口?
socket=:9597