Wie kann ich HAProxy dazu bringen, in ein anderes Back-End umzuschreiben, wenn dem ersten die Datei fehlt? Was ich brauche errorloc
, ist ein Umschreiben anstelle einer Umleitung, damit der Client die Umleitung nicht kennt.
Wir haben eine Anwendung für NginX entwickelt, die sowohl Reverse Proxy als auch Webserver für statische Dateien zum Lastenausgleich verwendet. Die Anwendung basiert auf dem Opa- Framework, für das auf Cookies basierende Sticky-Sessions erforderlich sind, die sowohl von NginX als auch von HAproxy unterstützt werden. Die Anwendungsfunktion, mit der wir Probleme haben, ist die dynamische Generierung von Inhalten. Es generiert Bilder bei Bedarf, wird jedoch nach der Generierung auf der Festplatte gespeichert und kann statisch über einen deterministischen Pfad abgerufen werden.
Das Problem konnte mit NginX leicht gelöst werden - es versucht nur dann, die lokale Datei zu lesen und das Backend mit Lastenausgleich zu verwenden, wenn die Datei fehlt (noch nicht generiert):
server {
server_name wkaliszu.pl;
location /thumb {
root /path_on_disk/to_cached_content;
expires 7d;
# try to access already generated content
try_files $uri @wkaliszu;
}
location / {
# reverse proxy to the application
[...]
}
location @wkaliszu {
# reverse proxy to the application
[...]
}
}
Der Server wurde migriert und verwendet jetzt HAPproxy für den Lastenausgleich. Dies ist kein Webserver und unterstützt diese Funktion nicht. Jetzt wird jedes Mal eine dynamische Softwaregenerierung durchgeführt, wenn der Client versucht, auf die Ressource zuzugreifen, was viel langsamer ist und Ressourcen verschwendet. Es wäre in Ordnung, wenn es das nächste Back-End verwenden könnte, wenn der erste (einfacher Caching-Webserver für statische Dateien) mit Fehler 404 fehlgeschlagen wäre, aber ich kann keinen einfachen Weg finden, dies zu tun. Die Umleitung /thumb
zu NginX, das versucht, statische Dateien zu lesen und erneut mit einem neuen HTTP-Header in HAproxy umzuschreiben, fällt mir nur ein, aber ich würde gerne etwas Besseres finden.
Antworten:
Die Backends von HAProxy sind entweder auf oder ab (oder auf dem Weg nach oben / unten).
Es gibt verschiedene Möglichkeiten, den Zustand eines Backends zu überprüfen, mir sind jedoch keine bekannt, die eine auf Anforderungen basierende Nachverfolgung ermöglichen. Sobald eine Anforderung fehlschlägt, wird dieses Backend als ausgefallen markiert oder schlägt fehl (auf dem Weg, als ausgefallen betrachtet zu werden).
Dies ist eine ganz andere Logik als bei Ihrem Nginx-Setup, bei dem Anforderungen pro Anforderung weitergeleitet wurden.
Ich sehe hier einige Optionen:
Proxy zwischenspeichern
In HAProxy würden Sie ACLs verwenden, um statische Inhaltsanforderungen an ein bestimmtes Backend weiterzuleiten. Diese Backend-Knoten würden Nginx mit einem Caching-Proxy ausführen. Wenn nginx die Datei zwischengespeichert hätte, würde sie nur bereitgestellt. Wenn nicht, würde es Ihr Backend aufrufen.
Verwenden Sie App-Server für statische Inhalte
Wenn Ihre App-Server statische Inhalte effizient bereitstellen, müssen Sie die Anforderung möglicherweise nicht in Haproxy aufteilen. Senden Sie einfach alle Anfragen an Ihre Anwendungs-Backends. Bauen Sie Logik in sie ein, um statischen Inhalt bereitzustellen, falls verfügbar, und senden Sie die Anforderung an das Backend, falls dies nicht der Fall ist.
CDN-Option
Wenn Sie eine dedizierte Domain für den statischen Inhalt verwenden können, können Sie möglicherweise ein CDN verwenden. Beim CDN zeigen Sie einfach auf die Quell-URL zu Ihren Anwendungsknoten. Sie können dann das Caching auf CDN-Ebene steuern. Dies ähnelt dem obigen Nginx-Caching, außer dass der CDN-Anbieter es für Sie verwaltet.
quelle