
Ich habe vor, einen Reverse-Proxy mit Apache einzusetzen, aber bevor ich das in der Produktionsumgebung mache, habe ich versucht, es in meinem Heimlabor zu implementieren. Ich habe zwei VMs, die auf Redhat laufen.
192.168.56.70 mainsite.example.com mainsite
#192.168.56.70 mainsite2.example.com mainsite2
192.168.56.71 areverseproxy.example.com areverseproxy
auf dem Backend-Apache-Server habe ich einen virtuellen Host erstellt, die Inhalte dieses VHosts
<VirtualHost *:80>
# DocumentRoot "/var/www/html/"
# <Directory "/var/www/html/mainsite">
# AllowOverride None
# # Allow open access:
# Require all granted
# </Directory>
#DirectoryIndex "/var/www/html/mainsite/index.html"
ServerName mainsite.example.com
ServerAlias mainsite
Redirect permanent / https://192.168.56.70
ErrorLog "/var/log/httpd/mainsite.example.com-error_log"
CustomLog "/var/log/httpd/mainsite.example.com-access_log" common
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/ca.crt
SSLCertificateKeyFile /etc/pki/tls/private/ca.key
DocumentRoot "/var/www/html/mainsite"
<Directory "/var/www/html/mainsite">
AllowOverride None
# Allow open access:
Require all granted
</Directory>
#DirectoryIndex "/var/www/html/mainsite/index.html"
ServerName mainsite.example.com
ServerAlias mainsite
ErrorLog "/var/log/httpd/mainsite.example.com-error_log"
CustomLog "/var/log/httpd/mainsite.example.com-access_log" common
</VirtualHost>
Und auf dem Reverse Proxy Server habe ich diese Zeilen hinzugefügt, um den Reverse Proxy zu aktivieren
<IfModule mod_proxy.c>
ProxyRequests Off
<Proxy *>
Require all granted
</Proxy>
# backend server and forwarded path
ProxyPreserveHost On
ProxyPass / http://mainsite.example.com/
ProxyPassReverse / http://mainsite.example.com/
</IfModule>
Wenn ich versuche, die URL zu öffnenhttp://192.168.56.71Es erfolgt eine Weiterleitung zuhttps://192.168.56.70Das ist ok, wenn ich keinen Reverse-Proxy-Server habe, aber im Reverse-Proxy-Szenario sollte es seinhttps://192.168.56.71
Kann mir jemand sagen, welche Änderungen ich am Reverse-Proxy-Server vornehmen muss, damit die URL erhalten bleibt?https://192.168.56.71wenn ich eine URL eingebehttp://192.168.56.71
Vielen Dank
Nach der Bereitstellung auf dem Prod Server
Fehler
[Mon May 31 09:16:26.650015 2021] [proxy_http:error] [pid 104179] (103)Software caused connection abort: [client 192.168.22.140:40286] AH01102: error reading status line from remote server 172.16.1.140:443
[Mon May 31 09:16:26.650214 2021] [proxy:error] [pid 104179] [client 192.168.22.140:40286] AH00898: Error reading from remote server returned by /
Antwort1
Sie sollten zwei virtuelle Hosts auf dem Reverse-Proxy-Server haben. Ich würde empfehlen, globale Proxypass-Direktiven auf einem Reverse-Proxy zu löschen und sie für jeden virtuellen Host anzugeben.
Der virtuelle Host auf Port 80 sollte auf Port 443 auf demselben Host (areverseproxy.example.com) umleiten, so wie Sie es auf dem Backend-Server getan haben. Allerdings sollte niemand mehr Port 80 auf dem Backend eingeben, wenn Sie den Reverse-Proxy richtig eingerichtet haben, es sei denn, das Backend ist auch über das Internet erreichbar.
Der virtuelle Host auf Port 443 sollte über eine Reverse-Proxy-Konfiguration verfügen.
Auf dem Reverse-Proxy sollte etwa Folgendes stehen:
<VirtualHost *:80>
ServerName areverseproxy.example.com
ServerAlias areverseproxy
Redirect permanent / https://192.168.56.71
ErrorLog "/var/log/httpd/areverseproxy.example.com-error_log"
CustomLog "/var/log/httpd/areverseproxy.example.com-access_log" common
</VirtualHost>
<VirtualHost *:443>
ServerName areverseproxy.example.com
ServerAlias areverseproxy
ErrorLog "/var/log/httpsd/areverseproxy.example.com-error_log"
CustomLog "/var/log/httpsd/areverseproxy.example.com-access_log" common
SSLEngine on
SSLCertificateKeyFile conf/ssl.key/areverseproxy.example.com.key
SSLCertificateFile conf/ssl.crt/areverseproxy.example.com.crt
SSLProxyEngine on
SSLProxyCheckPeerCN off
SSLProxyCheckPeerExpire off
SSLProxyCheckPeerName off
ProxyRequests off
ProxyPreserveHost on
ProxyPass / https://192.168.56.70:443/
ProxyPassReverse / https://192.168.56.70:443/
</VirtualHost>
Sie haben wahrscheinlich kein gültiges HTTPS-Zertifikat auf dem Backend-Host. Daher benötigen Sie SSLProxyCheck*
Anweisungen. Wenn das Backend gültige Zertifikate mit Namen hat, können Sie SSLProxyCheck*
Anweisungen löschen. In diesem Fall sollten die Anweisungen ProxyPass
und jedoch ProxyPassReverse
nicht wie im Beispiel auf eine IP-Nummer verweisen, sondern auf den Hostnamen aus dem Zertifikat.
Möglicherweise benötigen Sie auch kein HTTPS zwischen Proxy-Reverse und Backend, wenn sich diese im selben geschützten Netzwerk befinden. Wenn nicht, behalten Sie HTTPS zwischen Reverse-Proxy und Backend bei, um den Datenverkehr zu schützen.
Denken Sie daran, dass Clients nur mit dem Reverse-Proxy kommunizieren. Daher ist es wichtig, dass Sie über die richtigen HTTPS-Zertifikate für den Reverse-Proxy und nicht für das Backend verfügen.