apache 在Docker Swarm部署中复制特定容器副本

siotufzp  于 2023-10-23  发布在  Apache
关注(0)|答案(2)|浏览(160)

我们有一个Java应用程序服务器运行在一个容器中,有2个副本。容器网络堆栈是Traefik。此外,我们有Apache HTTP服务器与GSSAPI模块的RISSSO身份验证。
Traefik是这样配置的:

services:
  app:
    ...
    deploy:
      mode: replicated
      replicas: 2
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik-public"
        - "traefik.http.routers.app.entrypoints=web"
        - "traefik.http.routers.app.rule=Host(`www.example.com`) && PathPrefix(`/`)"
        - "traefik.http.services.app.loadbalancer.server.port=8080"
        - "traefik.http.services.app.loadBalancer.sticky.cookie"
        - "traefik.http.services.app.loadBalancer.sticky.cookie.name=AppCookie"

  apache:
    ...
    deploy:
      mode: replicated
      replicas: 2
      labels:
        - "traefik.enable=true"
        - "traefik.docker.network=traefik-public"
        - "traefik.http.routers.apache.entrypoints=web"
        - "traefik.http.routers.apache.rule=Host(`www.example.com`) && Path(`/LogIn.form`)"
        - "traefik.http.services.apache.loadbalancer.server.port=80"
        - "traefik.http.services.apache.loadbalancer.server.port=8080"
        - "traefik.http.services.apache.loadBalancer.sticky.cookie"
        - "traefik.http.services.apache.loadBalancer.sticky.cookie.name=AppCookie"

Auth机制应该像这样工作:
1.客户端访问应用程序第一次。
1.如果没有会话存在,应用服务器将客户端重定向到“/LogIn.form”。

  1. Apache接收到“/LogIn.form”的请求,并与客户端进行GSSAPI协商。
  2. Apache将授权请求代理到应用程序服务器,并添加X-Remote-User标头。
    1.应用程序服务器通过Apache回复,添加自己的JSESSION cookie,重定向到自己的应用程序Web上下文。
    1.使用JSESSION cookie的客户端访问应用程序在会话中保持授权。
    如果Apache可以访问客户端访问的同一个应用程序服务器,那么这种机制就能很好地工作。在Kubernetes中,一个pod中的多个容器共享网络地址,因此Apache代理登录页面为http://localhost:8080,这是一个魅力。但是Docker Swarm环境是不同的,我想知道是否有一种方法可以将Apache指向它被重定向的同一个主机。
    以下哪种方法有效:
    1.由于应用服务器仅限于节点上的一个,如果有办法在同一节点上调用应用服务器,我们可以将Apache示例与应用服务器示例配对。有吗?
    1.也许我们可以从Traefik的粘性饼干中得到一些东西来知道主机最初被称为什么。
    1.也许Apache可以通过Traefik设置调用正确的应用服务器?
0pizxfdo

0pizxfdo1#

我在JSESSION cookie中找到了答案,其中包含内部服务器名称。

RewriteEngine On
RewriteCond %{HTTP_COOKIE} JSESSIONID=.*\.([^;]*)
RewriteRule ^ - [E=CALLEE:%1]
                                                                                                                                                                                  
ProxyPassInterpolateEnv On
ProxyPass "/bcdp/UserLogIn.form" "http://${CALLEE}:8080/bcdp/UserLogIn.form" interpolate

这使得Apache能够感知集群,并让它遵循提供JSESSION的初始主机。Apache现在可能不会与应用程序容器配对,并且始终可以在集群环境中找到原始应用程序。

9lowa7mx

9lowa7mx2#

是的,使用面向客户端的负载均衡器。负载均衡器有一个叫做“粘性”的特性,它允许客户端在断开连接的情况下连接到同一个前端。
NGINX可能是一个很好的解决方案。它具有负载平衡功能,并带有一个名为“启用会话持久性”的选项。有很多供应商提供虚拟或物理负载均衡器,并为本地解决方案提供付费维护和支持。
如果这是一个云解决方案,大多数云提供商也有会话持久性与他们的负载平衡器。

相关问题