2017-09-18 76 views
0

我想用套接字io将事件发送到一个瓶颈服务器。但是当我通过nxginx代理部署我的应用程序时,事件不会到达。Nginx + socketio:未到达事件

我的瓶服务器app.py看起来是这样的:

from flask_socketio import SocketIO 

app = Flask(__name__) 
app.config['SECRET_KEY'] = 'secret!' 
socketio = SocketIO(app) 

@app.route('/') 
def index(): 
    return "this is the index function" 

@socketio.on('message') 
def handle_message(message): 
    print('received message: ' + message) 

if __name__ == '__main__': 
    socketio.run(app,debug=True) 

事件是从客户端这样的发送:

var socket = io('http://my.ip.address.it'); 
... 
socket.emit('message', 'here is my message 1'); 

当我部署我的本地主机上的服务器工作原理。但是当我通过nginx将它部署在EC2实例上时,偶尔会发送来自客户端的事件。

nginx的代理的配置是这样的:

server { 
    listen 80; 
    server_name my.ip.add.it; 

    location/{ 
     include proxy_params; 
     proxy_pass http://127.0.0.1:8000; 
    } 

    location /socket.io { 
     include proxy_params; 
     proxy_http_version 1.1; 
     proxy_buffering off; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "Upgrade"; 
     proxy_pass http://127.0.0.1:8000/socket.io; 
    } 
} 

我这样开始我的服务器应用程序:

gunicorn app:app -b 127.0.0.1:8000 

我如何设置我的瓶服务器是否正确?

+1

SocketIO从WebSockets向长轮询,然后查询自动降级,如果有问题。如果发生这种情况,你可能会从前端的SocketIO客户端得知。 – jwg

+0

它看起来像它,因为我看到:'POST http://my.ip.add.it/socket.io/?EIO=3&transport=polling&t=LwVSz8l&sid=4c6a4a2ebb3a4faebfbf3c451924a1ac 400(BAD REQUEST)''。当我禁用轮询时,我得到一个websocket握手错误。任何想法如何解决这个问题? – bear

+1

我会查看/var/log/nginx/error.log和gunicorn日志(默认情况下发送到stderr)并查看是否可以找到此400错误。如果你发现它在gunicorn,应该有一个追溯或错误信息。如果您没有在gunicorn中找到它,那么nginx错误日志中可能会有某些内容解释请求失败的原因。 – jwg

回答

1

您需要将Socket.IO配置添加到nginx。见https://flask-socketio.readthedocs.io/en/latest/#using-nginx-as-a-websocket-reverse-proxy的细节,但这里是从该链接的例子:

server { 
    listen 80; 
    server_name _; 

    location/{ 
     include proxy_params; 
     proxy_pass http://127.0.0.1:5000; 
    } 

    location /socket.io { 
     include proxy_params; 
     proxy_http_version 1.1; 
     proxy_buffering off; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "Upgrade"; 
     proxy_pass http://127.0.0.1:5000/socket.io; 
    } 
} 
+0

我试图将Socket.IO部分添加到您提供的链接中建议的nginx配置中(请参阅我编辑的文章),但仍然会得到相同的行为。任何想法我仍然做错了什么? – bear

+0

您需要查看浏览器,nginx和服务器上的日志以查看消息丢失的位置。 Socket.IO连接是否发生?如果是,升级到WebSocket会发生吗? – Miguel