Foi assim que eu fiz. Configure três pools de balanceadores - o principal e um para cada servidor individual:
<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>
Ter um pool para os servidores individuais mantém as coisas consistentes.
O route=p1
é usado para definir um cookie para que o balanceador possa usar afinidade de sessão de sessão de adesão - que é o mesmo servidor para uma sessão do navegador. Mesmo que as sessões sejam compartilhadas entre os servidores, isso é útil para uma implantação contínua, porque eu não quero que um usuário acesse a versão antiga e, em seguida, obtenha arquivos .js etc. do novo servidor.
Eu usarei esse cookie para decidir qual pool usar. Por exemplo. se o ROUTEID
cookie for .t1
(observe o ponto inicial - isso é necessário, aparentemente) então use o balanceador 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
Quando o cookie de rota for definido, a sessão continuará passando pelo balanceador de back-end.
Eu posso escolher qual balanceador quero usar anexando um identificador ao final do URL para selecionar o pool de balanceadores que desejo usar para esta sessão.
Defina a variável de ambiente TARGET_POOL
para o pool apropriado
SetEnvIf Request_URI "/select_tomcat1$" TARGET_POOL=tomcat1
SetEnvIf Request_URI "/select_tomcat2$" TARGET_POOL=tomcat2
SetEnvIf Request_URI "/select_pool$" TARGET_POOL=production
Agora, posso usar TARGET_POOL
para passar a solicitação ao balanceador de back-end selecionado
ProxyPassInterpolateEnv On
ProxyPass /services balancer://${TARGET_POOL}/services interpolate
ProxyPassReverse /services balancer://${TARGET_POOL}/services interpolate
Observe que para essas variáveis funcionarem ProxyPassInterpolateEnv On
é obrigatório e cada ProxyPass
e ProxyPassReverse
precisa de interpolate
Por fim, preciso definir o cookie que é usado acima para a afinidade de sessão do stickysession pelo balanceador e por mim para selecionar o back-end:
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/;" env=BALANCER_ROUTE_CHANGED