Autor: Otávio Azevedo
Este documento resume, em alto nível, a minha experiência configurando o Apache HTTP Server como balanceador de carga para aplicações Java (Tomcat/JBoss) utilizando o mod_jk.
Não é um passo a passo técnico – é um resumo do que eu sei fazer, quando indico essa solução e os pontos de atenção que já enfrentei em produção. :contentReference[oaicite:0]{index=0}
Eu indico o uso do Apache + mod_jk principalmente em cenários como:
- Ambientes legados ou consolidados em JBoss/Tomcat usando o conector AJP 1.3;
- Sistemas que já nasceram com arquitetura baseada em AJP e
mod_jk(sem intenção de reescrever agora); - Situações onde já existe um histórico grande de operação em produção com
mod_jke a equipe está acostumada com o modelo.
Nesses casos, o Apache fica na frente recebendo as requisições HTTP/HTTPS e distribui a carga via AJP para várias instâncias de JBoss/Tomcat.
Pontos que eu conheço e sei explicar/trabalhar:
-
AJP (Apache JServ Protocol)
- Protocolo binário otimizado para comunicação Apache ↔ Tomcat/JBoss;
- Menos overhead que HTTP puro, com conexões reaproveitadas;
- A versão mais usada é a 1.3, referida como ajp13. :contentReference[oaicite:1]{index=1}
-
Workers
- Cada instância de JBoss/Tomcat é um worker (host + porta AJP);
- É possível definir templates para reaproveitar configurações (timeout, ping, etc.);
- Vários workers formam um grupo de balanceamento (cluster).
-
Balanceamento de carga
worker.type=lbpara criar o load balancer;- Configuro o balanceador apontando para uma lista de workers (instâncias);
- Posso ajustar fatores de peso (lbfactor) para dar mais carga a determinados nós.
-
Sticky session
- Uso
sticky_session=Truequando a aplicação precisa que a sessão do usuário seja atendida sempre pela mesma instância; - Já trabalhei com cenários onde a aplicação não estava preparada para sessão compartilhada e o sticky era obrigatório.
- Uso
-
JK Status Manager
- Ponto web
/jkstatusque mostra o estado dos workers, quantas requisições, se o nó está em erro etc.; - Configuro com proteção por usuário/senha para evitar exposição indevida. :contentReference[oaicite:2]{index=2}
- Ponto web
Em ambiente real, já fiz:
- Ajustes de hardening no Apache (headers de segurança, esconder versão, desabilitar TRACE, ETag etc.);
- Configuração de MPM event com parâmetros ajustados para alto volume de requisições;
- Habilitação de compressão HTTP com mod_deflate para reduzir banda (HTML, CSS, JS, JSON, fontes, etc.); :contentReference[oaicite:3]{index=3}
- Compilação e instalação do mod_jk a partir do código‑fonte quando o pacote não existe no repositório da distro (CentOS/RHEL);
- Definição de:
- Arquivo de workers (workers.properties) com diversas instâncias JBoss;
- Grupo de balanceamento (ex.:
sigeduc_lb) com várias instâncias atrás; - Arquivo de mapeamento de URLs (uriworkermap) indicando quais caminhos vão para o cluster, e qual vai para o status;
- Criação de VirtualHost Apache apontando para o
JkMountFilecorreto e configurando logs separados para o domínio público; - Configuração de acesso autenticado ao
/jkstatus(AuthType Basic com arquivo de senha específico).
Na prática, vejo essas vantagens em ambientes que já usam mod_jk:
-
Integração madura com JBoss/Tomcat
- Muito usada há anos em ambientes Java;
- Bastante documentação e histórico de produção.
-
Controle fino sobre os nós de aplicação
- Consigo remover/colocar instâncias do pool via configuração;
- Visualizo estado e métricas básicas pelo JK Status Manager.
-
Reaproveitamento de infraestrutura existente
- Em vez de trocar tudo para outro balanceador, mantemos Apache + mod_jk e vamos evoluindo aos poucos o entorno (monitoramento, automação etc.).
Eu não costumo indicar mod_jk como primeira escolha quando:
- O ambiente é novo e não tem legado em AJP;
- A aplicação já está preparada para HTTP direto ou containerizada (Docker/Kubernetes);
- A stack está mais alinhada com reverse proxy HTTP puro (Nginx, Apache + mod_proxy, ingress controller, etc.).
Nesses casos, Apache + mod_proxy_balancer ou Nginx como reverse proxy costumam fazer mais sentido, por serem mais simples e mais alinhados com arquiteturas modernas de microserviços.
Alguns pontos que sempre olho:
-
Versão e segurança do AJP
- Ajustar firewall e restrições de rede para que a porta AJP não fique exposta externamente;
- Manter JBoss/Tomcat atualizados para evitar vulnerabilidades relacionadas ao AJP.
-
Homogeneidade dos nós de aplicação
- Ao escalar horizontalmente, garantir que todos os servidores do pool tenham:
- mesma versão de SO;
- mesmo tipo de JBoss/Tomcat;
- recursos compatíveis de CPU/RAM. :contentReference[oaicite:4]{index=4}
- Ao escalar horizontalmente, garantir que todos os servidores do pool tenham:
-
Logs para troubleshooting
- Apache:
error_log,access_logemod_jk.log; - JBoss/Tomcat:
server.log,catalina.out; - Verificar código HTTP de resposta e mensagens de conexão recusada/timeout.
- Apache:
De forma resumida, posso dizer que sei:
- Montar Apache HTTPD como balanceador de carga utilizando
mod_jkcom AJP para múltiplas instâncias JBoss/Tomcat; - Ajustar parâmetros de escala e performance (MPM event, timeouts, sticky session, etc.);
- Fazer hardening básico do Apache e proteger endpoints de administração (
/jkstatus); - Documentar e replicar essa configuração para outros ambientes, deixando guias internos para o time.
Esse tipo de solução é especialmente útil em ambientes Java legados ou consolidados, que ainda não migraram para arquiteturas baseadas em containers e precisam de disponibilidade e distribuição de carga com a infraestrutura já existente.