部署到 Prod Server 後

部署到 Prod Server 後

我計劃使用 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*指令,但在這種情況下,ProxyPassProxyPassReverse指令不應指向 IP 號碼(如範例所示),而應指向證書中的主機名稱。

如果 proxyreverse 和後端位於同一受保護網路上,您可能也不需要 HTTPS。如果不是,請在反向代理和後端之間保留 HTTPS 以保護流量。

請記住,客戶端僅與反向代理通信,因此擁有反向代理(而不是後端)的正確 HTTPS 憑證非常重要。

相關內容