Tomcat com URL limpa

Olá pessoal. Recentemente tive uma questão, relativamente simples mas que deu muito trabalho para resolver: fazer os sites em PHP e as aplicações em Java responderem com URL limpa, sem aquele ":8080".

[ Hits: 14.525 ]

Por: fernando freitas do vale em 11/06/2013


Introdução



Seguinte cenário:

Tenho um servidor web Apache PHP respondendo na porta 80, com alguns virtual hosts rodando tudo tranquilo. Porém, surgiu a necessidade de um servidor web Apache Tomcat responder com URL limpa.

A maneira a seguir é só uma maneira que encontrei, não estou aqui para justificar se é a melhor maneira ou a mais correta, só posso dizer que comigo resolveu.

Configurações do Apache 2 PHP

Vamos mexer em dois arquivos de configurações, no 000-default do Apache e no server.xml do Tomcat, partindo do ponto que você já tenha o cenário rodando: o Apache 2 PHP e o Apache Tomcat 6 (acredito que no Tomcat 7 também se aplica).

Vamos aos arquivos de configuração tomando como premissa que você está como superusuário:

# vim /etc/apache2/sites-enabled/000-default

Iremos criar o seguinte bloco dentro do conf:

<VirtualHost ipdositenodns:80>
 ServerName ipdodns
 ServerAlias exemplo.com.br
 ProxyPass / http://exemplo.com.br:8080/
 ProxyPassReverse / http://exemplo.com.br:8080/
</VirtualHost>

Explicando linha por linha do bloco acima, afinal é bom saber o que você está fazendo por tratar-se de servidor:
  • <VirtualHost ipdositenodns:80> :: nessa linha estamos abrindo a tag do virtual host e definindo o IP que o Apache irá responder, no caso o IP do site exemplo.com.br dentro do seu DNS. Caso você não tenha um IP disponível em termos de placa física basta criar um IP virtual dentro do GNU/Linux. Não iremos abordar isso aqui mas qualquer dúvida estamos aí.
  • ServerName ipdodns :: acredito que aí é bem claro, o IP do seu DNS.
  • ServerAlias exemplo.com.br :: aqui será onde iremos definir a URL que irá responder, exemplo.meudominio.com.br
  • ProxyPass / http://exemplo.com.br:8080/ e ProxyPassReverse / http://exemplo.com.br:8080/ :: essas duas linhas é que vão fazer o encaminhamento da requisição pro Tomcat (pelo menos no meu entender).
  • </VirtualHost> :: fechando a tag do virtual host.

Configuração do Tomcat 6

Agora vamos ao server.xml referente ao Tomcat, antes realize um backup do arquivo que lá na frente pode ser importante:

# cp /var/lib/tomcat6/conf/server.xml /var/lib/tomcat6/conf/serverbackup.xml

Obs.: fazer isso com todo XML ou conf que for alterar.

# vim /var/lib/tomcat6/conf/server.xml

Vamos procurar pela tag <Engine name="Catalina" defaulthost="localhost">

Depois dessa tag vamos procurar a seguinte tag:

<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false"/>

Abaixo dessa tag vamos adicionar o hostname do nosso exemplo:

<Host name="exemplo.com.br" appBase="webapps/exemplo"
           unpackWARs="true" autoDeploy="true"
           xmlValidation="false" xmlNamespaceAware="false"/>

Nessa tag na primeira linha definimos como no Tomcat a URL lá no serveralias, ou o nome que ela terá que responder e em appBase definimos a pasta base do aplicativo, no meu caso todas ficam dentro do webapps.

Saímos e salvamos.

Depois que saímos vamos criar a estrutura das pastas:

# mkdir /var/lib/tomcat6/webapps/exemplo

Após criarmos a pasta base criamos a pasta ROOT onde será colocado a aplicação em si, onde será gerado os deploys da aplicação:

# mkdir /var/lib/tomcat6/webapps/exemplo/ROOT

Depois que criamos a estrutura vamos criar a pasta dentro do Catalina:

# mkdir /var/lib/tomcat6/conf/Catalina/exemplo.com.br

Em seguida copiamos os arquivos ROOT.xml e manager.xml da pasta localhost em /var/lib/tomcat6/conf/Catalina/localhost para a pasta do exemplo /var/lib/tomcat6/conf/Catalina/exemplo:

# cp /var/lib/tomcat6/conf/Catalina/localhost/ROOT.xml /var/lib/tomcat6/conf/Catalina/exemplo/ROOT.xml
# cp /var/lib/tomcat6/conf/Catalina/localhost/manager.xml /var/lib/tomcat6/conf/Catalina/exemplo/manager.xml


