【问题标题】:Multiple backend servers accessible from a Flask server可从 Flask 服务器访问多个后端服务器
【发布时间】:2013-12-07 15:48:46
【问题描述】:

我希望有一个前端服务器,我的客户端可以在其中连接,并根据客户端(透明地)重定向到另一个将处理特定客户端需求的 Flask 应用程序(例如,可以有不同的应用程序)。

我还希望能够随时添加/删除/重新启动这些后端客户端,而无需为其他客户端杀死主服务器。

我希望客户:

  • 未检测到后端有其他服务器(URL应该是同一主机)
  • 在重定向到其他进程时不必重新输入凭据

最好的方法是什么?

【问题讨论】:

    标签: python web nginx flask


    【解决方案1】:

    您描述的前端服务器本质上就是所谓的reverse proxy。

    反向代理接收来自客户端的请求并将它们转发到客户端无法直接访问的第二行内部服务器。通常,根据请求 URL 的某些方面来决定将请求转发到哪个内部服务器。例如,您可以为每个内部应用程序分配不同的子域。

    在反向代理收到来自内部服务器的响应后,它会将其转发给客户端,就好像它是它自己的响应一样。内部服务器的存在不会向客户端透露。

    解决身份验证很简单,只要您的所有内部服务器共享相同的身份验证机制和用户数据库即可。每个请求都将带有身份验证信息。例如,这可能是由登录请求、直接用户凭据或某种类型的身份验证令牌设置的会话 cookie。在所有情况下,您都可以在所有应用程序中以相同的方式验证登录。

    Nginx 是一种流行的 Web 服务器,可以很好地用作反向代理。

    【讨论】:

      【解决方案2】:

      听起来您想要为一组具有单个入口点的服务端点设置单点登录。

      我会考虑将我的所有服务部署为 Flask 应用程序,而不知道如何构建它们。他们只知道所有对资源的请求都需要某种与之相关的凭据。您传递这些凭据的方式可能会有所不同。您可以使用FAS Flask Auth Plugin 之类的东西来处理身份验证。或者您可以做一些更简单的事情,例如将提供给您的入口服务的凭据打包到其他服务的后续请求的 HTTP 标头中。 Flask.request.headers 在您的后续服务中将允许您访问正确的标头以传递给您的身份验证服务。

      在细节方面有很多方法可以采用,但我认为这种通用架构应该适合你。

      【讨论】:

      • 感谢您的回答,我想我想走的路是:拥有一个处理登录的前端服务器,创建会话cookie或将会话存储在共享数据库中,然后重定向客户端根据需要到其他服务器。我想最好是让 nginx 将几个不同的 URL 重定向到不同的进程,不是吗?
      • 您可以这样做,或者您也可以为其他服务器针对共享数据库、LDAP 等使用的每个新请求提供票证、令牌等来验证用户身份。只是您想要执行此操作的抽象级别的问题。
      猜你喜欢
      • 1970-01-01
      • 2014-04-04
      • 2016-06-14
      • 2013-03-23
      • 2012-12-07
      • 1970-01-01
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多