В этой статье мы рассмотрим как использовать веб-сервер Apache в качестве прокси-сервера (как прямого так и обратного) с балансировкой нагрузки между несколькими внутренними серверами, на которых развернуто приложение.
Например, у нас есть два сервера, на которых работает одинаковое приложение:
- http://192.168.1.101:8081/application-url
- http://192.168.1.102:8082/application-url
И один сервер, на котором поднят веб-сервер Apache:
- http://192.168.1.100:8080
Мы хотим, чтобы http запросы к приложению /application-url шли через веб-сервер Apache, который будет выступать в качестве прокси и балансировщика, т.е. будет распределять нагрузку между серверами 192.168.1.101:8081 и 192.168.1.102:8082.
Для этого необходимо:
1. В конфигурационном файле http-сервера httpd.conf активировать/добавить следующие три директивы:
1 2 3 |
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so |
2. В этом же файле httpd.conf добавить конфигурацию прокси. В элементе Proxy следует прописать сервера, между которыми будет осуществляться распределение запросов и указать метод балансировки. Например:
1 2 3 4 5 |
<Proxy balancer://my-balancer> BalancerMember http://192.168.1.101:8081 loadfactor=1 BalancerMember http://192.168.1.102:8082 loadfactor=1 ProxySet lbmethod=byrequests </Proxy> |
Где:
- balancer – параметр, определяющий уникальный идентификатор (имя) конфигурации балансировщика;
- BalancerMember – параметр, определяющий инстанс сервера, участвующего в балансировке. Необходимо указывать IP адрес или DNS-имя сервера и порт;
- loadfactor – параметр, определяющий распределение нагрузки между BalancerMember. Если необходимо равное распределение нагрузки (50/50%), то необходимо установить одинаковые значения loadfactor для каждого участника;
- lbmethod – параметр, определяющий алгоритм распределения нагрузки. Возможные варианты:
byrequests
– по количеству запросов. Используется по умолчанию;bytraffic
– по количеству трафика;bybusyness
– по занятости.
3. Далее в файле httpd.conf необходимо добавить директивы ProxyPass
и ProxyPassReverse
для определения URL приложения, доступ к которому будет осуществляться через прокси (как для запросов, так и для ответов) и для которого будет работать балансировка нагрузки.
1 2 3 |
ProxyPass /application-url balancer://my-balancer/application-url ProxyPassReverse /application-url http://192.168.1.101:8081/application-url ProxyPassReverse /application-url http://192.168.1.102:8082/application-url |
ProxyPass используется для того, что бы веб-сервер получил запрос от клиента и передал его балансировщику, который в свою очередь перенаправит его серверам, на которых работает приложение, согласно выбранному алгоритму распределения нагрузки. ProxyPassReverse делает обратное – когда сервер, где работает приложение, отдает ответ клиенту, ответ направляется через веб-сервер, а не напрямую от сервера с приложением. Таким образом, сервера, на которых находятся приложения будут скрыты от пользователя.
4. Для управления балансировщиком через браузер и просмотра его активности, можно подключить модуль управления – Load Balancer Manager. Для этого в httpd.conf нужно добавить:
1 2 3 4 5 6 |
<Location /balancer-manager> SetHandler balancer-manager Order Deny,Allow Deny from all Allow from 192.168.1.200 </Location> |
В Allow from следует добавить IP адреса, которым разрешено управлять балансировщиком. Для нашего примера, веб-интерфейс управления будет доступен c IP 192.168.1.200 по ссылке:
http://192.168.1.100:8080/balancer-manager
5. После редактирования httpd.conf, необходимо сохранить изменения и перезапустить веб-сервер.
Дополнительно:
1. Существует возможность определить сервер в качестве горячего резерва (hot stand-by), т.е. запросы на этот сервер пойдут только тогда, когда другие участники будут недоступны. Для этого необходимо в Proxy добавить BalancerMember с ключом +H, например:
BalancerMember http://192.168.1.103:8083 +H
2. Для активации “sticky sessions” или “session affinity” на основе куки (cookie), когда все запросы в рамках сессии выполняются на одном сервере, необходимо:
- В директиве
ProxySet
, элемента Proxy, добавить строку stickysession=JSESSIONID|jsessionid. - Для каждого BalancerMember добавить параметр route.
Вот как будет выглядеть описание для нашего примера:
1 2 3 4 5 |
<Proxy balancer://my-balancer> BalancerMember http://192.168.1.101:8081 route=instanceOne loadfactor=1 BalancerMember http://192.168.1.102:8082 route=instanceTwo loadfactor=1 ProxySet lbmethod=byrequests stickysession=JSESSIONID|jsessionid </Proxy> |
Подробнее о модуле mod_proxy_balancer, в том числе о настройке “sticky sessions”, можно узнать на сайте Apache:
http://httpd.apache.org/docs/2.2/mod/mod_proxy_balancer.html
Добрый день, Sergey Kirsanov
А подскажите пожалуйста для серверов на которых есть одинаковое приложение обязательно ли подключение по разным портам?
http://192.168.1.101:8081 – ?
http://192.168.1.102:8082 – ?
Нет, порты могут быть любые – как одинаковые, так и разные.