[Resolvido] Acessando aplicação Tomcat através do Apache

Olá pessoal,

preciso fazer o deploy de uma aplicação Java que roda no Tomcat em um servidor, sendo que esse servidor já possui um Apache.

Devido às restrições de portas da máquina (o servidor não é meu) não é possível acessar a aplicação tomcat diretamente de outra máquina, então estou tentando fazer com que o Tomcat seja acessível através do Apache, ou seja, o Apache recebe a requisição e encaminha para o Tomcat processá-la.

No servidor o Apache é o 2.2 e o Tomcat o 6.0.

Pesquisei sobre o assunto nas seguintes páginas:

http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

http://tomcat.apache.org/connectors-doc/generic_howto/quick.html

Primeiro fiz o teste em localhost na minha máquina e deu certo.

O que fiz foi basicamente:

copiar o mod_jk.so para o lib do apache
criar o arquivo workers.properties na mesma pasta que o apache2.conf
criar o arquivo de mod_jk.conf no conf do tomcat
incluir o mod_jk.conf no fim do arquivo apache2.conf

Fiz os mesmos passos no servidor, mas sem sucesso. Nem o redirecionamento em localhost funciona.

Não sei mais o que fazer ou de quem poderia ser a ?culpa?, alguma configuração do apache ou do tomcat… mas pela análise dos logs chegasse a conclusão de que o apache não está nem redirecionando a chamada para o Tomcat.

Uma diferença importante o ambiente da minha máquina (onde tudo funcionou) e o do servidor, é que enquanto o meu o Apache recebe a chamada e já redireciona, no servidor ele tenta acessar a aplicação como se fosse uma aplicação do Apache (e não efetua o redirecionamento para o Tomcat).

Resumo do estado atual no servidor:

Analisando os logs percebesse que o módulo mod_jk é carregado sem erros;

Ao acessar $lynx http://localhost:8081/AppDoTomcat dá certo (o meu Tomcat tá instalado na 8081);

Ao acessar $lynx http://localhost/AppDoTomcat o resultado é um erro 404 (page not found), sendo que o Apache tenta acessar a aplicação no diretório www/AppDoTomcat, sendo www o diretório base de sites do Apache (nada a ver com o Tomcat).

Arquivos de configuração:

mod_jk.conf:

  # Load mod_jk module

  # Update this path to match your modules location

  LoadModule    jk_module  /usr/lib/apache2/modules/mod_jk.so

  # Declare the module for <IfModule directive> (remove this line on Apache 2.x)

  # AddModule     mod_jk.c

  # Where to find workers.properties

  # Update this path to match your conf directory location (put workers.properties next to httpd.conf)

  JkWorkersFile /etc/apache2/workers.properties

  # Where to put jk shared memory

  # Update this path to match your local state directory or logs directory

  JkShmFile     /var/log/mod_jk.shm

  # Where to put jk logs

  # Update this path to match your logs directory location (put mod_jk.log next to access_log)

  JkLogFile     /var/log/mod_jk.log

  # Set the jk log level [debug/error/info]

  JkLogLevel    info 

  # Select the timestamp log format

  JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

  # Send everything for context /examples to worker named worker1 (ajp13)

  JkMount  /AppDoTomcat*   worker1

workers.properties:

  worker.list=worker1

  # Set properties for worker1 (ajp13)

  worker.worker1.type=ajp13

  worker.worker1.host=localhost

  worker.worker1.port=8009

  # teste

  worker.worker1.socket_keepalive=1

  # teste 2

  worker.worker1.mount=/AppDoTomcat/*

últimas linhas do apache2.conf:

# Enable TomCat to work with apache

Include /opt/tomcat/conf/mod_jk.conf

Eu uso o proxy_ajp do Apache, que é mais simples de configurar. Segue abaixo a configuração necessaria para o Apache HTTPd fazer o proxy para o Tomcat.

No arquivo de configuração do Apache adicione a seguintes linha:

ProxyPass       /<NOME_APP>           ajp://localhost:8009/<NOME_APP>

Essa linha deve ser adicionada dentro da configuração global do Apache ou de dentro do virtual host desejado. Lembrando que o Tomcat está rodando o AJP na porta 8009.

E para carregar o modulo é necessário a seguinte linha:

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

Uso o CentOS e por padrão o Apache já vem com esse módulo. Não é necessario nenhuma configuração adicional no Tomcat.

Nossa cara, valeu!!! FUNCIONOU!

E desse jeito foi muito fácil, hehe xD
// tava apanhando muito pro outro jeito

Única coisa que no servidor eu também tive que mandar carregar o “mod_proxy” (do qual dependia o mod_prox_ajp), mas foi sussa…

Valeu
inté!