Einführung
Areverse proxy ist eine Art Proxyserver, der HTTP (S) -Anforderungen entgegennimmt und diese transparent an einen oder mehrere Backend-Server verteilt. Reverse-Proxys sind nützlich, da viele moderne Webanwendungen eingehende HTTP-Anforderungen mithilfe von Back-End-Anwendungsservern verarbeiten, auf die Benutzer nicht direkt zugreifen können, und häufig nur rudimentäre HTTP-Funktionen unterstützen.
Sie können einen Reverse-Proxy verwenden, um den direkten Zugriff auf diese zugrunde liegenden Anwendungsserver zu verhindern. Sie können auch verwendet werden, um die Last von eingehenden Anforderungen auf mehrere verschiedene Anwendungsserver zu verteilen, um die Leistung im Maßstab zu erhöhen und Ausfallsicherheit zu gewährleisten. Sie können die Lücken mit Funktionen füllen, die die Anwendungsserver nicht bieten, z. B. Caching, Komprimierung oder SSL-Verschlüsselung.
In diesem Lernprogramm richten Sie Apache als einfachen Reverse-Proxy ein, indem Sie die Erweiterungmod_proxy
verwenden, um eingehende Verbindungen zu einem oder mehreren Back-End-Servern umzuleiten, die im selben Netzwerk ausgeführt werden. In diesem Lernprogramm wird ein einfaches Backend verwendet, das mitFlask web framework geschrieben wurde. Sie können jedoch einen beliebigen Backend-Server verwenden.
Voraussetzungen
Um diesem Tutorial zu folgen, benötigen Sie:
-
Ein mitthis initial server setup tutorial eingerichteter Ubuntu 16.04-Server, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Apache 2 wird auf Ihrem Server installiert, indem Sie Schritt 1 vonHow To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 16.04 ausführen.
[[Schritt 1 - Aktivieren der erforderlichen Apache-Module]] == Schritt 1 - Aktivieren der erforderlichen Apache-Module
Im Lieferumfang von Apache sind viele Module enthalten, die verfügbar sind, aber bei einer Neuinstallation nicht aktiviert werden. Zunächst müssen wir die in diesem Lernprogramm verwendeten aktivieren.
Die Module, die wir benötigen, sindmod_proxy
selbst und einige seiner Zusatzmodule, die ihre Funktionalität erweitern, um verschiedene Netzwerkprotokolle zu unterstützen. Insbesondere werden wir verwenden:
-
mod_proxy
, das Haupt-Proxy-Modul Apache-Modul zum Umleiten von Verbindungen; Damit kann Apache als Gateway zu den zugrunde liegenden Anwendungsservern fungieren. -
mod_proxy_http
, wodurch die Unterstützung für das Proxying von HTTP-Verbindungen hinzugefügt wird. -
mod_proxy_balancer
undmod_lbmethod_byrequests
, die Lastausgleichsfunktionen für mehrere Backend-Server hinzufügen.
Führen Sie die folgenden Befehle nacheinander aus, um diese vier Module zu aktivieren.
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
Starten Sie Apache neu, damit diese Änderungen wirksam werden.
sudo systemctl restart apache2
Apache ist jetzt bereit, als Reverse-Proxy für HTTP-Anforderungen zu fungieren. Im nächsten (optionalen) Schritt erstellen wir zwei sehr einfache Backend-Server. Mithilfe dieser Informationen können wir überprüfen, ob die Konfiguration ordnungsgemäß funktioniert. Wenn Sie jedoch bereits über eigene Back-End-Anwendungen verfügen, können Sie mit Schritt 3 fortfahren.
[[Schritt-2 - Erstellen von Backend-Testservern]] == Schritt 2 - Erstellen von Backend-Testservern
Das Ausführen einiger einfacher Back-End-Server ist eine einfache Möglichkeit, um zu testen, ob Ihre Apache-Konfiguration ordnungsgemäß funktioniert. Hier erstellen wir zwei Testserver, die auf HTTP-Anforderungen mit dem Drucken einer Textzeile antworten. Ein Server sagtHello world! und der andere sagtHowdy world!.
[.note] #Note: In Nicht-Test-Setups geben Backend-Server normalerweise alle dieselbe Art von Inhalt zurück. Insbesondere für diesen Test ist es jedoch einfach zu überprüfen, ob der Lastausgleichsmechanismus beide.
# verwendet, wenn die beiden Server unterschiedliche Nachrichten zurückgeben
Flask ist ein Python-Mikroframework zum Erstellen von Webanwendungen. Wir verwenden Flask zum Erstellen der Testserver, da für eine Basis-App nur wenige Codezeilen erforderlich sind. Sie müssen Python nicht kennen, um diese einzurichten. Wenn Sie jedoch lernen möchten, können Sie sichthese Python tutorials ansehen.
Aktualisieren Sie zuerst die Paketliste.
sudo apt-get update
Installieren Sie dann Pip, den empfohlenen Python-Paketmanager.
sudo apt-get -y install python3-pip
Verwenden Sie Pip, um Flask zu installieren.
sudo pip3 install flask
Nachdem Sie alle erforderlichen Komponenten installiert haben, erstellen Sie zunächst eine neue Datei, die den Code für den ersten Back-End-Server im Ausgangsverzeichnis des aktuellen Benutzers enthält.
nano ~/backend1.py
Kopieren Sie den folgenden Code in die Datei, speichern und schließen Sie sie.
~/backend1.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello world!'
Die ersten beiden Zeilen initialisieren das Flask-Framework. Es gibt eine Funktion,home()
, die eine Textzeile (Hello world!
) zurückgibt. Die Zeile@app.route('/')
über der Funktionsdefinition vonhome()
weist Flask an, den Rückgabewert vonhome()
als Antwort auf HTTP-Anforderungen zu verwenden, die an die Stamm-URL von/
der Anwendung gerichtet sind.
Der zweite Back-End-Server ist genau der gleiche wie der erste, abgesehen davon, dass er zu einer anderen Textzeile zurückkehrt. Beginnen Sie also mit dem Duplizieren der ersten Datei.
cp ~/backend1.py ~/backend2.py
Öffnen Sie die neu kopierte Datei.
nano ~/backend2.py
Ändern Sie die zurückzugebende Nachricht vonHello world! inHowdy world!, speichern Sie die Datei und schließen Sie sie.
~/backend2.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Howdy world!'
Verwenden Sie den folgenden Befehl, um den ersten Hintergrundserver an Port8080
zu starten. Dadurch wird auch die Ausgabe von Flask auf/dev/null
umgeleitet, da dies die Konsolenausgabe weiter trüben würde.
FLASK_APP=~/backend1.py flask run --port=8080 >/dev/null 2>&1 &
Hier gehen wir dem Befehlflask
vor, indem wir die UmgebungsvariableFLASK_APP
in derselben Zeile setzen. Umgebungsvariablen sind eine bequeme Möglichkeit, Informationen an Prozesse weiterzuleiten, die von der Shell erzeugt werden. Weitere Informationen zu Umgebungsvariablen finden Sie inHow To Read and Set Environmental and Shell Variables on a Linux VPS.
In diesem Fall stellt die Verwendung einer Umgebungsvariablen sicher, dass die Einstellung nur für den ausgeführten Befehl gilt und danach nicht verfügbar bleibt, da wir auf die gleiche Weise einen anderen Dateinamen übergeben, um den Befehlflask
anzuweisen, den zweiten Server zu starten
Verwenden Sie diesen Befehl ebenfalls, um den zweiten Server an Port8081
zu starten. Beachten Sie den unterschiedlichen Wert für die UmgebungsvariableFLASK_APP
.
FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &
Sie können testen, ob die beiden Server mitcurl
ausgeführt werden. Testen Sie den ersten Server:
curl http://127.0.0.1:8080/
Dies gibtHello world! im Terminal aus. Testen Sie den zweiten Server:
curl http://127.0.0.1:8081/
Dies gibt stattdessenHowdy world! aus.
[.note] #Note: Um beide Testserver zu schließen, nachdem Sie sie nicht mehr benötigen, können Sie nach Abschluss dieses Lernprogramms einfachkillall flask
.
# ausführen.
Im nächsten Schritt werden wir die Konfigurationsdatei von Apache so ändern, dass sie als Reverse-Proxy verwendet werden kann.
[[Schritt-3 - Ändern der Standardkonfiguration zum Aktivieren des Reverse-Proxys]] == Schritt 3 - Ändern der Standardkonfiguration zum Aktivieren des Reverse-Proxys
In diesem Abschnitt richten wir den virtuellen Apache-Standardhost als Reverse-Proxy für einen einzelnen Back-End-Server oder ein Array von Back-End-Servern mit Lastenausgleich ein.
[.Hinweis]##
Note: In diesem Lernprogramm wenden wir die Konfiguration auf der Ebene des virtuellen Hosts an. Bei einer Standardinstallation von Apache ist nur ein einziger virtueller Standardhost aktiviert. Sie können jedoch all diese Konfigurationsfragmente auch auf anderen virtuellen Hosts verwenden. Weitere Informationen zu virtuellen Hosts in Apache finden Sie in diesem Tutorial zuHow To Set Up Apache Virtual Hosts on Ubuntu 16.04.
Wenn Ihr Apache-Server sowohl als HTTP- als auch als HTTPS-Server fungiert, muss Ihre Reverse-Proxy-Konfiguration auf den virtuellen HTTP- und HTTPS-Hosts platziert werden. Weitere Informationen zu SSL mit Apache finden Sie in diesem Tutorial vonHow To Create a Self-Signed SSL Certificate for Apache in Ubuntu 16.04.
Öffnen Sie die Standard-Apache-Konfigurationsdatei mitnano
oder Ihrem bevorzugten Texteditor.
sudo nano /etc/apache2/sites-available/000-default.conf
In dieser Datei befindet sich der Block<VirtualHost *:80>
in der ersten Zeile. Im folgenden ersten Beispiel wird erläutert, wie dieser Block so konfiguriert wird, dass ein Reverse-Proxy für einen einzelnen Back-End-Server ausgeführt wird. Im zweiten Beispiel wird ein Reverse-Proxy mit Lastenausgleich für mehrere Back-End-Server eingerichtet.
[[Beispiel-1 -—- Reverse-Proxying-eines-einzelnen-Backend-Servers]] === Beispiel 1 - Reverse-Proxy eines einzelnen Backend-Servers
Ersetzen Sie den gesamten Inhalt innerhalb des Blocks vonVirtualHost
durch den folgenden, sodass Ihre Konfigurationsdatei folgendermaßen aussieht:
/etc/apache2/sites-available/000-default.conf
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
Wenn Sie den Beispielservern in Schritt 2 gefolgt sind, verwenden Sie127.0.0.1:8080
, wie im obigen Block beschrieben. Wenn Sie über eigene Anwendungsserver verfügen, verwenden Sie stattdessen deren Adressen.
Hier gibt es drei Richtlinien:
-
Mit
ProxyPreserveHost
übergibt Apache den ursprünglichenHost
-Header an den Backend-Server. Dies ist nützlich, da der Back-End-Server über die Adresse informiert wird, die für den Zugriff auf die Anwendung verwendet wird. -
ProxyPass
ist die Hauptanweisung für die Proxy-Konfiguration. In diesem Fall wird angegeben, dass alles unter der Stamm-URL (/
) dem Back-End-Server unter der angegebenen Adresse zugeordnet werden soll. Wenn Apache beispielsweise eine Anforderung für/example
erhält, stellt es eine Verbindung zuhttp://your_backend_server/example
her und gibt die Antwort an den ursprünglichen Client zurück. -
ProxyPassReverse
sollte dieselbe Konfiguration wieProxyPass
haben. Apache wird angewiesen, die Antwortheader vom Back-End-Server zu ändern. Dadurch wird sichergestellt, dass der Browser des Clients zur Proxy-Adresse und nicht zur Backend-Server-Adresse umgeleitet wird, wenn der Backend-Server einen Standortumleitungsheader zurückgibt. Dies würde nicht wie beabsichtigt funktionieren.
Starten Sie Apache neu, damit diese Änderungen wirksam werden.
sudo systemctl restart apache2
Wenn Sie jetzt in einem Webbrowser aufhttp://your_server_ip
zugreifen, wird anstelle der Standard-Apache-Begrüßungsseite die Antwort Ihres Back-End-Servers angezeigt. Wenn Sie Schritt 2 ausgeführt haben, bedeutet dies, dass SieHellow world! sehen.
[[Beispiel-2 - Lastausgleich über mehrere Backend-Server]] === Beispiel 2 - Lastausgleich über mehrere Backend-Server
Wenn Sie über mehrere Backend-Server verfügen, können Sie den Datenverkehr beim Proxy-Verfahren auf diese verteilen, indem Sie Lastausgleichsfunktionen vonmod_proxy
verwenden.
Ersetzen Sie den gesamten Inhalt des BlocksVirtualHost
durch den folgenden, sodass Ihre Konfigurationsdatei folgendermaßen aussieht:
/etc/apache2/sites-available/000-default.conf
BalancerMember http://127.0.0.1:8080
BalancerMember http://127.0.0.1:8081
ProxyPreserveHost On
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
Die Konfiguration ähnelt der vorherigen, aber anstatt einen einzelnen Backend-Server direkt anzugeben, haben wir einen zusätzlichenProxy
-Block verwendet, um mehrere Server zu definieren. Der Block heißtbalancer://mycluster
(der Name kann frei geändert werden) und besteht aus einer oder mehreren DirektivenBalancerMember+`s, which specify the underlying backend server addresses. The `+ProxyPass
undProxyPassReverse
. Verwenden Sie den Load Balancer-Pool mit dem Namenmycluster
anstelle eines bestimmten Server.
Wenn Sie den Beispielservern in Schritt 2 gefolgt sind, verwenden Sie127.0.0.1:8080
und127.0.0.1:8081
für die AnweisungenBalancerMember
, wie im obigen Block beschrieben. Wenn Sie über eigene Anwendungsserver verfügen, verwenden Sie stattdessen deren Adressen.
Starten Sie Apache neu, damit diese Änderungen wirksam werden.
sudo systemctl restart apache2
Wenn Sie in einem Webbrowser aufhttp://your_server_ip
zugreifen, werden die Antworten Ihrer Backend-Server anstelle der Standard-Apache-Seite angezeigt. Wenn Sie Schritt 2 ausgeführt haben, sollte beim mehrmaligen Aktualisieren der SeiteHello world! undHowdy world! angezeigt werden. Dies bedeutet, dass der Reverse-Proxy funktioniert und der Lastenausgleich zwischen beiden Servern erfolgt.
Fazit
Sie wissen jetzt, wie Sie Apache als Reverse-Proxy für einen oder mehrere zugrunde liegende Anwendungsserver einrichten. mod_proxy
kann effektiv verwendet werden, um den Reverse-Proxy für Anwendungsserver zu konfigurieren, die in einer Vielzahl von Sprachen und Technologien wie Python und Django oder Ruby und Ruby on Rails geschrieben sind. Es kann auch verwendet werden, um den Datenverkehr zwischen mehreren Back-End-Servern für Websites mit viel Datenverkehr auszugleichen, oder um eine hohe Verfügbarkeit über mehrere Server bereitzustellen oder um eine sichere SSL-Unterstützung für Back-End-Server bereitzustellen, die SSL nicht von Haus aus unterstützen.
Währendmod_proxy
mitmod_proxy_http
die vielleicht am häufigsten verwendete Kombination von Modulen ist, gibt es mehrere andere, die unterschiedliche Netzwerkprotokolle unterstützen. Wir haben sie hier nicht verwendet, aber einige andere beliebte Module umfassen:
-
mod_proxy_ftp
für FTP. -
mod_proxy_connect
für SSL-Tunneling. -
mod_proxy_ajp
für AJP (Apache JServ Protocol), wie Tomcat-basierte Backends. -
mod_proxy_wstunnel
für Web-Sockets.
Um mehr übermod_proxy
zu erfahren, können Siethe official Apache mod_proxy
documentation lesen.