在两个烧瓶服务器之间共享会话

Posted

技术标签:

【中文标题】在两个烧瓶服务器之间共享会话【英文标题】:Sharing sessions between two flask servers 【发布时间】:2017-08-10 08:03:39 【问题描述】:

我有一个带有两个烧瓶服务器的后端。一个处理所有 RESTfull 请求,一个是 flask-socketio 服务器。有没有办法在这两个应用程序之间共享会话变量(登录用户等)?如果这很重要,它们确实会在不同的端口上运行。

我如何理解它们通过客户端会话 cookie 工作的会话,所以这两个服务器不应该都可以访问这些信息吗?如果是怎么办?如果没有,有没有办法达到同样的效果?

【问题讨论】:

您可以使用简单的 Redis 缓存,为每个服务器编写一个脚本来访问存储和检索 cookie 的位置吗?您只需设置两台服务器中的一台(大部分时间不受控制的一台)以在发出请求时检查缓存... 这听起来像是一种方法,但我在想是否可以直接将两台服务器指向相同的会话存储路径......我对主(RESTfull)服务器的访问权限有限,所以没有侵入性将是最佳的 我自己绝对不知道该怎么做。我使用 python 和烧瓶作为推出实时数据分析项目(在非常简单的服务器端级别)的一种方式,并且对服务器的工作原理了解有限。我希望你能找到适合你的答案。 Redis,如果涉及到这一点,使用和安装非常简单......你可能没有管理员权限就可以做到(我工作中的测试环境是我们的 IT 人员不赞成的粗略地方)我在 3 分钟内安装没有管理员......在 AWS 上。 【参考方案1】:

有几种方法可以解决这个问题,具体取决于您如何设置两台服务器。

最简单的解决方案是让两台服务器在相同的域和端口上显示给客户端。例如,您可以将 www.example.com/socket.io 作为 Socket.IO 服务器的根,并将 www.example.com 上的任何其他 URL 转到您的 HTTP 服务器。为此,您需要使用反向代理服务器,例如 nginx。客户端不直接连接到您的服务器,而是通过单个端口连接到 nginx,并且 nginx 被配置为根据 URL 将请求转发到适当的服务器。

通过上述设置,两台服务器都暴露给同一域中的客户端,因此会话 cookie 将发送给两者。

如果您想让您的服务器与您的客户端分开显示,那么共享会话数据的一个不错的选择是切换到服务器端会话,存储在 Redis、memcache 等中。您可以使用 Flask-Session 来设置就这样吧。

希望这会有所帮助!

【讨论】:

我正在使用 Flask-Session 将两个应用程序的会话数据存储在 redis 上,并且它正在存储在 redis 中。如何跨应用访问会话数据?【参考方案2】:

我发现flask.session.sid = sid_from_another_domain 可以很好地处理单个子域的情况。

我有几个烧瓶应用程序具有单独的域名,例如 A.domain.com、B.domain.com 和 C.domain.com。 它们都是基于flask的,并且redis会话管理器连接到同一个redis服务器。

我想联合他们以立即登录并退出。

当我登录 A 并将其传递给域 B 时,我必须将会话 ID 与用户信息一起保存在 db 上。 这些域使用 oauth2 协议进行通信,在这种情况下我使用了 flask_dance。 并将其设置为 B 域上的flask.session.sid。 然后我可以确认这个实现工作正常。

【讨论】:

以上是关于在两个烧瓶服务器之间共享会话的主要内容,如果未能解决你的问题,请参考以下文章

两个域之间的会话共享

如何在两个 django 应用程序之间共享会话?

在两个不同的 Web 浏览器之间共享会话

在烧瓶中的路线和主要之间使用共享变量

在不同服务器上的 ReactJS 和 WIX Web 应用程序之间共享会话

2个托管服务器之间的共享会话