首页 > 解决方案 > Flask socket.io gunicorn 聊天应用程序卡在重定向循环中

问题描述

我有一个基本的烧瓶 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 url。

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

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

我的配置有什么问题?

标签: flaskhttpssocket.iogunicorn

解决方案


挖了一圈后,我想通了。我的主机 example.com 指向具有一堆侦听器规则的负载均衡器。我这样做是为了如果 path=/mychatapp/*,然后转发到运行应用程序的 ec2 实例。这很好,但是 socket.io 正在使用 host=example.com 进行调用,所以它正在访问 example.com/socket.io/etcetc... 如果 path=/socket.io/*,我添加了另一个负载均衡器侦听器规则,然后也将其转发到 ec2 实例。这行得通。

这个解决方案非常老套,因为这意味着我无法运行第二个 socket.io 应用程序。更好的答案是以某种方式将默认调用从“/socket.io”更改为“/mychatapp/socket.io”,这样我就不需要另一个监听器规则。我尝试了几种方法来做到这一点,但没有奏效。由于这是一个小项目,我会坚持这个解决方案。


推荐阅读