2017-06-14 170 views
0

我正在使用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 

沒有任何成功

這是什麼,以及如何解決?

+0

幾條評論。 uwsgi中的'gevent'和'http-websockets'配置項是必需的。 WebSocket與uwsgi一起工作的唯一方法就是通過gevent。另外,由於gevent使用自己的WSGI服務器,與Werkzeug完全無關,所以我不理解你對Werkzeug dev服務器和gevent的引用。至於主要問題,你能否檢查Flask-SocketIO選擇的異步模式是否爲'gevent_uwsgi'? – Miguel

+0

@Miguel不幸的是我的應用程序使用Python3,而用於uwsgi的gevent插件(至少對於紅帽)仍然只支持Python2.7 –

+0

那麼,沒有gevent的uwsgi不是受支持的配置,您可能可以獲得長輪詢工作,但WebSocket是不可能的。你有沒有嘗試用'pip'安裝uwsgi而不是使用你的操作系統打包的那個? – Miguel

回答

0

這是不實際的回答我的問題,只是有點信息

我的應用程序使用Python 3和RedHat從EPEL提供Python3.4。儘管如此,UWSGI只能使用gevent來使用WebSockets。所以,正如@Miguel提到的那樣,只有一種方法 - 使用長輪詢。

解決方案

最後我應用服務器改爲Gunicorn投放的WebSockets箱子外面。