So richten Sie einen Reverse-Proxy mit Apache ein

0
291

 

Sharaf Maksumov/Shutterstock.com

Apache ist ein vielseitiger Webserver, der alle unterstützenden Funktionen bietet, einige davon über Erweiterungen. In diesem Artikel verwenden wir das Modul mod_proxy, um Apache in einer Reverse-Proxy-Rolle zu konfigurieren.

Auch wenn Apache als Reverse-Proxy vielleicht nicht Ihre erste Wahl ist, da modernere Alternativen wie NGINX dazu neigen, Aufmerksamkeit zu erregen, ist mod_proxy nützlich für Server, die bereits Apache ausführen und nun den Datenverkehr an einen anderen Dienst weiterleiten müssen. Sie können einen virtuellen Apache-Host einrichten, um Anfragen für eine bestimmte Domäne an einen separaten Webserver weiterzuleiten.

Für die Zwecke dieses Handbuchs verwenden wir Apache 2.4 mit einem Debian-basierten System. Wir gehen auch davon aus, dass die Server, für die Sie den Datenverkehr als Proxy verwenden möchten, bereits von Ihrem Apache-Host aus über das Netzwerk zugänglich sind. Dieser Artikel konzentriert sich auf die Aktivierung von Proxying basierend auf einem einzigartigen virtuellen Host, aber mod_proxy ist auch global konfigurierbar, als Teil Ihrer Apache-Serverkonfiguration oder auf Verzeichnisebene über .htaccess-Dateien.

Aktivieren des Proxy-Moduls

mod_proxy ist in der Standard-Apache-Installation enthalten. Verwenden Sie a2enmod, um das Modul und seine unabhängige HTTP-Komponente jetzt zu aktivieren:

sudo a2enmod proxy sudo a2enmod proxy_http

Dadurch wird Apache so eingerichtet, dass Proxy-HTTP-Verbindungen zu anderen Hosts unterstützt werden. Das Modul wird mithilfe von Anweisungen mit Proxy-Präfix in Ihren Apache-Konfigurationsdateien konfiguriert. Diese richten wir als Nächstes ein.

Einrichten eines virtuellen Hosts mit Proxy

Let’s Richten Sie einen virtuellen Host ein, der example.com an die interne IP-Adresse 192.168.0.1 weiterleitet. Sie sollten einen DNS-Eintrag für example.com hinzufügen, der auf Ihren Apache-Host verweist.

Werbung

Durch Proxying in diesem Szenario können Besucher transparent über eine externe Adresse auf Ihren internen Webserver zugreifen. Apache fungiert als Gatekeeper, der den Datenverkehr an sein endgültiges Ziel weiterleitet. Der Benutzer sieht example.com, obwohl Apache tatsächlich Anfragen über den separaten Server auflöst.

Fügen Sie eine neue virtuelle Hostdatei in /etc/apache2/sites-available mit folgendem Inhalt hinzu:

<VirtualHost *:80> ServerName example.com ProxyPass/http://192.168.0.1/nocanon ProxyPassReverse/http://192.168.0.1/</VirtualHost>

Die Direktiven ProxyPass und ProxyPassReverse geben an, dass der Verkehr zu example.com an 192.168.0.1 weitergeleitet werden soll. Das optionale Schlüsselwort nocanon weist Apache an, die Roh-URL an den Remote-Server zu übergeben. Ohne dieses Schlüsselwort kanonisiert Apache automatisch die URL, die mit einigen Servern und Frameworks inkompatibel sein kann. Die Verwendung von nocanon garantiert die Kompatibilität, kann sich jedoch auf Ihre Sicherheitslage auswirken, da der integrierte Schutz von Apache vor URL-basierten Proxy-Angriffen deaktiviert wird.

