Я хотел бы иметь два сервера 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