Apache-2.2

使用 Apache mod_proxy_ajp 和 Tomcat 基於客戶端證書的負載平衡

  • January 6, 2012

目前,我正在使用 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- 如果這對您的應用程序不起作用,那麼我們可以解決它。

引用自:https://serverfault.com/questions/346233