【问题标题】:Setting up load-balancer based on authenticated users根据经过身份验证的用户设置负载均衡器
【发布时间】:2018-01-16 00:35:58
【问题描述】:

我正在尝试设置一个负载平衡器,该负载平衡器将重定向到特定版本的应用程序某些用户。到目前为止,我使用的是蓝/绿部署策略(所以一旦我制作了新版本的应用程序,我就会创建新环境并在那里重定向流量)。现在我想改变这种方法。我希望能够指定在身份验证后会看到新站点的用户(更有经验或其他),而其他用户仍将被重定向到旧站点。如果新版本出现问题,所有用户都会看到旧版本。目前我的负载平衡是在 apache 中进行的,并且身份验证是在应用程序级别完成的。那么这甚至可能吗?我知道我可以在应用程序中对其进行硬编码,但是如果新功能中存在错误并且新用户仍然被重定向到那里怎么办?然后我需要停止所有用户的应用程序并回滚到旧版本,我猜这很糟糕。我正在考虑使用外部 CAS,但是如果可能的话,我没有找到任何信息。所以我想问一下是否有可能,是否有任何工具(可能是一些 apache 插件)用于此目的?

【问题讨论】:

  • 您是在寻找专门在 apache 中工作的解决方案还是替代解决方案,即使用 nginx 也可以?
  • 什么都好。我假设 apache 或 nginx 不会让我这样做,因为首先我需要向应用程序或 CAS 验证用户。然后将具有特定角色的用户重定向到我的应用程序的新版本。
  • 未经身份验证的用户应该看到哪个版本的应用程序?如果这样的用户首先看到应用程序的旧版本,并且一旦获得授权,他就会被重定向到新版本,这样可以吗?
  • 我希望未经身份验证的用户看到旧版本。是的,那些“特殊”用户首先看到旧版本并在登录新版本后是可以的。基本上,重点是让更有经验的用户在将新版本部署为主版本之前对其进行测试。

标签: deployment load-balancing canary-deployment


【解决方案1】:

这是nginx 的有效解决方案

  1. 创建conf.d/balancer.conf
  2. 将代码放入其中(见下文)
  3. docker run -p8080:8080 -v ~/your_path/conf.d:/etc/nginx/conf.d openresty/openresty:alpine
  4. 使用curl 玩它

balancer.conf:

map $cookie_is_special_user $upstream {
    default http://example.com;
    ~^1$ http://scooterlabs.com/echo;
}

server {
    listen 8080;
    resolver 8.8.8.8;

    location / {
        proxy_pass $upstream;
    }
}

测试

curl --cookie "is_special_user=1" http://localhost:8080

它将返回 scooterlabs.com 的内容,转储它收到的请求

curl http://localhost:8080

生成 example.com 的内容

解释

  • 这个想法是,在您像往常一样获得授权后,您为后端应用程序视为特殊的用户设置一个特殊的cookie
  • 当然,只有当两个应用版本都在同一个域上提供时,它才会起作用,以便两个版本都能看到 cookie
  • 然后根据 cookie 值将它们平衡到所需的服务器
  • 您可以通过调整 nginx 配置文件轻松禁用此类路由
  • 使用这种方法,您可以提出更复杂的方案,例如在 1-10 范围内设置随机 cookie 值,然后逐渐切换配置文件中的一些 特殊 用户,即从这些用户开始值为 1,之后为 1-2 等

【讨论】:

  • 感谢您的回答,但对此有一些疑问/疑问(我可能是错的,并且不完全理解这个想法)。所以可以说我有 2 个版本的 Spring Boot 应用程序。对 app1 的成功身份验证会将我重定向到 app2,但我不会在那里进行身份验证,对吗? (使用 2 个单独的 tomcat 服务器,因此不会共享会话)。知道如何处理吗?我考虑过 CAS,但随后需要在 CAS 身份验证期间添加该 cookie,这需要使用 CAS 代码进行调整。
  • 是的,这个解决方案意味着您的会话在其他地方共享。我不确定 j2ee/spring/tomcat 世界和 spring.cas 处理会话的方式 - 问题中没有提到这些限制。即在 python 应用程序中,将会话存储在 memcached/redis 的某个位置是完全可以的,这样人们就可以安全地拥有应用程序的多个后端实例。
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 2023-04-04
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多