
Apache を使用してリバース プロキシを展開することを計画していましたが、実稼働環境で実行する前に、自宅のラボで実装しようとしました。Redhat で実行されている VM が 2 つあります。
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>
URLを開こうとするとhttp://192.168.56.71リダイレクトされますhttps://192.168.56.70リバースプロキシサーバーがない場合は問題ありませんが、リバースプロキシのシナリオではhttps://192.168.56.71
リバースプロキシサーバーでどのような変更を加えればURLが維持されるのか教えていただけますか?https://192.168.56.71URLを入力するとhttp://192.168.56.71
どうもありがとう
Prodサーバーにデプロイした後
エラー
[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
リバース プロキシ サーバーには 2 つの仮想ホストが必要です。リバース プロキシ上のグローバル 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 番号ではなく、証明書のホスト名を指す必要があります。
また、リバース プロキシとバックエンドが同じ保護されたネットワーク上にある場合は、それらの間に HTTPS は必要ありません。そうでない場合は、トラフィックを保護するためにリバース プロキシとバックエンドの間で HTTPS を維持します。
クライアントはリバース プロキシとのみ通信するため、バックエンドではなくリバース プロキシに正しい HTTPS 証明書を用意することが重要です。