Nginx Reverse Proxy einrichten

Nginx Reverse Proxy einrichten

Ich habe derzeit ein paar hundert Webanwendungen, die auf etwa 20 Server verteilt sind, und davor sitzt ein Reverse-Proxy, auf dem Pound und Haproxy laufen. Pound führt die Umleitung von http zu https und die SSL-Verschlüsselung durch und leitet dann an Haproxy weiter, das für jede Site eine Regel eingerichtet hat, die die Weiterleitung an einen der Backend-Server vorsieht, auf denen Tomcat läuft. Alle Sites befinden sich in derselben Domäne, z. B. www.domain.com/webapp1, www.domain.com/webapp2

Pound und Haproxy wurden ursprünglich von unserem Hosting-Anbieter eingerichtet. Da ich mit Pound frustriert bin, möchte ich dieses Setup nun durch Nginx ersetzen. Ich bin an einem Punkt angelangt, an dem ich Nginx in einer Entwicklungsumgebung laufen habe, die die https-Umleitung und SSL durchführt, und ich habe ein paar Regeln eingerichtet, um eine Proxy-Verbindung zu einem Backend herzustellen.

Ich brauche wirklich nur einen Rat, ob dies die beste Vorgehensweise ist oder ob es besser ist, Haproxy die Handhabung aller Regeln zu überlassen und Nginx nur als Ersatz für Pound zu konfigurieren.

Ich mache mir Sorgen, dass ich Nginx mit Hunderten von Weiterleitungsregeln wie unten konfiguriere und am Ende Leistungsprobleme bekomme. Alle Vorschläge sind willkommen, danke.

location /webapp1/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp2/ {
     proxy_pass http://10.1.9.11:8080;
}

location /webapp3/ {
     proxy_pass http://10.1.9.12:8080;
}

Antwort1

Ich weiß nicht viel darüber, haproxyaber genug, um nginxIhre Bedenken bezüglich der Leistungsprobleme zu zerstreuen.

Beachten Sie, dass nginxdie Konfiguration in ein benutzerfreundliches Format kompiliert structund im Speicher gehalten wird. Die Datei wird nicht bei jeder Anforderung gelesen. Daher location /...sollten Hunderte von Konfigurationen fast so schnell ausgeführt werden wie Aufrufe strlen()+ strncmp()die gleiche Anzahl von Malen. Was im Vergleich zur Socket-Einrichtung vernachlässigbar ist.

Die URL lautetnormalisiert, bevor das Matching beginntDaher sind die Übereinstimmungen nicht wirklich clever, sofern Sie nicht einen der Operatoren ( =, ~, *~, ^~) verwenden.

Sie könnten eine Regex-Übereinstimmung ( ~, *~) und dann eine ifLogik verwenden, um zwischen den upstreamServern zu entscheiden, aberdas wäre die langsame Lösung.

Wenn Sie jedoch mindestens einen Regex-Standort haben, sollten Sie die Verwendung des ^~Operators in Betracht ziehen. Weitere Informationen finden Sie in deralte, aber immer noch relevante Antwort von Martin Redmond auf SOüber verschiedene Operatoren und wie nginxsie übereinstimmen.

verwandte Informationen