Balanceamento de Carga Tomcat com Apache: Guia Completo (Mod Proxy & Sticky Session)

Implementando o Balanceamento de Carga do Tomcat com Apache usando Proxy Module e Sticky Session

Configurar um balanceador de carga para o Tomcat, utilizando o servidor web Apache e o módulo Mod Proxy, é um processo relativamente direto.

O processo se torna mais simples quando seguido de forma sequencial e sem contratempos. Abaixo, detalho o passo a passo para configurar o Apache com o Tomcat, implementando o balanceamento de carga através do Mod Proxy.

Em ambientes de produção, o uso de balanceamento de carga é altamente recomendado para garantir maior disponibilidade e resiliência.

Configuração do Servidor Web Apache

  • Habilite os módulos proxy_module, proxy_balancer_module e proxy_http_module no arquivo httpd.conf do seu servidor web Apache.
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Adicione a diretiva ProxyPass juntamente com o nome do balanceador para o contexto raiz da aplicação.

Neste exemplo, utilizarei o caminho de proxy como “exemplos” e o nome do balanceador como “mycluster”.

A inclusão da diretiva “stickysession” é crucial, pois a ausência dessa opção pode causar a distribuição de uma mesma solicitação para diversos servidores Tomcat, resultando em problemas de expiração de sessão.

<IfModule proxy_module>
ProxyRequests Off
ProxyPass /examples balancer://mycluster stickysession=JSESSIONID
ProxyPassReverse /examples balancer://mycluster stickysession=JSESSIONID
<Proxy balancer://mycluster>
BalancerMember http://localhost:8080/examples route=server1
BalancerMember http://localhost:8090/examples route=server2
</Proxy>
</IfModule>

Como observado na configuração acima, adicionei um parâmetro “route” ao BalancerMember, permitindo que o valor da rota seja anexado ao ID da sessão.

Agora, configuremos o Apache para que o JSESSIONID seja impresso nos logs de acesso.

  • Inclua a seguinte diretiva no formato de log (LogFormat).
%{JSESSIONID}C

Exemplo:

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i""%{JSESSIONID}C"" combined
  • Reinicie o servidor web Apache para aplicar as alterações.

Configuração do Tomcat

É fundamental que as instâncias do Tomcat sejam configuradas com o mesmo ID de rota definido no BalancerMember acima.

  • Adicione o parâmetro “jvmRoute” no arquivo server.xml do Tomcat, dentro da tag correspondente ao nome do mecanismo (Engine).

Instância do Tomcat configurada na porta 8080:

<Engine name="Catalina" defaultHost="localhost" jvmRoute="server1">

Instância do Tomcat configurada na porta 8090:

 <Engine name="Catalina" defaultHost="localhost" jvmRoute="server2">

Verificação da Configuração

Gere um volume de requisições para a sua aplicação e examine o log de acesso do servidor Apache. Verifique se cada solicitação está sendo encaminhada para uma única instância do Tomcat.

Observe também que o seu ID de sessão está sendo anexado à rota, conforme o exemplo abaixo.

Exemplo:

127.0.0.1 - - [18/Sep/2013:10:02:02 +0800] "POST /examples/servlets/servlet/RequestParamExample HTTP/1.1" 200 662 "http://localhost/examples/servlets/servlet/RequestParamExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:06 +0800] "GET /examples/servlets/servlet/RequestInfoExample HTTP/1.1" 200 693 "http://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:17 +0800] "GET /examples/servlets/reqinfo.html HTTP/1.1" 200 3607 "http://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:20 +0800] "GET /examples/servlets/servlet/SessionExample HTTP/1.1" 200 1124 "http://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:26 +0800] "POST /examples/servlets/servlet/SessionExample HTTP/1.1" 200 1142 "http://localhost/examples/servlets/servlet/SessionExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:28 +0800] "GET /examples/servlets/servlet/SessionExample?dataname=fda&datavalue=fadaf HTTP/1.1" 200 1159 "http://localhost/examples/servlets/servlet/SessionExample" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B4EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:32 +0800] "GET /examples/servlets/servlet/SessionExample?dataname=foo&datavalue=bar HTTP/1.1" 200 1174 "http://localhost/examples/servlets/servlet/SessionExample?dataname=fda&datavalue=fadaf" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"
127.0.0.1 - - [18/Sep/2013:10:02:36 +0800] "GET /examples/servlets/servlet/RequestHeaderExample HTTP/1.1" 200 1423 "http://localhost/examples/servlets/" "Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130807 Firefox/17.0""B80557A1D9B48EC1D73CF8C7482B7D46.server2"

Espero que este guia detalhado ajude você a configurar um balanceador de carga para o Tomcat, utilizando o Apache Mod Proxy e Sticky Session de maneira eficaz.

Se você tiver interesse em aprofundar seus conhecimentos sobre administração do Tomcat, recomendo este curso online.

Gostou do artigo? Compartilhe este conhecimento com seus colegas e amigos!