Verwendung von Apache als Reverse Proxy mit mod_proxy unter Debian 8

Einführung

Ein reverse Proxy ist eine Art Proxy-Server, 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 Tutorial richten Sie Apache als grundlegenden Reverse-Proxy mit der Erweiterung "+ mod_proxy +" ein, um eingehende Verbindungen zu einem oder mehreren Back-End-Servern im selben Netzwerk umzuleiten. Dieses Tutorial verwendet ein einfaches Backend, das mit Flask web framework geschrieben wurde. Sie können jedoch jeden beliebigen Backend-Server verwenden.

Voraussetzungen

Um diesem Tutorial zu folgen, benötigen Sie:

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, sind + mod_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 des Apache-Moduls zur Umleitung von Verbindungen; Dadurch kann Apache als Gateway zu den zugrunde liegenden Anwendungsservern fungieren.

  • + mod_proxy_http +, das die Unterstützung für das Proxying von HTTP-Verbindungen hinzufügt.

  • + mod_proxy_balancer + und + mod_lbmethod_byrequests +, die Lastausgleichsfunktionen für mehrere Back-End-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

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 sagt * Hallo Welt! * Und der andere sagt * Hallo Welt! *.

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, besuchen Sie these Python tutorials. .

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 zurückgibt (+ Hello world! +). Die Zeile "@app.route (" / ") +" über der Funktionsdefinition " home () " weist Flask an, den Rückgabewert von " home () " als Antwort auf HTTP-Anforderungen an die zu verwenden ` / +` root URL der Anwendung.

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 Nachricht, die von * Hello world! * In * Howdy world! * Zurückgegeben werden soll, speichern und schließen Sie die Datei.

~ / backend2.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def home():
   return ''

Verwenden Sie den folgenden Befehl, um den ersten Hintergrundserver an Port + 8080 + zu starten. Dadurch wird auch die Ausgabe von Flask nach "+ / 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 setzen wir vor dem Befehl "+ flask " die Umgebungsvariable " FLASK_APP +" in derselben Zeile. Umgebungsvariablen sind eine bequeme Möglichkeit, Informationen an Prozesse weiterzuleiten, die von der Shell erzeugt werden. Weitere Informationen zu Umgebungsvariablen finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps[How To Lesen und Festlegen von Umgebungsvariablen und Shell-Variablen auf einem 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 mehr verfügbar ist, da wir einen anderen Dateinamen übergeben, um den Befehl "+ flask +" anzuweisen, den zweiten Server zu starten

Verwenden Sie diesen Befehl ebenfalls, um den zweiten Server an Port + 8081 + zu starten. Beachten Sie den unterschiedlichen Wert für die Umgebungsvariable "+ FLASK_APP".

FLASK_APP=~/backend2.py flask run --port=8081 >/dev/null 2>&1 &

Sie können testen, ob die beiden Server ausgeführt werden, indem Sie "+ curl" verwenden. Testen Sie den ersten Server:

curl http://127.0.0.1:8080/

Dies gibt * Hallo Welt! * Im Terminal aus. Testen Sie den zweiten Server:

curl http://127.0.0.1:8081/

Dies gibt stattdessen * Howdy world! * Aus.

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, um Reverse Proxy zu aktivieren

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.

Öffnen Sie die Apache-Standardkonfigurationsdatei mit "+ nano +" oder Ihrem bevorzugten Texteditor.

sudo nano /etc/apache2/sites-available/000-default.conf

In dieser Datei finden Sie den Block + <VirtualHost *: 80> +, der in der ersten Zeile beginnt. 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-Proxy eines einzelnen Backend-Servers

Ersetzen Sie den gesamten Inhalt des "+ VirtualHost +" - Blocks durch den folgenden, damit Ihre Konfigurationsdatei so aussieht:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>




</VirtualHost>

Wenn Sie den Beispielservern in Schritt 2 gefolgt sind, verwenden Sie "+127.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:

  • + ProxyPreserveHost lässt Apache den ursprünglichen` + Host`-Header an den Backend-Server übergeben. 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 gibt es an, dass alles unter der Root-URL ("+ / ") dem Back-End-Server unter der angegebenen Adresse zugeordnet werden soll. Wenn Apache beispielsweise eine Anforderung für " / example " erhält, wird eine Verbindung zu " http: /// example +" hergestellt und die Antwort an den ursprünglichen Client zurückgegeben.

  • + ProxyPassReverse + sollte die gleiche Konfiguration haben wie + ProxyPass +. 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 nun in einem Webbrowser auf "+ http: // +" zugreifen, wird anstelle der Standard-Apache-Begrüßungsseite die Antwort Ihres Back-End-Servers angezeigt. Wenn Sie Schritt 2 befolgt haben, sehen Sie * Hallo Welt! *.

Beispiel 2 - Lastenausgleich über mehrere Backend-Server

Wenn Sie über mehrere Back-End-Server verfügen, können Sie den Datenverkehr beim Proxy-Zugriff am besten mit den Lastenausgleichsfunktionen von "+ mod_proxy +" auf diese verteilen.

Ersetzen Sie den gesamten Inhalt des "+ VirtualHost +" - Blocks durch den folgenden, damit Ihre Konfigurationsdatei so aussieht:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>









</VirtualHost>

Die Konfiguration ähnelt der vorherigen, aber anstatt einen einzelnen Back-End-Server direkt anzugeben, haben wir einen zusätzlichen "+ Proxy " - Block verwendet, um mehrere Server zu definieren. Der Block heißt ` balancer: // ` (der Name kann frei geändert werden) und besteht aus einem oder mehreren ` BalancerMember ` s, die die zugrunde liegenden Backend-Serveradressen angeben. Die Direktiven " ProxyPass " und " ProxyPassReverse " verwenden den Lastenausgleichspool " mycluster +" anstelle eines bestimmten Servers.

Wenn Sie den Beispielservern in Schritt 2 gefolgt sind, verwenden Sie "127.0.0.1: 8080 +" und "+127.0.0.1: 8081 +" für die Direktiven " BalancerMember +", 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 auf "+ http: // +" zugreifen, werden die Antworten Ihrer Back-End-Server anstelle der Standard-Apache-Seite angezeigt. Wenn Sie Schritt 2 befolgt haben, sollte beim mehrmaligen Aktualisieren der Seite * Hello world! * Und * Howdy world! * Angezeigt werden. Dies bedeutet, dass der Reverse Proxy funktioniert hat und ein Lastenausgleich zwischen beiden Servern stattfindet.

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 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 wurden. 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ährend + mod_proxy + mit + mod_proxy_http + die vielleicht am häufigsten verwendete Kombination von Modulen ist, gibt es mehrere andere, die verschiedene 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 bei Tomcat-basierten Backends.

  • + mod_proxy_wstunnel + für Web-Sockets.

Um mehr über "+ mod_proxy " zu erfahren, können Sie http://httpd.apache.org/docs/current/mod/mod_proxy.html die offizielle Apache " mod_proxy +" -Dokumentation lesen.

Related