我计划使用 Apache 部署反向代理,但在 Prod env 上部署之前,我尝试在我的家庭实验室中实现。我有两个在 Redhat 上运行的虚拟机。
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 证书非常重要。