
Я планировал развернуть обратный прокси-сервер с помощью Apache, но прежде чем сделать это в рабочей среде, я попытался реализовать это в своей домашней лаборатории. У меня запущены две виртуальные машины на 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
на сервере Backend 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>
Если я попытаюсь открыть URLhttp://192.168.56.71он перенаправит наhttps://192.168.56.70что нормально, если у меня нет обратного прокси-сервера, но в сценарии с обратным прокси он должен бытьhttps://192.168.56.71
Может ли кто-нибудь подсказать, какие изменения мне следует внести на обратном прокси-сервере, чтобы URL остался прежним?https://192.168.56.71если я ввожу URLhttp://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 должен перенаправлять на порт 443 на том же хосте (areverseproxy.example.com) так же, как вы это делали на сервере бэкенда. Однако никто больше не должен входить в порт 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 между proxyreverse и backend, если они находятся в одной защищенной сети. Если нет, оставьте HTTPS между обратным proxy и backend для защиты трафика.
Помните, что клиенты будут взаимодействовать только с обратным прокси-сервером, поэтому важно иметь правильные сертификаты HTTPS для обратного прокси-сервера, а не для бэкэнда.