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

use*_*709 9 python nginx flask uwsgi

我在我的烧瓶上创建了一个端点,它从数据库查询(远程数据库)生成一个电子表格,然后在浏览器中将其作为下载发送.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
Run Code Online (Sandbox Code Playgroud)

我的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;
       }
}
Run Code Online (Sandbox Code Playgroud)

这是一个nginx或uwsgi问题,还是两者兼而有之?

Iva*_*gai 15

正如@mahdix 所提到的,该错误可能是由于 Nginx 使用 uwsgi 协议发送请求而 uwsgi 在该端口上侦听 http 数据包造成的。

在 Nginx 配置中,您有类似的内容:

upstream org_app {
    server              10.0.9.79:9597;
}
location / {
    include         uwsgi_params;
    uwsgi_pass      org_app;
}
Run Code Online (Sandbox Code Playgroud)

Nginx 将使用 uwsgi 协议。但是如果uwsgi.ini你有类似的东西(或命令行中的等价物):

http-socket=:9597
Run Code Online (Sandbox Code Playgroud)

uwsgi会说http,出现问题中提到的错误。请参阅本机 HTTP 支持。

一个可能的解决方法是改为:

socket=:9597
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Nginx 和 uwsgi 将使用 uwsgi 协议通过 TCP 连接相互通信。

旁注:如果 Nginx 和 uwsgi 在同一个节点中,Unix 套接字将比 TCP 快。请参阅使用 Unix 套接字而不是端口。


tou*_*der 6

将nginx.conf更改为include

sendfile        on;
client_max_body_size 20M;
keepalive_timeout  0;
Run Code Online (Sandbox Code Playgroud)

有关完整示例,请参阅amazon linux上的自我答案uwsgi upstart


mah*_*dix 5

就我而言,问题是 nginx 正在使用 uwsgi 协议发送请求,而 uwsgi 正在该端口上侦听 http 数据包。因此,要么我必须更改 nginx 连接到 uwsgi 的方式,要么更改 uwsgi 以使用 uwsgi 协议进行侦听。

  • 您能否将解决方案的详细信息添加到您的答案中?我相信您要么需要使用`uwsgi_pass`然后将`socket`值设置为uwsgi .ini文件中的端口或nginx中的`proxy_pass`以及将`http-socket`设置为uwsgi中的端口? (3认同)