[尝试通过NGINX和uWSGI连接到WebSocket Flask服务器时的响应代码400

问题描述 投票:0回答:1

我正在尝试设置一个支持常规API调用和WebSocket连接的Flask服务器。所有流量都通过NGINX负载平衡器,NGINX反向代理进行路由,然后认为uWSGI以2种附庸在Emperor模式下运行-1种用于常规API,第二种用于WebSockets。与第一个连接的所有连接似乎都按预期工作。连接到第二个连接时,一些连接会通过,返回200(都包含轮询和websocket),但大多数情况下返回400。

NGINX反向代理配置:

upstream ws_server {
    server unix:/home/app_ws.sock fail_timeout=0;
}

location /socket.io {
    include uwsgi_params;
    uwsgi_read_timeout 60s;
    uwsgi_send_timeout 60s;
    uwsgi_connect_timeout 60s;
    proxy_read_timeout 60s;
    proxy_http_version 1.1;
    proxy_buffering off;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    uwsgi_ignore_client_abort on;

    uwsgi_pass ws_server;
}

NGINX负载均衡器配置

server {
    listen 80;
    server_name *********;

    real_ip_header X-Forwarded-For;
    set_real_ip_from 10.1.1.0/24;

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_set_header Accept-Encoding "";

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_buffering off;
    proxy_busy_buffers_size 128k;
    proxy_max_temp_file_size 2048m;
    proxy_temp_file_write_size 128k;

    proxy_buffer_size  128k;
    proxy_buffers 100  128k;

    location / {
        proxy_pass http://u2me-python-dev;
    }

uWSGI vassal config:

callable = app
need-app = true
chdir = /home/site/
chmod-socket = 666
cpu-affinity = 1
die-on-term = true
disable-logging = true
enable-threads = true

home = /home/.environments/site
lazy-apps = true
listen = 1024
master = true
pidfile = /home/app_ws_uwsgi
processes = 1
http-websockets = true
procname = u2me.andromeda-ws
socket =/home/app_ws.sock
threads = 1
worker-reload-mercy = 30
wsgi-file = wsgi.py

我已经尝试在NGINX负载平衡器中设置相同的“升级”设置,但是只产生了502。

NGINX错误日志

2019/08/01 15:33:59 [error] 484#0: *610 upstream prematurely closed connection while reading response header from upstream, client: 46.76.103.213, server: *********, request: "GET /socket.io/?EIO=3&transport=polling&t=MnDOnSk HTTP/1.1", upstream: "uwsgi://unix:/home/app_ws.sock:", host: "*********", referrer: "*********"

NGINX访问日志

46.76.103.213 - - [01/Aug/2019:16:26:29 +0200] "POST /socket.io/?EIO=3&transport=polling&t=MnDadM4&sid=112de3f4170f4db9ad55308b2ca1778d HTTP/1.1" 400 21 "*********" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
46.76.103.213 - - [01/Aug/2019:16:26:29 +0200] "GET /socket.io/?EIO=3&transport=websocket&sid=112de3f4170f4db9ad55308b2ca1778d HTTP/1.1" 400 21 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
46.76.103.213 - - [01/Aug/2019:16:26:29 +0200] "GET /socket.io/?EIO=3&transport=polling&t=MnDafi3 HTTP/1.1" 200 130 "*********" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
46.76.103.213 - - [01/Aug/2019:16:26:29 +0200] "GET /socket.io/?EIO=3&transport=polling&t=MnDaklK HTTP/1.1" 200 130 "*********" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36"
python nginx flask websocket uwsgi
1个回答
0
投票

您需要在您的uWSGI配置中直接启用gevent事件循环。

添加第一行:

gevent = 100

callable = app
need-app = true
chdir = /home/site/
chmod-socket = 666
cpu-affinity = 1
die-on-term = true
disable-logging = true
enable-threads = true

home = /home/.environments/site
lazy-apps = true
listen = 1024
master = true
pidfile = /home/app_ws_uwsgi
processes = 1
http-websockets = true
procname = u2me.andromeda-ws
socket =/home/app_ws.sock
threads = 1
worker-reload-mercy = 30
wsgi-file = wsgi.py

[gevent=N意味着将使用N个异步内核(doc)。

但是首先,您需要将其作为软件包安装到应用解释器中:

pip install gevent

注意,您需要uwsgi才能安装OpenSSL支持。否则,uwsgi将引发错误。要启用OpenSSL:

  1. 卸载uwsgipip uninstall uwsgi
  2. 安装OpenSSL开发人员库,例如对于Ubuntu:sudo apt-get install libssl-dev
  3. 安装uwsgipip install uwsgi

如果您已经在其他位置安装了OpenSSL库,则可能会发现this discussion有用。

© www.soinside.com 2019 - 2024. All rights reserved.