Flask socket.io gunicorn 聊天应用卡在重定向循环中

Flask socket.io gunicorn chat app stuck in redirect loop

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

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

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

我的配置有什么问题?

在四处挖掘之后,我想通了。我的主机 example.com 指向一个带有一堆侦听器规则的负载均衡器。我这样做是为了如果 path=/mychatapp/*,则转发到 ec2 实例 运行ning 应用程序。这很好,但是 socket.io 正在与 host=example.com 进行调用,所以它正在命中示例。com/socket.io/etcetcetc...我添加了另一个负载均衡器侦听器规则如果路径=/socket.io/*,然后也转发给ec2实例。这行得通。

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