部署到 Prod Server 后

部署到 Prod Server 后

我计划使用 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*指令,但在这种情况下,ProxyPassProxyPassReverse指令不应指向 IP 号(如示例所示),而应指向证书中的主机名。

如果 proxyreverse 和后端位于同一受保护网络上,您也可能不需要 HTTPS。如果不是,请在反向代理和后端之间保留 HTTPS 以保护流量。

请记住,客户端将仅与反向代理通信,因此拥有反向代理(而不是后端)的正确 HTTPS 证书非常重要。

相关内容