目前,我正在使用 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
以避免攻击者可以进入您的内部网络的严重安全漏洞 - 如果这对您的应用程序不起作用,那么我们可以解决它。