Apache kann als Reverse-Proxy fungieren, der Client-Anfragen an Backend-Server weiterleitet und deren Antworten zurückgibt, indem er das Modul mod_proxy und seine zugehörigen Untermodule nutzt.
Ein Reverse-Proxy fungiert als Vermittler für Client-Anfragen und leitet diese an einen oder mehrere interne Backend-Server weiter. Er präsentiert eine einheitliche Schnittstelle zum Internet, während er die interne Netzwerkarchitektur verbirgt. Zu den Vorteilen gehören verbesserte Sicherheit, Lastausgleich, SSL/TLS-Terminierung, Caching und vereinfachte Backend-Verwaltung.
mod_proxy aktivieren
Um Apache als Reverse-Proxy zu konfigurieren, müssen das Kernmodul mod_proxy und spezifische Untermodule aktiviert werden. Diese Module bieten unterschiedliche Protokollunterstützung und Funktionen.
Wesentliche Module:
mod_proxy: Das Kern-Proxy-Modul.mod_proxy_http: Zum Proxying von HTTP- und HTTPS-Verkehr.mod_proxy_balancer: Erforderlich für den Lastausgleich über mehrere Backend-Server.mod_proxy_wstunnel: Für WebSocket-Proxying.mod_ssl: Wenn Apache die SSL/TLS-Terminierung für Client-Verbindungen übernehmen soll.
Aktivieren Sie Module mit dem Befehl a2enmod auf Debian/Ubuntu-basierten Systemen oder indem Sie LoadModule-Direktiven in httpd.conf auf CentOS/RHEL-basierten Systemen auskommentieren:
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod proxy_wstunnel
sudo a2enmod ssl
sudo systemctl restart apache2
Grundlegende HTTP-Reverse-Proxy-Konfiguration
Die grundlegenden Direktiven für einen Reverse-Proxy sind ProxyPass und ProxyPassReverse. Die Konfiguration wird typischerweise innerhalb eines <VirtualHost>-Blocks oder direkt in httpd.conf platziert.
<VirtualHost *:80>
ServerName yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
# Proxy all requests for /app to a backend server
ProxyPass /app http://backend-app-server:8080/app
ProxyPassReverse /app http://backend-app-server:8080/app
# Proxy all requests for the root path / to another backend
ProxyPass / http://backend-web-server:8000/
ProxyPassReverse / http://backend-web-server:8000/
# For SSL/TLS termination at Apache, and forwarding HTTP to backend
# RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
Wichtige Direktiven
ProxyRequests Off: Dies ist entscheidend. Es deaktiviert die Forward-Proxy-Funktionen von Apache und verhindert, dass er als offener Proxy fungiert, was ein erhebliches Sicherheitsrisiko darstellt. Für einen Reverse-Proxy sollte diese Direktive immer aufOffgesetzt sein.ProxyPreserveHost On: Diese Direktive stellt sicher, dass der ursprünglicheHost-Header der Client-Anfrage an den Backend-Server weitergegeben wird. WennOff, wird derHost-Header auf den Hostnamen und Port des Backend-Servers gesetzt.ProxyPass [path] [url]: Ordnet einen lokalen URL-Pfad (path) einer Backend-URL (url) zu. Apache fängt Anfragen ab, diepathentsprechen, und leitet sie anurlweiter.- Beispiel:
ProxyPass /app http://backend-app-server:8080/appbedeutet, dass eine Anfrage anhttp://yourdomain.com/app/page.htmlanhttp://backend-app-server:8080/app/page.htmlweitergeleitet wird.
- Beispiel:
ProxyPassReverse [path] [url]: SchreibtLocation-,Content-Location- undURI-Header in HTTP-Antworten vom Backend-Server um. Dies stellt sicher, dass Weiterleitungen oder Links, die vom Backend generiert werden, auf die öffentlich zugängliche Proxy-URL zurückverweisen, wodurch verhindert wird, dass Clients internen URLs ausgesetzt werden.<Proxy *>: Definiert die Zugriffskontrolle für den Proxy selbst.Require all grantederlaubt allen Clients die Nutzung des Proxys. Für eine strengere Sicherheit können spezifische IP-Adressen oder Netzwerke zugelassen werden.
Erweiterte mod_proxy-Funktionen
Lastausgleich
mod_proxy_balancer ermöglicht die Verteilung eingehender Anfragen auf mehrere Backend-Server, wodurch Verfügbarkeit und Skalierbarkeit verbessert werden.
<VirtualHost *:80>
ServerName app.yourdomain.com
ProxyRequests Off
ProxyPreserveHost On
<Proxy balancer://mycluster>
BalancerMember http://backend1.internal:8080 route=1 loadfactor=10
BalancerMember http://backend2.internal:8080 route=2 loadfactor=10
# Optional: ProxySet for specific balancer settings
ProxySet lbmethod=byrequests stickysession=JSESSIONID nofailover=Off
# For session stickiness, the backend must set a cookie like JSESSIONID
</Proxy>
ProxyPass / balancer://mycluster/
ProxyPassReverse / balancer://mycluster/
<Location "/balancer-manager">
SetHandler balancer-manager
Require ip 192.168.1.0/24 # Restrict access to internal network
</Location>
</VirtualHost>
BalancerMember-Attribute
| Attribut | Beschreibung