Назад | Перейти на главную страницу

Заставить Apache proxy_balancer к конкретному исполнителю

Я хотел бы иметь два сервера tomcat за proxy_balancer, чтобы я мог выполнять скользящие развертывания.

У меня это работает, поэтому я могу снять одного кота, а другой выполняет все запросы

<Proxy balancer://production>
    BalancerMember http://10.10.10.111:8080 route=s1
    BalancerMember http://10.10.10.112:8080 route=s2
    ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /services balancer://production/services
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED

Теперь я хотел бы снять один сервер и отключить его от пула, что я могу сделать с помощью диспетчера балансировки. Затем, когда я обновил и запустил этот сервер, прежде чем вернуться в пул, я хотел бы иметь к нему доступ, чтобы я мог проверить его работоспособность, прежде чем вернуться в пул. Например

ProxyPass /sanity_check http://10.10.10.111:8080/services

но это не сработает, потому что сервер перенаправляет себя на / services и проходит через балансировщик. Я мог бы сделать это с отдельным доменом, но хочу этого избежать.

Я подумал о настройке файла cookie на основе параметра URL, который мог бы работать, но было неудобно делать. Есть ли какая-то функция, позволяющая легко это сделать. Например, в HAProxy я могу это сделать

use-server tomcat_01 if { path_end TOMCAT_01 }
use-server tomcat_02 if { path_end TOMCAT_02 }

Вот как я это сделал. Настройте 3 пула балансировщиков - основной и по одному для каждого отдельного сервера:

<Proxy balancer://tomcat1>
   BalancerMember http://10.10.10.111:8080 route=t1
   ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://tomcat2>
   BalancerMember http://10.10.10.112:8080 route=t2
   ProxySet stickysession=ROUTEID
</Proxy>
<Proxy balancer://production>
   BalancerMember http://10.10.10.111:8080 route=p1
   BalancerMember http://10.10.10.112:8080 route=p2
   ProxySet stickysession=ROUTEID
</Proxy>

Наличие пула для отдельных серверов обеспечивает единообразие.

В route=p1 используется для установки файла cookie, чтобы балансировщик мог использовать привязку сеанса закрепления, то есть использовать один и тот же сервер для сеанса браузера. Даже если сеансы разделяются между серверами, это полезно для скользящего развертывания, потому что я не хочу, чтобы пользователь запускал старую версию, а затем получал файлы .js и т. Д. С нового сервера.

Я буду использовать этот файл cookie, чтобы решить, какой пул использовать. Например. если ROUTEID cookie это .t1 (обратите внимание на начальную точку - очевидно, это необходимо), затем используйте балансировщик tomcat1.

# Default to production pool 
SetEnvIf Request_URI "/" TARGET_POOL=production

SetEnvIf Cookie "ROUTEID=.t1" TARGET_POOL=tomcat1
SetEnvIf Cookie "ROUTEID=.t2" TARGET_POOL=tomcat2

После установки файла cookie маршрута сеанс продолжится через этот внутренний балансировщик.

Я могу выбрать балансировщик, который я хочу использовать, добавив идентификатор в конец URL-адреса, чтобы выбрать пул балансировщика, который я хочу использовать для этого сеанса.

Установите переменную среды TARGET_POOL в соответствующий бассейн

SetEnvIf Request_URI "/select_tomcat1$" TARGET_POOL=tomcat1
SetEnvIf Request_URI "/select_tomcat2$" TARGET_POOL=tomcat2
SetEnvIf Request_URI "/select_pool$" TARGET_POOL=production

Теперь я могу использовать TARGET_POOL передать запрос выбранному бэкэнд-балансировщику

ProxyPassInterpolateEnv On
ProxyPass /services balancer://${TARGET_POOL}/services interpolate
ProxyPassReverse /services balancer://${TARGET_POOL}/services interpolate

Обратите внимание, что для работы этих переменных ProxyPassInterpolateEnv On требуется, и каждый ProxyPass и ProxyPassReverse нужен interpolate

Наконец, мне нужно установить файл cookie, который используется выше для привязки сеанса привязки балансировщиком и мной, чтобы выбрать серверную часть:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED