我正在尝试设置一个支持常规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"
您需要在您的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:
uwsgi
:pip uninstall uwsgi
sudo apt-get install libssl-dev
uwsgi
:pip install uwsgi
。如果您已经在其他位置安装了OpenSSL库,则可能会发现this discussion有用。