使用 Apache mod_proxy_ajp 和 Tomcat 基于客户端证书进行负载平衡

使用 Apache mod_proxy_ajp 和 Tomcat 基于客户端证书进行负载平衡

目前,我正在使用 mod_proxy_ajp 将请求负载平衡到多个 Tomcat 服务器。使用客户端证书和 ACL 对调用者进行身份验证。这一直运行良好,调用者以均匀的速率路由到任一服务器。现在我想预取并缓存每个用户的数据,因此每个 Tomcat 服务器将为一组已知用户提供服务。所以我认为按字母顺序拆分调用者是可以的;名称(CN 或 DN)以 AM 开头的用户转到服务器 1,名称以 [NZ] 开头的用户转到服务器 2。但我不知道如何实现这一点。

目前我有:

<Proxy balancer://lb-service>
   BalancerMember ajp://svr1:8009 loadfactor=1 
   BalancerMember ajp://svr2:8009 loadfactor=1 
</Proxy>

<Location /lookup>
   ProxyPass balancer://lb-service/lookup
</Location>

我正在考虑使用 mod_rewite 来更改 URL 以包含用户的 CN,但似乎无法做到这一点。

我几乎一直使用 apache mod_proxy_ajp 和 Tomcat 进行负载平衡。我可以更改运行 Tomcat 的服务以接受不同的请求。

有人有好办法来做到这一点吗?

答案1

缓存的想法很有趣!让我们看看能否让它发挥作用。

我有几个选择:一个效率更高,但我真的不知道它是否会起作用;另一个效率较低,但我确信它会很好地起作用。

更高效的选项(更一般地,使用客户端证书之类的东西来确定负载平衡器分配)的问题在于,据我所知,在请求进入后,没有办法改变 mod_proxy_balancer 对节点分配的想法 - 可能有一些创造性的黑客技术可以实现这一点,但我暂时想不出任何更好的想法。关键在于,它会重定向到它所在的同一位置,以便为第一个被代理的请求设置 cookie,从而获得正确的路由 - 我不知道这是否会起作用。值得一试:

RewriteEngine On

RewriteCond %{ENV:BALANCER_ROUTE_CHANGED} 1
RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[a-m] [NC]
RewriteRule ^(.*)$ /.$1 [R,CO=ROUTEID:route.1:.yourdomain.com]

RewriteCond %{ENV:BALANCER_ROUTE_CHANGED} 1
RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[n-z] [NC]
RewriteRule ^(.*)$ /.$1 [R,CO=ROUTEID:route.2:.yourdomain.com]

<Proxy balancer://lb-service>
    BalancerMember ajp://svr1:8009 loadfactor=1 route=1
    BalancerMember ajp://svr2:8009 loadfactor=1 route=2
    ProxySet stickysession=ROUTEID
</Proxy>

<Location /lookup>
   ProxyPass balancer://lb-service/lookup
</Location>

如果这不起作用,那么这里有 B 计划;每次只需匹配客户端证书的 DN。这会给每个请求增加额外的开销,但总体而言对性能的影响应该不会太大。

<Proxy */lookup>
    RewriteEngine On

    RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[a-m] [NC]
    RewriteRule ^/lookup((?:/.*|))$ ajp://svr1:8009/lookup$1 [P,L]

    RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[n-z] [NC]
    RewriteRule ^/lookup((?:/.*|))$ ajp://svr2:8009/lookup$1 [P,L]

    # This will take care of any other orphan requests (say, those with no client
    # cert) - we'll just lump those on server 1; if there's a lot then we can do
    # something else to balance randomly (like just leave the current config there)
    RewriteRule ^/lookup((?:/.*|))$ ajp://svr1:8009/lookup$1 [P,L]
</Proxy>

我将此与尾随斜杠进行匹配,/lookup以避免攻击者可以进入您的内部网络的严重安全漏洞 - 如果这对您的应用程序不起作用,那么我们可以解决它。

相关内容