
我計劃使用 Apache 部署反向代理,但在 Prod env 上部署之前,我嘗試在我的家庭實驗室中實作。
192.168.56.70 mainsite.example.com mainsite
#192.168.56.70 mainsite2.example.com mainsite2
192.168.56.71 areverseproxy.example.com areverseproxy
在後端 Apache 伺服器上,我建立了一個虛擬主機,該 VHost 的內容
<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>
在反向代理伺服器上,我新增了這些行以啟用反向代理
<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>
如果我嘗試開啟網址http://192.168.56.71它將重定向到https://192.168.56.70如果我沒有反向代理伺服器,那沒關係,但在反向代理場景中應該是https://192.168.56.71
任何人都可以指導我必須在反向代理伺服器上進行哪些更改,以便保留 URlhttps://192.168.56.71如果我輸入網址http://192.168.56.71
多謝
部署到 Prod Server 後
錯誤
[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 /
答案1
您應該在反向代理伺服器上有兩個虛擬主機。我建議刪除反向代理上的全域 proxypass 指令,並為每個虛擬主機指定它們。
連接埠 80 上的虛擬主機應重定向到相同主機 (areverseproxy.example.com) 上的連接埠 443,其方式與您在後端伺服器上執行的方式相同。然而,如果你正確地進行了反向代理,那麼任何人都不應該再進入後端的 80 端口,除非後端也可以透過互聯網存取。
連接埠 443 上的虛擬主機應具有反向代理配置。
在反向代理上你應該有這樣的東西:
<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>
您可能在後端主機上沒有有效的 HTTPS 憑證。因此,您需要SSLProxyCheck*
指令。如果後端具有名稱的有效證書,則您可以刪除SSLProxyCheck*
指令,但在這種情況下,ProxyPass
和ProxyPassReverse
指令不應指向 IP 號碼(如範例所示),而應指向證書中的主機名稱。
如果 proxyreverse 和後端位於同一受保護網路上,您可能也不需要 HTTPS。如果不是,請在反向代理和後端之間保留 HTTPS 以保護流量。
請記住,客戶端僅與反向代理通信,因此擁有反向代理(而不是後端)的正確 HTTPS 憑證非常重要。