Dieses Problem kann sowohl mit dem RadWare AppDirector als auch (der Vollständigkeit halber) wahrscheinlich auch mit Apache mod_security gelöst werden, wie in dem Kommentar unten angegeben.
Für eine AppDirector-Lösung ist es meines Erachtens möglich, zwei Farmen zu erstellen, die denselben Backend-Servern zugeordnet sind. Auf diese Betriebe können unterschiedliche Kriterien und Betriebsbedingungen angewendet werden. Eine Farm wäre die "Standardeinstellung" und die andere würde auf URI: s antworten, die Sie als "Sitzung" definieren. Letzteres würde die Anzahl der Sitzungen, die im Load Balancer akzeptiert werden, begrenzen.
Ich werde von nun an aus zwei Gründen Ihren Begriff "Sitzung" durch "angemeldet" ersetzen:
- Es vermeidet Mehrdeutigkeiten, da es den gewünschten Zustand klar definiert, in dem der Benutzer authentifiziert wird.
- Das AppDirector-Benutzerhandbuch und die GUI definieren den Begriff "Verbindung" neu, um für alle praktischen Zwecke eine Bedeutung zu haben, die mit "Sitzung" identisch ist (siehe unten). Dies fügt Verwirrung hinzu, die wir zu vermeiden versuchen.
Es ist auch möglich, eine traurige Seite anzuzeigen, wenn die "angemeldete" Farm das ausgewählte Verbindungslimit erreicht hat.
Bevor ich zum Wie komme, muss ich klar sagen, dass ich keine Betriebserfahrung mit dem AppDirector-Produkt habe, aber täglich einen konkurrierenden und etwas weniger fortgeschrittenen Load Balancer verwalte. Das Produkt, das ich verwende, kann dieses Szenario sofort ausführen. Ich habe Informationen im AppDirector-Benutzerhandbuch gefunden und festgestellt, welche Online-Dokumentation verfügbar ist, was darauf hindeutet, dass dies auch für den AppDirector gilt. Obwohl die Konzepte ähnlich sind, unterscheidet sich die Terminologie. Ich mache einfach einen When-in-Rome-Akt in Bezug auf die Formulierung, in der Hoffnung, es ziemlich richtig zu machen, ohne zu offensichtlich ein ahnungsloser Idiot zu sein.
Die größte Hürde bestand darin, Zugang zu einem Handbuch zu erhalten, das nur zur Verfügung gestellt wird, wenn man ein aktiver Kunde ist. Durch ein bisschen googeln war es möglich, eine alte Version zu finden, von der ich hoffe, dass sie nicht zu veraltet ist. Ich habe auch ein paar Knowledgebase-Artikel und diesen Link gefunden: Radware AppDirector - Konfiguration: Basisanwendung .
Hier ist ein Lösungsentwurf, der hauptsächlich im Benutzerhandbuch interpretiert wird:
Die Client-Eingabe für den Load Balancer erfolgt über einen VIP, mit dem sowohl die "Standard" -Sitzungen als auch die "angemeldeten Sitzungen" verbunden werden. Dies wird durch eine L4-Richtlinie gemäß S.99 im Benutzerhandbuch erreicht:
"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.
Die L4-Richtlinie kann an L7-Richtlinien gebunden werden, mit denen eine geeignete Farm ausgewählt wird. Der L7-Richtlinienprozess wird folgendermaßen im Benutzerhandbuch S.104 beschrieben:
"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."
Die verfügbaren Methoden zum Definieren eines L7-Verhaltens werden auf S. 106 beschrieben. Sie können eine geeignete Methode auswählen, um das Routing zu Ihrer "angemeldeten" Farm anstelle der "Standard" -Farm auszuwählen:
"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."
Wie im Link Basisanwendung zu sehen ist, könnte beispielsweise eine L7-Richtlinie erstellt werden, die URI-Muster für das Routing zu verschiedenen Farmen bewertet. Die zusammengestellten URI-Muster '^ / login? = True' und '^ / logged' können an Ihre "angemeldete" Farm weitergeleitet werden. Das zusammengesetzte Muster '^ / logout' (und alle anderen URI: s) könnte ebenfalls an eine "Standard" -Farm weitergeleitet werden.
Eine Farm wird im Benutzerhandbuch S.121 folgendermaßen definiert: "Eine AppDirector-Farm ist eine Gruppe von Netzwerkservern, die denselben Dienst bereitstellen. [...] Ein Server, der mehrere Dienste bereitstellt, kann in mehreren Farmen verwendet werden."
Ein Server wird weiter unterschieden, indem die Definition eines Back-End-Servers in zwei Schichten unterteilt wird, die Objektschicht "Physischer Server", die die IP-Adresse eines Servers darstellt, und die Objektschicht "Farmserver", die Dienste darstellt, die auf einem oder mehreren physischen Servern ausgeführt werden .
Die Sitzungsbeschränkung in einer Farm kann gemäß dem 'AppDirector-Benutzerhandbuch' für jedes für eine Farm definierte Farm Server-Objekt (sowie auf andere Weise) zusätzlich zu jedem Physical Server-Objekt durchgeführt werden. Dies wird unter anderem auf S.137 beschrieben:
"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."
Die Client-Tabelle und ihr 'regulärer Modus' sind auf S.153 definiert:
"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"
In einem Screenshot eines Fensters Serverdefinition auf der Basic - Anwendung Seite, wird die Server - Verbindungslimit Feld direkt neben dem Bandbreitengrenze Feld gesehen.
Ein bisschen abhängig von der Konfiguration, aber für die Zwecke dieser Antwort ist eine 'Verbindung', wie sie in der Client-Tabelle definiert ist, und eine 'Sitzung', wie sie von Ihnen definiert wurde, im Wesentlichen dasselbe. Eine entsprechende Begrenzung kann pro Serverobjekt in einer Farm festgelegt werden.
Da der AppDirector zwischen physischen Servern und Farmservern unterscheidet, können zwei Farmserver definiert werden, die Ihrem physischen Apache-Serverobjekt zugeordnet sind, von denen einer ein niedriges Verbindungslimit aufweist.
Apache muss jedoch auch Anrufe von beiden Farmserverobjekten entgegennehmen, z. B. indem er an zwei separaten Ports oder IP-Adressen aufgerufen wird - einer wird von jeder Kombination (Farm / Farmserver) verwendet. Dann stellt sich die Frage, ob Sie zwei Einstiegspunkte für Anwendungsserver definieren können. dh können Sie Ihre Apache-Front-End-Anwendung (/ vhost?) so ausrüsten, dass sie an zwei Ports oder IP-Adressen (einer pro Farm) antwortet? Dies geschieht durch ein wenig Rätselraten, da ich nicht zu viel Zeit mit dem Handbuch verbringen möchte, aber ich bin sicher, dass Sie dies ziemlich elegant lösen können, wenn Sie sich die AppDirector-GUI und den Apache ansehen.
Das Einstellen des Verbindungslimits ist etwas eigenartig. Von physischen Servern, Verbindungslimit S.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."
Sie müssten daher ein sehr hohes Verbindungslimit (mit einem großen Spielraum bis zur maximal möglichen Anzahl durch Ihre Benutzerbasis) für den uneingeschränkten "Standard" -Farmserver definieren und das Verbindungslimit für den "angemeldeten" Farmserver als festlegen niedrig wie du musst. Die physische Serverdefinition muss die Summe der beiden als Verbindungslimit haben, als Voraussetzung für die Aktivierung des gewünschten Sitzungslimits.
Sie haben auch diese Anforderung in Ihrer Frage:
After the specified session limit has been reached, the next user should be
directed to a custom error page.
Dies wird im Benutzerhandbuch, S.134, als "Keine HTTP-Dienstseite" bezeichnet:
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.
Für den Überwachungsteil habe ich nicht so gründlich recherchiert, aber hier ist was ich denke:
track the current number of sessions for monitoring purposes
AppDirector scheint MIBs zu haben. Wahrscheinlich ist es schwierig, die richtige OID zu finden, wie es normalerweise der Fall ist, aber Sie können sie wahrscheinlich an das Werkzeug Ihrer Wahl senden.
whitelist the monitoring server (which is issuing queries to the webapp
periodically) and exempt it from the limit.
Dieser könnte kreatives Denken erfordern. Angenommen, der AppDirector enthält keine sofort einsatzbereite Vorlage. Wie wäre es mit:
- URIs außerhalb der "angemeldeten" Farm sind vom Sitzungslimit nicht betroffen. Überwachen Sie also, es sind sowieso die gleichen Backend-Server.
- Verwenden Sie stattdessen die AppDirector-Integritätsprüfungen. Diese werden wahrscheinlich nicht auf das von Ihnen festgelegte Sitzungslimit angerechnet. Finden Sie jedoch eine Möglichkeit, Warnungen an Ihren Überwachungsserver weiterzuleiten :-)
- Richten Sie eine dritte Farm ein, durch die Sie Gesundheitschecks bestehen. Chaotisch, aber es würde funktionieren.