ProxyPassReverse muss angegeben werden, um Ihre Konfiguration als Reverse-Proxy-Setup zu unterscheiden. Apache verwendet die bereitgestellte URL, um die von Ihrem Back-End ausgegebenen Antwortheader für Location, Content-Location und URI neu zu schreiben. Dadurch wird sichergestellt, dass nachfolgende Anfragen weiterhin den Reverse-Proxy erreichen, anstatt zu versuchen, den internen Server direkt zu erreichen.

Diese Konfiguration führt für alle Anfragen einen Proxy aus. Sie können das Proxying auf einen bestimmten Pfad wie /media beschränken, indem Sie die Anweisungen zu ProxyPass und ProxyPassReverse anpassen:

ProxyPass /media http://192.168.0.1/ProxyPassReverse /media http://192.168.0.1/Werbung

Durch das Hinzufügen mehrerer ProxyPass-Regeln können Sie Anfragen zwischen mehreren Zielen über einen virtuellen Host weiterleiten. Regeln werden in der Reihenfolge abgeglichen, in der sie geschrieben wurden. Wenn Sie ein komplexeres Routing-Verhalten benötigen, verwenden Sie stattdessen die ProxyPassMatch-Direktive. Dies entspricht ProxyPass, gleicht jedoch eingehende URLs mit einem regulären Ausdruck ab:

ProxyPassMatch ^/client/(.*)/images$ http://192.168.0.1/

Speichern Sie Ihre virtuelle Hostdatei und aktivieren Sie sie mit dem Befehl a2ensite. Dies nimmt den Basisnamen Ihrer Datei, relativ zum Verzeichnis Sites-available:

sudo a2ensite example-proxy-vhost

Starten Sie Apache neu, um Ihre Änderungen zu übernehmen:

sudo service apache2 restart

Ihr einfaches Der Proxy sollte jetzt betriebsbereit sein. Besuchen Sie example.com – Sie sollten den Inhalt sehen, der von 192.168.0.1 bereitgestellt wird. Die Anfrage endet bei Ihrem Apache-Host, der sie dann an Ihren internen Server weiterleitet.

SSL verwenden

Das obige Beispiel lässt SSL weg. In einem Produktionsworkload möchten Sie dies einrichten, indem Sie Ihrem virtuellen Host die Einstellungen SSLCertificateFile und SSLCertificateKeyFile hinzufügen. Diese geben das SSL-Zertifikat und den Schlüssel an, die bei der Validierung von SSL-Verbindungen verwendet werden sollen. Sie können auch Let’s Encrypt’s certbot verwenden, um die Einrichtung zu automatisieren.

Wenn Sie SSL auf diese Weise konfigurieren, wird die sichere Verbindung auf Ihrem Apache-Host beendet. Die Verbindung zwischen Apache und Ihrem Proxy-Ziel wird über reines HTTP hergestellt.

Wenn auch die Proxy-Verbindung gesichert werden soll, müssen Sie die von mod_ssl bereitgestellten SSLProxy-Optionen verwenden. SSLProxyEngine = On funktioniert als einfachste Konfiguration, vorausgesetzt, sowohl Apache als auch Ihr Proxy-Zielserver haben Zugriff auf dieselben Zertifikate. Diese Option weist an, dass SSL-Informationen über die Proxy-Verbindung übertragen werden.

Proxy-Optionen

