我正在使用WebSockets与前端进行通信的Flask应用程序。它在Amazon EC2上的nginx后面托管,并由uwsgi托管。Uwsgi和Nginx上的SocketIO烧瓶
这里是uwsgi配置我使用的服务,然后应用:从nginx的配置
[uwsgi]
plugins=python3,logfile
chdir=/srv/myapp/
master=true
home=/srv/myapp/.venv
module=application
callable=flask_app
uid=uwsgi
gid=myapp
socket=/srv/myapp/uwsgi.sock
chown-socket=uwsgi:myapp
chmod-socket=660
logto = /srv/myapp/logs/uwsgi.log
for-readline = /srv/myapp/.vars
env = %(_)
endfor =
而且摘录覆盖socketio端点:
location /socket.io/ {
proxy_set_header Host $http_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_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://unix:///srv/myapp/uwsgi.sock;
}
没有WebSockets的一切工作正常。本地(我正在使用Windows)一切都很完美 - 我只是在客户端添加了transport: ['websockets', 'polling']
以确保选择正确的协议。
本地我运行它作为Flask-SocketIO文档建议,也是我装eventlet
(我不知道为什么,但在Windows 64 gevent
包装与Werkzeug
开发服务器工作严重)。
当部署应用程序时,我只在浏览器中看到错误websocket.js:112 WebSocket connection to 'ws://myapp.com/socket.io/?EIO=3&transport=websocket' failed: Error during WebSocket handshake: Unexpected response code: 502
。在服务器端,我在uwsgi日志中有:invalid request block size: 21573 (max 4096)...skip
。缓冲区大小的增加不会改变。
在nginx的日志,我有:*413 upstream prematurely closed connection while reading response header from upstream, client: 171.6.248.10, server: localhost,, request: "GET /socket.io/?EIO=3&transport=websocket HTTP/1.1", upstream: "http://unix:///srv/myapp/uwsgi.sock:/socket.io/?EIO=3&transport=websocket", host: "myapp.com"
我尝试添加这些行uwsgi.ini:
gevent=1000
http-websockets=true
没有任何成功
这是什么,以及如何解决?
几条评论。 uwsgi中的'gevent'和'http-websockets'配置项是必需的。 WebSocket与uwsgi一起工作的唯一方法就是通过gevent。另外,由于gevent使用自己的WSGI服务器,与Werkzeug完全无关,所以我不理解你对Werkzeug dev服务器和gevent的引用。至于主要问题,你能否检查Flask-SocketIO选择的异步模式是否为'gevent_uwsgi'? – Miguel
@Miguel不幸的是我的应用程序使用Python3,而用于uwsgi的gevent插件(至少对于红帽)仍然只支持Python2.7 –
那么,没有gevent的uwsgi不是受支持的配置,您可能可以获得长轮询工作,但WebSocket是不可能的。你有没有尝试用'pip'安装uwsgi而不是使用你的操作系统打包的那个? – Miguel