Перейти к содержимому
Обложка сообщества Разное

Apache2. Reverse Proxy.

Например вы пробросили порт на своем роутере на один веб-сервер в вашей внутренней сети. Но хотите чтобы каталог /xxx открывался на втором веб-сервере, а /yyy открывался на третьем, и не хотите пробрасывать порты на каждый web-сервер. Получается вот такая схема:

То что мы хотим сделать из сервера web1, называется reverse proxy (обратный прокси). Как следует из названия, обратный прокси делает полную противоположность тому, что делает forward proxy (прямой прокси).

Прямые прокси работают от имени клиентов, нам нужно настраивать браузер (клиент), чтобы тот ходил через прямой прокси сервер.

Обратные прокси работают от имени серверов. Клиент и не знает, что он обращается на прокси сервер. Обратный прокси-сервер принимает запросы от клиентов от имени серверов, расположенных за ним, как показано на рисунке.

Для этой задачи нам понадобится модуль — mod_proxy. Этот модуль реализует прокси для Apache, поддерживая ряд популярных протоколов, а также несколько различных алгоритмов балансировки нагрузки.

Все три сервера в моём примере выполнены на Debian 9.6 с установленным apache2.4:

root@web1:~# apt install apache2

root@web2:~# apt install apache2

root@web3:~# apt install apache2

В комплекте с Apache есть много модулей, которые доступны, но не включены. Поэтому, нам нужно включить те, которые мы будем использовать.

mod_proxy — основной прокси-модуль Apache, который позволяет Apache выступать в качестве шлюза к другим web серверам.

mod_proxy_http — добавляет поддержку прокси-соединений HTTP.

root@web1:~# a2enmod proxy

Enabling module proxy.

To activate the new configuration, you need to run:

systemctl restart apache2

root@web1:~# a2enmod proxy_http

Considering dependency proxy for proxy_http:

Module proxy already enabled

Enabling module proxy_http.

To activate the new configuration, you need to run:

systemctl restart apache2

root@web1:~# systemctl restart apache2

Далее для теста сделаем новый каталог на сервере web2:

root@web2:~# mkdir /var/www/html/yyy

root@web2:~# echo web2 > /var/www/html/yyy/index.html

root@web2:~# chown -R www-data:www-data /var/www/html/yyy/

Пробуем открыть в браузере страничку:

Тоже самое проделываем для сервера web3:

root@web3:~# mkdir /var/www/html/xxx

root@web3:~# echo web3 > /var/www/html/xxx/index.html

root@web3:~# chown -R www-data:www-data /var/www/html/xxx/

Теперь можно приступить к настройке reverse proxy на сервере web1:

root@web1:~# nano /etc/apache2/sites-available/000-default.conf

И дописываем следующее:

ProxyPreserveHost On

ProxyPass /yyy http://192.168.5.237/yyy

ProxyPassReverse /yyy http://192.168.5.237/yyy

ProxyPass /xxx http://192.168.5.240/xxx

ProxyPassReverse /xxx http://192.168.5.240/xxx

ProxyPreserveHost заставляет Apache передавать исходный заголовок host на внутренний сервер.

При проксировании сервер подменяет параметр host в заголовке запросов на host из опции ProxyPass, при этом копирует прежний host в параметр X-Forwarded-Server. При этом на некоторых сайтах может неправильно работать redirect подставляя локальный адрес внутреннего сервера (в примере web2 или web3), когда нужен внешний (в примере web1).

Для решения этой проблемы включают опцию ProxyPreserveHost, тогда сервер будет оставлять реальный host который пришел на текущий сервер.

ProxyPass - это основная директива конфигурации прокси. Она указывает, что все, что находится в /yyy, должно быть сопоставлено с внутренним сервером по указанному адресу.

ProxyPassReverse должен иметь ту же конфигурацию, что и ProxyPass. Это заставит Apache изменить заголовки ответа от внутреннего сервера. Это гарантирует, что браузер клиента будет перенаправлен на адрес прокси, а не на адрес внутреннего сервера.

Теперь перезагрузим Apache на прокси сервере:

root@web1:~# systemctl restart apache2

И можем проверять результат в браузере:

Как видно на рисунке, клиент и не заметит, что /xxx и /yyy работают на разных серверах. При этом на самом прокси сервере таких каталогов нет.

На этом все, спасибо за внимание!

Больше моих статей на IT темы можете найти тут.

0
0
476

Еще по теме

Apache2. Reverse Proxy. - Yvision.kz