Flask socket.io gunicorn聊天应用陷入重定向循环

时间:2019-02-20 19:34:41

标签: flask https socket.io gunicorn

我有一个基本的flask socket.io聊天应用程序,其构建与本示例https://github.com/miguelgrinberg/Flask-SocketIO-Chat

相同

我可以先使用gunicorn mychat:app --worker-class eventlet -w 1 --bind 0.0.0.0:5000 --reload然后再运行autossh -M 0 -R myappname:80:localhost:5000 serveo.net并点击相应的serveo.net网址来运行该应用程序。

我正在尝试将其部署在具有HTTPS的负载均衡器后面的AWS EC2实例上。在EC2实例上,我按如下所示安装了nginx:https://flask-socketio.readthedocs.io/en/latest/#using-nginx-as-a-websocket-reverse-proxy(单个示例,而不是多个节点示例)。

当我转到从负载均衡器目标组中定义的URL并进入聊天室时,我看到在浏览器的“网络”选项卡中,有大量快速轮询请求,这些请求始终给出200,然后是301。如果我在另一个选项卡中加入聊天室,则用户将无法彼此发送消息。

我的配置出了什么问题?

1 个答案:

答案 0 :(得分:0)

深入研究后,我发现了。我的主机example.com指向带有一堆侦听器规则的负载均衡器。我这样做的目的是,如果path = / mychatapp / *,则转发到运行该应用程序的ec2实例。很好,但是socket.io正在使用host = example.com进行呼叫,因此它命中了example.com/socket.io/etcetcetc ...如果path = / socket.io / *,我添加了另一个负载平衡器侦听器规则,然后还将其转发到ec2实例。可以解决。

此解决方案非常笨拙,因为这意味着我无法运行第二个socket.io应用。更好的答案是将默认调用从“ /socket.io”更改为“ /mychatapp/socket.io”,这样我就不需要其他侦听器规则了。我尝试了几种方法来做到这一点,但是没有用。由于这是一个小项目,因此我将坚持使用此解决方案。