Apache-Reverse-Proxys verfügen über mehrere optionale Anweisungen, mit denen Sie das Weiterleitungsverhalten anpassen können . Hier sind einige häufig verwendete Optionen:

  • ProxyAddHeaders – Apache übergibt standardmäßig die Header X-Forwarded-Host, XForwarded-For und X-Forwarded-Server an Ihren Backend-Server. Dadurch kann Ihr Backend erkennen, dass eine Anfrage über Apache weitergeleitet wurde. Das Setzen dieses Headers auf Off verhindert, dass Apache diese Header hinzufügt.
  • ProxyErrorOverride– Apache stört die von Ihrem Back-End-Server gesendeten Antworten nicht, es sei denn, Sie werden dazu aufgefordert. Wenn Ihr Back-End einen 400-, 404-, 500- oder einen anderen Fehlercode liefert, erhält der Benutzer diesen Inhalt unverändert. Das Setzen von ProxyErrorOverride ändert dies, sodass Apache stattdessen den Inhalt von Fehlerseiten durch das konfigurierte ErrorDocument ersetzt. Dies kann in Situationen wünschenswert sein, in denen Fehler von allen Ihren Back-Ends einheitlich behandelt werden sollen, wobei die Konfiguration auf dem Proxy-Host zentralisiert ist.
  • ProxyPassReverseCookieDomain– Dies funktioniert ähnlich wie die obligatorische (für Reverse-Proxying) ProxyPassReverse-Direktive. Es wird die Domäne in Set-Cookie-Headern neu schreiben, um auf den Namen des virtuellen Hosts und nicht auf den Hostnamen des Back-End-Servers zu verweisen, von dem sie stammen.
  • ProxyPreserveHost ’ 8211; Apache sendet normalerweise seinen eigenen Hostnamen als Wert des Host-Headers an Ihre Back-End-Server. Das Festlegen dieser Anweisung bedeutet, dass stattdessen der ursprüngliche Host-Header gesendet wird. Dies kann erforderlich sein, wenn Ihre Back-End-Software ihr eigenes Hostnamen-basiertes Routing durchführt.
  • ProxyTimeout– Verwenden Sie diese Direktive, um die Zeit anzupassen, die Apache wartet, während Ihr Backend-Server eine Proxy-Anfrage verarbeitet. Apache bricht die Anfrage ab und gibt einen Fehlercode an den Client zurück, wenn das Timeout überschritten wird. Standardmäßig wird der Timeout-Wert auf Serverebene verwendet.

Ankündigung

Sie können diese Anweisungen als zusätzliche Zeilen in Ihrer virtuellen Hostdatei festlegen. Denken Sie daran, den Apache-Dienst jedes Mal neu zu starten, wenn Sie eine Änderung vornehmen.

Load Balancing

Die Reverse-Proxy-Implementierung von Apache unterstützt auch den Lastausgleich zwischen mehreren verschiedenen Back-Ends. Dadurch kann eine Anfrage an example.com einen der Server in Ihrem Ausgleichspool erreichen.

<Proxy-Balancer://example-balancer> BalancerMember http://192.168.0.1 BalancerMember http://192.168.0.2 ProxySet lbmethod=bytraffic </Proxy> ProxyPass/balancer://example-balancer ProxyPassReverse/balancer://example-balancer

In diesem Beispiel werden Anforderungen an einen von zwei Servern im Beispiel-Balancer-Pool weitergeleitet. Der Lastausgleichsalgorithmus wird durch die lbmethod-Einstellung definiert; Der hier verwendete bytraffic-Wert versucht sicherzustellen, dass jeder der Server den gleichen Traffic verarbeitet.

Die alternative Byrequests-Ausgleichsmethode ist eine einfachere Version von bytraffic, die jedem Back-End einen gleichen Anteil der eingehenden Anfragen zuweist. Der  Bybusyness-Balancer verfolgt, wie viele Anfragen jedes Back-End bereitstellt, und weist dann den am wenigsten “besetzt” Backend.

Zusammenfassung

Das mod_proxy-Modul kann Apache in einen Reverse-Proxy-Host verwandeln, der es Ihnen ermöglicht, namensbasiertes Routing für den Zugriff auf mehrere unabhängige Dienste zu verwenden. Sie können auch einen Lastausgleich hinzufügen, um Stabilität und Betriebszeit zu gewährleisten, indem Sie Anfragen auf Ihre Serverflotte verteilen.

Werbung

Andere Proxy-Varianten sind ebenfalls verfügbar. Sie können unter anderem FTP-, WebSocket- und HTTP2-Verbindungen als Proxy verwenden, indem Sie neben mod_proxy zusätzliche Add-Ons installieren. Die vollständige Liste der Module ist in den Apache-Dokumenten verfügbar.