So konfigurieren Sie einen Reverse-Proxy mit Apache
Apache ist ein vielseitiger Webserver, der eine vollständige Palette unterstützender Funktionen bietet, einige davon durch Erweiterungen. In diesem Artikel verwenden wir die mod_proxy
Modul zum Konfigurieren von Apache in einer Reverse-Proxy-Rolle.
Während Apache vielleicht nicht Ihre erste Wahl als Reverse-Proxy ist, mit moderneren Alternativen wie NGINX, die tendenziell Aufmerksamkeit erregen, mod_proxy
ist nützlich für Server, auf denen bereits Apache ausgeführt wird und die nun den Datenverkehr an einen anderen Dienst weiterleiten müssen. Sie können einen virtuellen Apache-Host so konfigurieren, dass Anforderungen von einer bestimmten Domäne an einen separaten Webserver weitergeleitet werden.
Für die Zwecke dieses Handbuchs verwenden wir Apache 2.4 mit einem Debian-basierten System. Wir gehen auch davon aus, dass die Server, an die Sie den Datenverkehr weiterleiten möchten, bereits über das Netzwerk von Ihrem Apache-Host aus zugänglich sind. Dieser Artikel konzentriert sich auf die Aktivierung von Proxy basierend auf einem einzelnen virtuellen Host, aber mod_proxy
ist auch global als Teil Ihrer Apache-Serverkonfiguration oder auf Verzeichnisebene via konfigurierbar .htaccess
Dateien.
Zusammenfassung
Aktivierung des Proxy-Moduls
mod_proxy
ist in der Standard-Apache-Installation enthalten. Benutzen a2enmod
um das Modul und seine unabhängige HTTP-Komponente jetzt zu aktivieren:
sudo a2enmod Proxy sudo a2enmod Proxy_http
Dadurch wird Apache so konfiguriert, dass er Proxy-HTTP-Verbindungen zu anderen Hosts unterstützt. Das Modul wird konfiguriert mit Proxy
-vorangestellte Anweisungen in Ihren Apache-Konfigurationsdateien. Wir werden sie als nächstes konfigurieren.
Konfigurieren eines virtuellen Proxy-Hosts
Lassen Sie uns einen virtuellen Host einrichten, der sendet example.com
an die interne IP-Adresse 192.168.0.1
. Sie müssen einen DNS-Eintrag hinzufügen example.com
die auf Ihren Apache-Host zeigt.
Der Proxy in diesem Szenario ermöglicht Besuchern den transparenten Zugriff auf Ihren internen Webserver über eine externe Adresse. Apache fungiert als Gatekeeper, der den Datenverkehr an sein endgültiges Ziel weiterleitet. Der Benutzer wird sehen example.com
, obwohl Apache Anfragen über den separaten Server auflöst.
Fügen Sie eine neue virtuelle Hostdatei hinzu /etc/apache2/sites-available
mit folgendem Inhalt:
Servername example.com ProxyPass / http://80/ nocanon ProxyPassReverse / http://192.168.0.1/
le ProxyPass
et ProxyPassReverse
Richtlinien geben diesen Datenverkehr an example.com
sollte ein Agent von sein 192.168.0.1
. Die Wahl nocanon
Das Schlüsselwort weist Apache an, die Roh-URL an den Remote-Server zu übergeben. Ohne dieses Schlüsselwort wird Apache die URL automatisch kanonisieren, was mit einigen Servern und Frameworks möglicherweise nicht kompatibel ist. Verwenden nocanon
garantiert die Kompatibilität, kann jedoch Ihr Sicherheitsniveau beeinträchtigen, da es den integrierten Schutz von Apache gegen URL-basierte Proxy-Angriffe deaktiviert.
ProxyPassReverse
muss angegeben werden, um Ihr Setup als Reverse-Proxy-Setup zu unterscheiden. Apache verwendet die bereitgestellte URL zum Umschreiben Location
, Content-Location
und URI
Antwortheader, die von Ihrem Back-End ausgegeben werden. Dadurch wird sichergestellt, dass nachfolgende Anfragen weiterhin den Reverse-Proxy erreichen, anstatt zu versuchen, den internen Server direkt zu erreichen.
Diese Konfiguration leitet alle Anfragen weiter. Sie können den Proxy auf einen bestimmten Pfad beschränken, z /media
durch Anpassung der ProxyPass
et ProxyPassReverse
Anweisungen:
ProxyPass/Medien http://192.168.0.1/ ProxyPassReverse/Medien http://192.168.0.1/
Hinzufügung mehrerer ProxyPass
Mit Regeln können Sie Anforderungen zwischen mehreren Zielen mithilfe eines virtuellen Hosts weiterleiten. Regeln werden in der Reihenfolge abgeglichen, in der sie geschrieben wurden. Wenn Sie ein komplexeres Routing-Verhalten benötigen, verwenden Sie die ProxyPassMatch
Direktive stattdessen. Dies entspricht ProxyPass
ordnet aber eingehende URLs einem regulären Ausdruck zu:
ProxypassMatch ^/Client /(.*)/ Bilder $ http://192.168.0.1/
Speichern Sie Ihre virtuelle Hostdatei und aktivieren Sie sie mit der a2ensite
bestellen. Dies nimmt den Basisnamen Ihrer Datei relativ zur sites-available
Telefonbuch:
sudo a2ensit Beispiel-Proxy-vhost
Starten Sie Apache neu, um Ihre Änderungen zu übernehmen:
Sudo service apache2 neu starten
Ihr einfacher Proxy sollte jetzt betriebsbereit sein. Versuchen Sie zu besuchen example.com
– Sie sollten den Inhalt sehen, der von bereitgestellt wird 192.168.0.1
. Die Anfrage landet auf Ihrem Apache-Host, der sie dann an Ihren internen Server weiterleitet.
SSL verwenden
Das obige Beispiel lässt SSL aus. In einer Produktionsworkload möchten Sie dies durch Hinzufügen konfigurieren SSLCertificateFile
et SSLCertificateKeyFile
Einstellungen zu Ihrem virtuellen Host. Diese geben das SSL-Zertifikat und den Schlüssel an, die bei der Validierung von SSL-Verbindungen verwendet werden sollen. Sie können auch den Certbot von Let’s Encrypt verwenden, um die Einrichtung zu automatisieren.
Wenn Sie SSL auf diese Weise konfigurieren, wird die sichere Verbindung auf Ihrem Apache-Host unterbrochen. Die Verbindung zwischen Apache und Ihrem Proxy-Ziel erfolgt über einfaches HTTP.
Wenn Sie auch die Proxy-Verbindung benötigen, um sicher zu sein, sollten Sie die verwenden SSLProxy
Optionen bereitgestellt von mod_ssl
. SSLProxyEngine = On
funktioniert als einfachste Konfiguration, vorausgesetzt, Apache und Ihr Ziel-Proxyserver haben Zugriff auf dieselben Zertifikate. Diese Option leitet SSL-Informationen über die Proxy-Verbindung weiter.
Proxy-Optionen
Apache-Reverse-Proxys verfügen über mehrere optionale Anweisungen, mit denen Sie das Weiterleitungsverhalten optimieren können. Hier sind einige häufig verwendete Optionen:
ProxyAddHeaders
– Apache-PassX-Forwarded-Host
,XForwarded-For
undX-Forwarded-Server
Header zu Ihrem Standard-Hauptserver. Diese ermöglichen Ihrem Backend zu erkennen, dass eine Anfrage über Apache weitergeleitet wurde. Setzen Sie diesen Header aufOff
verhindert, dass Apache diese Header hinzufügt.ProxyErrorOverride
– Apache stört die von Ihrem Hauptserver gesendeten Antworten nicht, sofern nicht anders angegeben. Wenn Ihr Backend einen Fehlercode 400, 404, 500 oder einen anderen Fehlercode bereitstellt, erhält der Benutzer diesen Inhalt unverändert. EinstellungProxyErrorOverride
ändert dies und lässt Apache den Inhalt von Fehlerseiten durch die ersetzenErrorDocument
eher. Dies kann in Situationen wünschenswert sein, in denen Sie möchten, dass Fehler von all Ihren Backends einheitlich mit einer zentralisierten Konfiguration auf dem Proxy-Host behandelt werden.ProxyPassReverseCookieDomain
– Es funktioniert genauso wie obligatorisch (für Reverse-Proxy)ProxyPassReverse
Richtlinie. Es wird die Domäne neu schreibenSet-Cookie
Kopfzeilen, um auf den Namen des virtuellen Hosts zu verweisen, und nicht auf den Hostnamen des Hauptservers, von dem sie stammen.ProxyPreserveHost
– Apache sendet normalerweise seinen eigenen Hostnamen als Wert von an Ihre HauptserverHost
in deinen Gedanken. Die Definition dieser Richtlinie bedeutet, dass die OriginalHost
stattdessen wird der Header gesendet. Dies kann erforderlich sein, wenn Ihre Hauptsoftware ihr eigenes Routing basierend auf dem Hostnamen durchführt.ProxyTimeout
– Verwenden Sie diese Anweisung, um die Wartezeit von Apache anzupassen, während Ihr Hauptserver eine Proxy-Anfrage verarbeitet. Apache bricht die Anfrage ab und gibt einen Fehlercode an den Client zurück, wenn das Timeout überschritten wird. Es ist standardmäßig auf ServerebeneTimeout
Wert.
Sie können diese Anweisungen als zusätzliche Zeilen in Ihrer virtuellen Hostdatei definieren. Denken Sie daran, den Apache-Dienst jedes Mal neu zu starten, wenn Sie eine Änderung anwenden.
Lastverteilung
Die Reverse-Proxy-Implementierung von Apache unterstützt auch den Lastenausgleich zwischen mehreren verschiedenen Backends. Dies ermöglicht eine Anfrage an example.com
Tippen Sie auf einen der Server in Ihrem Ausgleichspool.
BalancerMember http://192.168.0.1 BalancerMember http://192.168.0.2 ProxySet lbmethod=bytraffic ProxyPass / balancer://Beispiel-Balancer ProxyPassReverse / balancer://Beispiel-Balancer
Dieses Beispiel leitet Anforderungen an einen von zwei Servern in der weiter example-balancer
Schüssel. Der Lastausgleichsalgorithmus wird durch die definiert lbmethod
Einstellung; das bytraffic
Der hier verwendete Wert versucht sicherzustellen, dass jeder der Server die gleiche Menge an Datenverkehr verarbeitet.
Die Alternative byrequests balancing method
ist eine einfachere Version von Bytraffic, die jedem Backend einen gleichen Anteil an eingehenden Anfragen zuweist. das bybusyness balancer
verfolgt die Anzahl der Anfragen, die von jedem Backend verarbeitet werden, und weist dann neue Anfragen dem weniger „ausgelasteten“ Backend zu.
Zusammenfassung
le mod_proxy
Das Modul kann Apache in einen Reverse-Proxy-Host verwandeln, mit dem Sie namensbasiertes Routing verwenden können, um auf mehrere unabhängige Dienste zuzugreifen. Sie können auch Lastenausgleich hinzufügen, um Stabilität und Verfügbarkeit bereitzustellen, indem Sie Anforderungen über Ihre gesamte Serverfarm verteilen.
Andere Proxy-Varianten sind ebenfalls verfügbar. Sie können unter anderem FTP-, WebSocket- und HTTP2-Verbindungen als Proxy verwenden, indem Sie daneben Add-Ons installieren mod_proxy
. Die vollständige Liste der Module ist in den Apache-Dokumenten verfügbar.