Agora vamos editar o arquivo ROOT.xml dentro de /exemplo:

# vim /var/lib/tomcat6/conf/Catalina/exemplo/ROOT.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/" reloadable="true" docBase="webapps/exemplo" workdir="webapps/exemplo" >
    <Resource driverClassName="org.postgresql.Driver" maxActive="80" maxIdle="30" maxWait="5000" name="jdbc/SigaDS" password="senha" type="javax.sql.DataSource" url="jdbc:postgresql://ipdobanco:5432/nomedobanco" username="usuario"/>
</Context>

No caso do meu ROOT.xml eu defino o docbase e o workdir para onde fica a aplicação "webapps/exemplo" e depois tem a conexão com o banco de dados da aplicação.

O manager não precisa ser alterado, no meu caso criei um arquivo do ROOT.xml com o nome da aplicação exemplo.xml, não sei dizer com certeza se faz alguma diferença ou qual dos dois é usado (eu acredito que seja o exemplo.xml mas não testei) mas é bom prevenir.

# cp /var/lib/tomcat6/conf/Catalina/exemplo/ROOT.xml /var/lib/tomcat6/conf/Catalina/exemplo/exemplo.xml

Conclusão

Agora para finalizarmos basta reiniciar os serviços:

# service apache2 restart

Prefiro o restart ao reload mas aí é preferência de cada um.

# service tomcat6 restart

No caso do Tomcat 6, qualquer probleminha nos arquivos XML não vai deixar o Tomcat subir, por isso, antes de mais nada, é sempre bom manter backup dos arquivos XML para o caso de não se lembrar onde alterou e poder recomeçar as configurações.

Para qualquer dúvida a respeito dessa configuração estou a disposição, não vou entrar em questões de méritos da solução se é a melhor ou a pior, só posso dizer que resolveu o meu problema.

Fernando Freitas do Vale
f.freitasdovale[at]gmail.com - Talk

Abraços.

   

Páginas do artigo
   1. Introdução
Outros artigos deste autor

Servidor de Banco de Dados + Servidor Web PHP

Leitura recomendada

Imspector, um proxy para mensageiros instantâneos no Linux

Instalando o Apache + PHP + MySQL no Slackware

30 de Dezembro de 2015 - O dia que o Debian chorou

Dynamips + Dynagen - Emulando Vlans com router on stick no Linux

Configurando a internet e compartilhando a rede local, com o Kurumin 6 (IPs estáticos)

  
Comentários
[1] Comentário enviado por maikonalmeida em 21/06/2013 - 16:41h


Poderia utilizar o iptables, tudo que chegar na porta 80 redirecionar para porta que você precisa 8080

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

[2] Comentário enviado por fernandovale em 21/06/2013 - 16:47h

Da uma olhada no cenário,

Eu tenho um apache rodando na porta 80 e um tomcat rodando na 8080, se eu colocar uma regra de redirecionamento da porta 80 para a 8080 as paginas que estão em php não receberão requisição.

é só olhar o ambiente descrito.

[3] Comentário enviado por cROMADO em 25/06/2013 - 22:39h

Não precisou informar a porta do proxy no Tomcat?. conforme o link abaixo.
http://tomcat.apache.org/tomcat-6.0-doc/proxy-howto.html#Apache_2.0_Proxy_Support

Configure your copy of Tomcat 6 to include a special <Connector> element, with appropriate proxy settings, for example:
<Connector port="8081" ...
proxyName="www.mycompany.com"
proxyPort="80"/>

[4] Comentário enviado por fernandovale em 26/06/2013 - 11:56h

Nesse caso do seu link o proxy eh feito no Apache Tomcat.

O proxy realizado no meu ambiente é no Apache2, onde estão hospedadas as páginas php, a requisição chega na porta 80 onde estão as páginas php e o próprio Apache2 faz um proxy de acordo com o endereço para o tomcat.

[5] Comentário enviado por murilobilia em 23/07/2013 - 10:58h

Cara, dá para instalar e configurar o mod_jk no Apache: http://tomcat.apache.org/connectors-doc/

[6] Comentário enviado por fernandovale em 23/07/2013 - 11:17h

murilobilia,

Cara muito boa sua dica, dei uma pesquisada rápida e aparentemente também resolve a questão, o problema que na época que fiz a pesquisa para a configuração não achei nada referente a esse modulo, mas fica a dica para quem for configurar daqui pra frente, eu mesmo vou testar assim que tiver tempo e coloco aqui um artigo de configuração ou algo parecido.

O importante foi o que citei no inicio do artigo, na época resolveu o problema que eu estava enfrentando, e como não achei muito material referente a isso achei válido a postagem.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts