Python uwsgi&x2B;nginx+;烧瓶:上游提前关闭

Python 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.

我在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”,推荐人: “”

我喜欢部署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问题,还是两者都有

替换
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