uwsgi + nginx + flask:上游过早关闭

时间:2014-12-10 08:23:17

标签: python nginx flask uwsgi

我在我的烧瓶上创建了一个端点,它从数据库查询(远程数据库)生成电子表格,然后在浏览器中将其作为下载发送。 Flask不会抛出任何错误。 Uwsgi并没有抱怨。

但是当我查看nginx的error.log时,我看到了很多

  

2014/12/10 05:06:24 [错误] 14084#0:* 239436过早上游   从上游读取响应头时关闭连接,客户端:   34.34.34.34,server:me.com,request:" GET /download/export.csv HTTP / 1.1",upstream:" 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问题,还是两者兼而有之?

9 个答案:

答案 0 :(得分:6)

将nginx.conf更改为包含

sendfile        on;
client_max_body_size 20M;
keepalive_timeout  0;

有关完整示例,请参阅自我回答uwsgi upstart on amazon linux

答案 1 :(得分:2)

在我的情况下,问题是nginx正在发送带有uwsgi协议的请求,而uwsgi正在该端口上侦听http数据包。所以要么我必须改变nginx连接到uwsgi的方式,要么改变uwsgi以使用uwsgi协议进行监听。

答案 2 :(得分:1)

uwsgi_pass 0.0.0.0:5002;替换为uwsgi_pass 127.0.0.1:5002;或更好地使用unix套接字。

答案 3 :(得分:1)

似乎有很多原因可以支持这个错误消息。我知道您使用的是uwsgi_pass,但对于那些在使用proxy_pass时遇到长请求问题的用户,在uWSGI上设置http-timeout可能会有所帮助(这不是harakiri设置)。

答案 4 :(得分:1)

如@mahdix所述,该错误可能是由于当uwsgi在该端口上侦听http数据包时,Nginx使用uwsgi协议发送了请求。

在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将通过uwsgi协议通过TCP连接相互通信。

侧面说明:如果Nginx和uwsgi在同一节点中,则Unix套接字将比TCP更快。参见using Unix sockets instead of ports

答案 5 :(得分:0)

我通过在uwsgi中传递socket-timeout = 65(uwsgi.ini文件)或--socket-timeout=65(uwsgi命令行)选项来修复此问题。我们必须检查不同的值取决于网络流量。 uwsgi.ini文件中的此值socket-timeout = 65适用于我的情况。

答案 6 :(得分:0)

我在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保持活动,并使用{{ 1}}(available since 1.9)。

答案 7 :(得分:0)

有很多潜在的原因和解决方案。就我而言,后端代码花费的时间太长。修改这些变量对我来说就是固定的。

Nginx: proxy_connect_timeoutproxy_send_timeoutproxy_read_timeoutfastcgi_send_timeoutfastcgi_read_timeoutkeepalive_timeoutuwsgi_read_timeoutuwsgi_send_timeout,{{ 1}}。

uWSGI:uwsgi_socket_keepalive

答案 8 :(得分:0)

我通过恢复到 pip3 install uwsgi 解决了这个问题。

我正在尝试同时使用 Ubuntu 和 Amazon Linux 进行设置。我最初使用了一个虚拟环境,并且 pip3 install uwsgi 两个系统都运行良好。后来,我确实在关闭虚拟环境的情况下继续设置。在 Ubuntu 上,我使用 pip3 install uwsgi 和 Amazon Linux yum install uwsgi -y 进行安装。这就是我问题的根源。

Ubuntu 工作正常,但不适用于 Amazon Linux

修复,

yum remove uwsgipip3 install uwsgi 重新启动,它工作正常。