使用 Apache mod_proxy_ajp 和 Tomcat 基於客戶端證書的負載平衡
目前,我正在使用 mod_proxy_ajp 對多個 Tomcat 伺服器的請求進行負載平衡。呼叫者使用客戶端證書和 ACL 進行身份驗證。這一直工作正常,呼叫者以均勻的速率路由到任一伺服器。現在我想為每個使用者預取和記憶體數據,所以每個 Tomcat 伺服器將為一組已知的使用者提供服務。所以我認為按字母順序拆分呼叫者會很好;名稱以 AM 開頭的使用者(CN 或 DN)轉到伺服器 1,名稱以
$$ N-Z $$轉到伺服器 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 的服務以接受不同的請求。
任何人都有這樣做的好方法嗎?
記憶體的有趣想法!讓我們看看我們是否可以讓它工作..
我有兩種選擇:一種效率更高,但我真的不知道它是否會起作用,另一種效率較低,但我有理由相信它會正常工作。
更有效的選項(更一般地說,使用類似客戶端證書來確定負載均衡器分配)的問題是,據我所知,在請求進入後無法改變 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
- 如果這對您的應用程序不起作用,那麼我們可以解決它。