web-dev-qa-db-ja.com

Apachemod_proxy_ajpとTomcatを使用したクライアント証明書に基づく負荷分散

現在、mod_proxy_ajpを使用して、複数のTomcatサーバーへのリクエストの負荷を分散しています。発信者は、クライアント証明書とACLを使用して認証されます。これは正常に機能しており、発信者はいずれかのサーバーに均等な速度でルーティングされます。ここで、ユーザーごとにデータをプリフェッチしてキャッシュしたいので、各Tomcatサーバーは既知のユーザーセットにサービスを提供します。ですから、発信者をアルファベット順に分割するのは良いことだと思います。 A-Mで始まる名前(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を含めることを検討していますが、それを機能させることができないようです。

負荷分散にApachemod_proxy_ajpとTomcatを使用するのはかなり行き詰まっています。 Tomcatを実行しているサービスを変更して、さまざまな要求を受け入れることができます。

誰かがこれを行うための良い方法がありますか?

1
John in MD

キャッシングの面白いアイデア!それを機能させることができるかどうか見てみましょう。

私にはいくつかのオプションがあります。1つはより効率的ですが、それが機能するかどうかは本当にわかりません。もう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の後の末尾のスラッシュに一致するものがあります。これがアプリケーションで機能しない場合は、回避できます。

1
Shane Madden