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

目前,我正在使用mod_proxy_ajp将请求均衡到多个Tomcat服务器。 呼叫者使用客户端证书和ACL进行身份validation。 这一直工作正常,呼叫者以均匀的速度路由到任一服务器。 现在我想为每个用户预取和caching数据,所以每个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的服务来接受不同的请求。

任何人都有一个好办法做到这一点?

有趣的想法caching! 让我们看看我们是否可以得到它的工作..

我有几个select:一个会更有效率,但我真的不知道它是否会工作,效率不高,但我相当肯定会工作得很好。

更高效的选项(更一般地说,使用类似客户端证书来确定负载均衡器分配)的问题是,据我所知,在请求进入之后,无法在节点分配上改变mod_proxy_balancer的想法 – 可能是一些创造性的骇人听闻,可能会使它发生,但我没有提出任何更好的想法。 关键在于它正在redirect到它所处的位置,为的是获得代理的第一个请求的cookie,以获得正确的路由 – 而且我不确定这是否可行。 值得一试:

 RewriteEngine On RewriteCond %{ENV:BALANCER_ROUTE_CHANGED} 1 RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[am] [NC] RewriteRule ^(.*)$ /.$1 [R,CO=ROUTEID:route.1:.yourdomain.com] RewriteCond %{ENV:BALANCER_ROUTE_CHANGED} 1 RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[nz] [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} ^[am] [NC] RewriteRule ^/lookup((?:/.*|))$ ajp://svr1:8009/lookup$1 [P,L] RewriteCond %{SSL:SSL_CLIENT_S_DN} ^[nz] [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之后find了匹配的尾部斜线,以避免攻击者可以进入内部networking的恶意安全漏洞 – 如果这对您的应用程序无效,那么我们可以解决这个问题。