この問題は、RadWare AppDirectorを使用することで解決できます。また、(完全を期すために)以下のコメントの優れた結果に従って、Apache mod_securityを使用することで解決できる可能性があります。
AppDirectorソリューションの場合、同じバックエンドサーバーにマッピングする2つのファームを作成できると思います。これらのファームには、さまざまな基準と運用条件を適用できます。1つのファームは「デフォルト」になり、もう1つは「セッション」として定義したURIに応答します。後者の場合、ロードバランサーで受け入れるセッションの量に制限があります。
これからは、次の2つの理由から、「ログイン」を「セッション」に置き換えます。
- ユーザーが認証されるという望ましい状態を明確に定義するため、あいまいさを回避できます。
- AppDirectorユーザーガイドとGUIは、「接続」という用語を再定義して、すべての実用的な目的で「セッション」と同じ意味を持つようにしています。以下を参照してください。これにより、混乱を避けることができます。
「ログインした」ファームが選択した接続制限に達した場合に、申し訳ありませんページを表示することもできます。
方法を説明する前に、AppDirector製品の操作経験がないことを明確に示す必要がありますが、競合するわずかに高度ではないロードバランサーを毎日管理します。私が使用する製品は、このシナリオをすぐに実行できます。AppDirectorユーザーガイドと、AppDirectorについても同様であることを示唆するオンラインドキュメントについての情報を見つけました。ただし、概念は似ていますが、用語は異なります。私は言葉遣いに関してローマ時代の行動をしているだけであり、あまりにも明らかに無知なバカであることがなく、それをかなり正しくすることを望んでいます。
最大の障害は、アクティブな顧客でない限り利用できないマニュアルへのアクセスを取得することでした。いくつかグーグルすることで、古すぎない古いバージョンを見つけることができました。ナレッジベースの記事とこのリンクRadware AppDirector – Configuration:Basic Applicationも見つけました。
以下は、主にユーザーガイドで解釈されるソリューションドラフトです。
ロードバランサへのクライアントエントリは、「デフォルト」セッションと「ログインセッション」の両方を接続するために使用されるVIPを介して行われます。これは、ユーザーガイドのp.99にあるL4ポリシーを通じて実現されます。
"When AppDirector receives the first packet of a session destined to a
Virtual IP address, it searches for a Layer 4 Policy that matches the
Layer 4 Protocol, Destination port, Source IP, etc. Then, based on this
information, AppDirector selects the farm allocated to this service and
the best server for the task from that farm, and forwards the packet to
that server.
L4ポリシーは、適切なファームを選択するために使用されるL7ポリシーに関連付けることができます。L7ポリシープロセスは、ユーザーガイドp.104に記載されています。
"The Layer 7 content aware decision making mechanism allows you to have
a single point of entry to the site, and provides differentiated service
for different user groups.
A Layer 7 decision is made using a mechanism called Delayed Binding.
When Delayed Binding is used, AppDirector first performs a TCP handshake
with the client to receive the HTTP request. AppDirector parses the HTTP
request’s data, usually HTTP headers, and performs the load balancing
decision. Only after that, does AppDirector select a farm and a server.
Lastly, AppDirector initiates a TCP handshake with the server and
forwards the traffic to it
[...]
When Layer 7 Policies are used, farm selection is based on matching the
request data with a list of Layer 7 Policies defining the Layer 7
parameters differentiating the service. The process of server selection
within the farm can also be content-based, using a third Layer 7
parameter."
L7の動作を定義するために使用できる方法については、p.106で説明しています。これらのうち、適切な方法を選択して、「デフォルト」のファームではなく「ログインした」ファームへのルーティングを選択できます。
"Methods are the basic building blocks for Layer 7 service selection.
They define content by which traffic is differentiated. You can use
the same Method to select one or more services. The following Method
Types are available:
- URL: Looks for a specified host name and/or path in the HTTP request.
- File Type: Looks for a specified File Type in the HTTP request.
- Header Field: Looks for a specified Header Field in the HTTP request.
- Cookie: Looks for a specified Cookie in the HTTP request.
- Regular Expression: Looks for a regular expression anywhere in the
HTTP request. AppDirector supports Posix 1002.3 regular expressions;
the string can be up to 80 characters.
- Text: Looks for a text string anywhere in the HTTP request."
基本アプリケーションリンクで見られるように、たとえば、異なるファームへのルーティングのためにURIパターンを評価するL7ポリシーを作成できます。作成されたURIパターン '^ / login?= true'および '^ / loggedin'は、「ログインした」ファームにルーティングできます。構成されたパターン '^ / logout'(および他のすべてのURI)は、同様に「デフォルト」のファームにルーティングできます。
ファームはユーザーガイドp.121で定義されています。「AppDirectorファームは、同じサービスを提供するネットワークサーバーのグループです[...]複数のサービスを提供するサーバーは、複数のファームで使用できます。」
サーバーは、バックエンドサーバーの定義を2つのレイヤーに分割することでさらに区別されます。「物理サーバー」オブジェクトレイヤーはサーバーのIPアドレスを表し、「ファームサーバー」オブジェクトレイヤーは1つ以上の物理サーバーで実行されているサービスを表します。
ファームでのセッション制限は、「AppDirectorユーザーガイド」に従って、物理サーバーオブジェクトごとに加えて、ファームに定義された各ファームサーバーオブジェクトごとに(および他の方法で)実行できます。これは、p.137の他の場所で説明されています。
"The Connection Limit is the maximum number of users that can be directed
to a server for a service provided by the farm. The number of users allowed
depends on the Sessions mode selected because it determines the number of
active entries in the Client Table for sessions destined to the specific server.
When the Entry Per Session or Server Per Session modes are selected, the number
of active entries destined to the same server is higher than in the Regular
mode (see Regular, page 153).
When the Regular mode is selected, all requests from a single client IP destined
to the same server are reflected by a single entry in the Client Table (see
Client Table Views, page 164).
The default value for the Connection Limit parameter is 0. When it is configured
to 0, it is disabled for this server and there is no user number limit."
クライアントテーブルとその「通常モード」はp.153で定義されています。
"The Layer 3 Client Table is always used when Entry Per Session is used.
AppDirector uses the Layer 3 Client Table to ensure Layer 3 persistency.
This table contains information about the server selected for each client
(Source IP address) in each farm, and it allows AppDirector to select a
server for a new session.
[...]
In the Regular mode, AppDirector maintains Layer 3 persistency. In this mode,
each entry is identified by the following parameters:
• Layer 4 Policy VIP Address
• Client IP Address
• Destination TCP/UDP Port Used from the Client to the Server"
「基本アプリケーション」ページのサーバー定義ウィンドウのスクリーンショットでは、サーバー接続制限ボックスが帯域幅制限ボックスのすぐ横に表示されています。
したがって、構成によって多少異なりますが、この回答の目的では、クライアントテーブルを介して定義された「接続」と、ユーザーが定義した「セッション」は基本的に同じものになります。そして、その効果に対する制限は、ファーム内のサーバーオブジェクトごとに課すことができます。
AppDirectorは物理サーバーとファームサーバーを区別するため、Apache物理サーバーオブジェクトにマッピングする2つのファームサーバーを定義することができます。1つは接続制限が低いものです。
ただし、Apacheは両方のファームサーバーオブジェクトからの呼び出しに応答する必要もあります。たとえば、2つの個別のポートまたはIPアドレスで呼び出され、それぞれが(ファーム/ファームサーバー)コンボで使用されます。次に、2つのアプリケーションサーバーエントリポイントを定義できますか。つまり、2つのポートまたはIPアドレス(ファームごとに1つ)で応答するようにApacheフロントエンドアプリケーション(/ vhost?)を装備できますか?私はマニュアルにあまり時間をかけたくないので、これは多少の推測作業によるものですが、実際にAppDirector GUIとApacheを見ると、かなりエレガントに解決できると思います。
接続制限の設定には少し癖があります。物理サーバーからの接続制限p.140:
"Connection Limit
Maximum number of Client Table entries that can run simultaneously on
the physical server. This depends on the farm’s Sessions mode (see
Sessions Modes, page 150). When the limit is reached, new requests are
no longer directed to this server. All open sessions are continued.
When the Connection Limit parameter is configured to 0 (default), this
mechanism is disabled for this physical server and there is no user
number limit.
Note: When configuring the physical server, ensure that the Connection
Limit in the farm servers with the same Server Name is lower than or
equal to the Connection Limit in the physical server. Total number of
active sessions that run simultaneously on the farm servers must not
be higher than the Connection Limit value defined on the physical server."
したがって、無制限の「デフォルト」のファームサーバーに対して非常に高い接続制限(ユーザーベースで可能な最大数までの広いマージン)を定義し、「ログインした」ファームサーバーの接続制限を次のように設定する必要があります。あなたがする必要があるように低い。物理サーバーの定義では、目的のセッション制限をアクティブにするための前提条件として、2つの合計を接続制限として持つ必要があります。
あなたの質問にもこの要件があります:
After the specified session limit has been reached, the next user should be
directed to a custom error page.
これは、ユーザーガイドp.134では「HTTPサービスページなし」と呼ばれています。
When all servers belonging to a farm cannot be used for a specific
session, AppDirector can reply to a Web request (destined to port 80)
with a simple Web page, indicating that the service is currently not
available. Servers that cannot be used for a session include servers
in Not In Service or in No New Sessions mode. No HTTP Service Page is
configured for each farm. Each Web page is limited to 1K of HTML code.
監視の部分については、徹底的な調査は行っていませんが、私が思うのは次のとおりです。
track the current number of sessions for monitoring purposes
AppDirectorにMIBがあるようです。おそらく、通常どおりに正しいOIDを見つけるのは面倒ですが、選択したツールにそれをたどることができるでしょう。
whitelist the monitoring server (which is issuing queries to the webapp
periodically) and exempt it from the limit.
これはいくつかの創造的な思考を必要とする可能性があります。AppDirectorにこの機能のテンプレートが含まれていないと想定すると、次のようになります。
- 「ログイン」ファーム外のURIは、セッション制限の影響を受けません。監視してください、とにかくそれは同じバックエンドサーバーです。
- 代わりにAppDirectorヘルスチェックを使用してください。これらのチェックは、課したセッション制限にカウントされない可能性があります。ただし、監視サーバーにアラートを渡す方法を見つけてください:-)
- ヘルスチェックに合格する3番目のファームをセットアップします。乱雑ですが、うまくいきます。