Verwendung von Apache als Reverse Proxy mit mod_proxy unter Ubuntu 16.04

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_proxyverwenden, 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:

[[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 Befehlflaskvor, indem wir die UmgebungsvariableFLASK_APPin 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 Befehlflaskanzuweisen, 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 vonVirtualHostdurch 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:

  • MitProxyPreserveHost ü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 BlocksVirtualHostdurch 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.