【发布时间】:2013-12-07 15:48:46
【问题描述】:
我希望有一个前端服务器,我的客户端可以在其中连接,并根据客户端(透明地)重定向到另一个将处理特定客户端需求的 Flask 应用程序(例如,可以有不同的应用程序)。
我还希望能够随时添加/删除/重新启动这些后端客户端,而无需为其他客户端杀死主服务器。
我希望客户:
- 未检测到后端有其他服务器(URL应该是同一主机)
- 在重定向到其他进程时不必重新输入凭据
最好的方法是什么?
【问题讨论】:
我希望有一个前端服务器,我的客户端可以在其中连接,并根据客户端(透明地)重定向到另一个将处理特定客户端需求的 Flask 应用程序(例如,可以有不同的应用程序)。
我还希望能够随时添加/删除/重新启动这些后端客户端,而无需为其他客户端杀死主服务器。
我希望客户:
最好的方法是什么?
【问题讨论】:
您描述的前端服务器本质上就是所谓的reverse proxy。
反向代理接收来自客户端的请求并将它们转发到客户端无法直接访问的第二行内部服务器。通常,根据请求 URL 的某些方面来决定将请求转发到哪个内部服务器。例如,您可以为每个内部应用程序分配不同的子域。
在反向代理收到来自内部服务器的响应后,它会将其转发给客户端,就好像它是它自己的响应一样。内部服务器的存在不会向客户端透露。
解决身份验证很简单,只要您的所有内部服务器共享相同的身份验证机制和用户数据库即可。每个请求都将带有身份验证信息。例如,这可能是由登录请求、直接用户凭据或某种类型的身份验证令牌设置的会话 cookie。在所有情况下,您都可以在所有应用程序中以相同的方式验证登录。
Nginx 是一种流行的 Web 服务器,可以很好地用作反向代理。
【讨论】:
听起来您想要为一组具有单个入口点的服务端点设置单点登录。
我会考虑将我的所有服务部署为 Flask 应用程序,而不知道如何构建它们。他们只知道所有对资源的请求都需要某种与之相关的凭据。您传递这些凭据的方式可能会有所不同。您可以使用FAS Flask Auth Plugin 之类的东西来处理身份验证。或者您可以做一些更简单的事情,例如将提供给您的入口服务的凭据打包到其他服务的后续请求的 HTTP 标头中。 Flask.request.headers 在您的后续服务中将允许您访问正确的标头以传递给您的身份验证服务。
在细节方面有很多方法可以采用,但我认为这种通用架构应该适合你。
【讨论】: