Home > Aluno, Professores, TI > Como integrar o Apache2 com Tomcat

Como integrar o Apache2 com Tomcat

Aqui vai uma dica de um amigo meu de profissão, Thiago Soares. O menino é bom em Linux e está fazendo mestrado aqui no CIn/UFPE. Sempre tivemos curiosidade de integrar o Apache com o Tomcat e ele conseguiu essa façanha. Aqui vai um tutorial completo de como instalar cada dependência e integrar Apache2 com Tomcat. Espero que gostem.

—————————————————————————

Autor/Colaborador: Thiago Araújo

Publicado em: 7 de junho de 2010

Antes de mais nada, gostaria de dizer que esse tutorial não é igual a aqueles bilhões de tutoriais que você já leu na internet e sempre diz que essa %!%?$ não funcionava. Alegre-se você acaba de encontrar um tutorial que realmente funciona do início ao fim. Justamente nesse tutorial foi minha inspiração para criar o blog. Depois de passar 1 semana tentando integrar o apache2 e o tomcat eu resolvi fazer uma promessa, se eu conseguisse fazer essa integração pegar eu publicaria a solução num blog. Feito! Então mãos a obra. Peguei 2 tutoriais já prontos para configurar o básico coloquei o endereço deles como referência, além disso fiz algumas alterações. Bom, deixa de bla bla bla e vamos começar!

O primeiro passo é atualizar a lista de sites repositórios de programas do seu computador com o comando apt-get:

sudo apt-get update

INSTALANDO JAVA

O JDK (Java Development Kit) é um pacote de desenvolvimento, com compilador java. Há outras opções para quem precisa de menos recursos. Para o meu  caso, o pacote completo é mais indicado.

1.Para instalá-lo, use:

sudo apt-get install sun-java6-jdk

2.Vamos alterar os parâmetros de ambiente, abrindo o arquivo /etc/environment. :

sudo vim /etc/environment

acrescentar as duas linhas abaixo, logo no começo do arquivo:

JAVA_HOME="/usr/lib/jvm/java-6-sun"
JRE_HOME="/usr/lib/jvm/java-6-sun/jre"

Alterar a linha do Path, deixando-a parecida com o exemplo abaixo:

PATH=”/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/lib/jvm/java-6-sun/bin”

Por padrão o Ubuntu instala o JDK no diretório /usr/lib/jvm

INSTALANDO O TOMCAT

O Tomcat é um servidor de aplicações Java para web. É software livre e de código aberto, surgido dentro do conceituado projeto Apache Jakarta. O Tomcat é robusto e eficiente o suficiente para ser utilizado mesmo em um ambiente de produção.

1.Vamos baixar a versão 6.0.20, diretamente de um repositório oficial. Vamos utilizar uma técnica para encurtar o caminho, ou seja, evitar baixar em minha máquina e depois enviar para o servidor em externo, se for o caso:

sudo wget  http://ftp.unicamp.br/pub/apache/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz

2.Descompactar em algum diretório (como diz Anderson, a melhor pasta é o /opt)

sudo tar -zxvf apache-tomcat-6.0.20.tar.gz

3.Armazenar em /opt

sudo mv apache-tomcat-6.0.20 /opt/

4.Atribuir permissão de execução nos scripts de inicialização e finalização:

sudo chmod +x /opt/apache-tomcat-6.0.20/bin/*.sh

5.Criar um link simbólico para facilitar em futuras atualizações.

sudo ln -s /opt/apache-tomcat-6.0.20 /opt/tomcat

6.Iniciar o Tomcat automaticamente, ao ligar a máquina:
Criar um script em /etc/init.d/tomcat:

sudo vim /etc/init.d/tomcat

Inserir o seguinte conteúdo:

#!/bin/bash
# Tomcat auto-start
# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid

export JAVA_HOME=/usr/lib/jvm/java-6-sun

case $1 in

start) sh /opt/tomcat/bin/startup.sh ;;

stop) sh /opt/tomcat/bin/bin/shutdown.sh ;;

restart) sh /opt/tomcat/bin/bin/shutdown.sh ;

sh /opt/tomcat/bin/bin/startup.sh ;;

esac

exit 0

Torna-lo executável:

sudo chmod 755 /etc/init.d/tomcat

Associar esse script para as pastas de inicialização com um link simbólico:

sudo ln -s /etc/init.d/tomcat /etc/rc1.d/K99tomcat
sudo ln -s /etc/init.d/tomcat /etc/rc2.d/S99tomcat

O Tomcat está pronto.

INSTALANDO O APACHE

Este é o mais bem sucedido servidor web livre. Ele será necessário para disponibilizar as paginas de seu site,em nosso exemplo, com um gerenciador de conteúdo:

sudo apt-get install apache2

INTEGRANDO APACHE E TOMCAT

1.Instalando o mod-jk, conector responsável pela ligação do Apache com o Tomcat.

sudo apt-get install libapache2-mod-jk

2.Criando o arquivo workers

sudo vim /etc/libapache2-mod-jk/workers.properties

Inserir o seguinte conteúdo:

workers.tomcat_home=/opt/tomcat

workers.java_home=/usr/lib/jvm/java-6-sun

ps=/

worker.list=ajp13

worker.ajp13.port=8009

worker.ajp13.host=localhost

worker.ajp13.type=ajp13

worker.ajp13.lbfactor=1

3.Criando o arquivo jk.conf. Este arquivo informa ao conector onde está o arquivo de workers, onde e qual tipo de log gravar, qual o contexto processado no Tomcat deve ser disponibilizando pela mesma porta do Apache:

sudo vim /etc/apache2/mods-available/jk.conf

Inserir o seguinte conteúdo:

JkWorkersFile /etc/libapache2-mod-jk/workers.properties
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel debug

4.Criando o link simbólico para o Apache levantar o serviço ao iniciar a máquina.

sudo ln -s /etc/apache2/mods-available/jk.conf  /etc/apache2/mods-enabled/jk.conf

5. OBS.: Essa é a etapa que nenhum tutorial trata, portanto siga ao pé da letra o que está escrito nesse tópico 5. Vamos ao httpd.conf criar nosso servidor apache virtual responsável por filtrar as requisições. Portanto:

sudo vim /etc/apache2/httpd.conf

Agora basta escrever isso no arquivo:

<VirtualHost *>
ServerName localhost
DocumentRoot /var/www/
JkMount /examples ajp13
JkMount /examples/* ajp13
</VirtualHost>

6. OBS.: Essa etapa também nenhum tutorial trata, portanto siga ao pé da letra o que está escrito nesse tópico 6. É elementar… e eu ficava me perguntando quando via os outros tutoriais na Internet como o tomcat escuta as conexões vindas do apache? Pois os tutorias só falava em configurar o tal Conector que usa o protocolo AJP. Ai então conheci esse Listener que deve ser configurado, ele fica escutando as conexões vindas do mod_jk e passa ao tomcat. Então vou aproveitar o copiar o arquivo do tomcat como um todo, o nome dele é o server.xml:

sudo vim /opt/tomcat/conf/server.xml

Preencha ele com esse conteúdo:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">

  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />

  <Listener className="org.apache.catalina.core.JasperListener" />
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <Listener className="org.apache.jk.config.ApacheConfig" append="false"
            forwardAll="true" modJk="/usr/lib/apache2/modules/mod_jk.so" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"

              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <Service name="Catalina">

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

    <Connector protocol="org.apache.coyote.http11.Http11NioProtocol"

           port="8443" minSpareThreads="5" maxSpareThreads="75"
           enableLookups="true" disableUploadTimeout="true"
           acceptCount="100"  maxThreads="200"

           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="/home/csmadmin/tools/tomcat/apache-tomcat-6.0.20/conf/certs/key.cert"
	   keystorePass="corventis"

           clientAuth="false" sslProtocol="TLS"/>

    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

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

      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

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

      </Host>
    </Engine>
  </Service>
</Server>

7. Basta agora reiniciar o tomcat e depois o apache2, SUCESSO!! né?

qualquer dúvida mande email para mim, ou acessem meu blog no WordPress.

Referências:

http://www.jroller.com/RickHigh/entry/problem_configuring_mod_jk_apache

http://ambienteweb.net.br/blog/?m=201001

  1. anderson Jul 12th, 2010 @ 13:17 | #-49

    Obrigado por divulgar Márcio!

  2. George Leite Jul 26th, 2010 @ 15:16 | #-48

    Rapaz, realmente,só o seu tutorial funcionou parabéns.

  3. Alexandre Barbosa Sep 22nd, 2010 @ 14:59 | #-47

    Cara, muito obrigado, você me ajudou muito.

    Muito bom, bom mesmo.

  4. Fernando Feb 18th, 2011 @ 16:03 | #-46

    Senhores, boa tarde.

    Estou usando Debian Lenny e preciso fazer a integração do Apache com o Tomcat, segui o tultorial acima e estou tendo alguns problemas, a versao do meu apache é Server version: Apache/2.2.9 (Debian) e Tomcat/6.0.32.

    [Fri Feb 18 16:57:33.544 2011] [2467:2956626832] [error] jk_handler::mod_jk.c (2372): Could not find a worker for worker name=worker

    Com isso quando tento acessar http://localhost:8080/example acessa perfeitamente, entretanto quando tento http://localhost ou mesmo http://localhost/example ele da a seguinte mensagem no navegador:

    Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, webmaster@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.
    Apache/2.2.9 (Debian) mod_jk/1.2.26 Server at xxx.xxx.com.br Port 80

    No error log do apache da a seguinte mensagem:

    [Fri Feb 18 16:55:53 2011] [warn] No JkShmFile defined in httpd.conf. Using default /var/log/apache2/jk-runtime-status
    [Fri Feb 18 16:55:53 2011] [warn] No JkShmFile defined in httpd.conf. Using default /var/log/apache2/jk-runtime-status
    [Fri Feb 18 16:55:53 2011] [notice] Apache/2.2.9 (Debian) mod_jk/1.2.26 configured — resuming normal operations

    alguem tem ideia de onde poderia ser a falha?

    obrigado,

    Fernando

  5. anderson Feb 20th, 2011 @ 12:01 | #-45

    Olá Fernando,

    Passei sua dúvida para Thiago que é o autor do artigo. Ele está ciente do erro e assim que ele puder vai te dar uma resposta.

    Até! E obrigado por ler o site.

  6. Filipe Jul 1st, 2011 @ 02:30 | #-44

    Fernando tive o mesmo problema, isos se deve a fato de que a última parte do tutorial não ser compatível, faça o seguinte: pegue o server.xml do tomcat original e coloque no lugar do que foi alterado ou simplesmente: # gedit /opt/tomcat/conf/server.xml
    vai abrir a janela para edição do documento, apague o conteudo e cole o conteudo do server.xml original do tomcat.

    Funcionou pra mim!

    Bom tutorial mano, estava a procura de um que funcionasse e esse funcionou perfeitamente vlw mesmo.

  7. Adam Santos Oct 4th, 2011 @ 21:01 | #-43

    Muito bom Anderson L., parabéns pelo post!
    Eu estou tentando fazer esta referida integração no meu trabalho, lá precisamos do apache para alguns sites em php e do tomcat para outros sistemas que utilizam frameworks java.
    Eu estou com uma grande dúvida em relação a como farei o acesso externo. Por exemplo, lá temos um DNS http://www.dominio_qualquer.br, eu queria acessar minha aplicação através de http://www.dominio_qualquer.br:8080/minha_app ou http://www.dominio_qualquer.br/minha_app
    O que eu poderia fazer? Precisaria de integração nesse caso ou somente configurando o tomcat eu já consigo acesso externo?

    Obrigado,

    Adam Santos

  8. anderson Oct 5th, 2011 @ 17:51 | #-42

    Adam, Manda uma mensagem a Thiago Soares, que foi o responsável pelo post. O e-mail dele é thiagosoara (em) gmail. Com certeza ele irá responder.

  9. Paulo Adriano Apr 3rd, 2012 @ 01:11 | #-41

    Primeiro, parabéns pelo artigo, realmente é o único que funciona.

    Mas a minha dúvida é se eu tivesse que integrar além do TomCat o GlassFish também? Como faria pra tipo /tomcat => TomCat e /glass => GlassFish

  10. Márcio Machado Apr 19th, 2013 @ 08:11 | #-40

    Olá bom dia,
    É a primeira vez que monto um servidor web com o Apache-Tomcat7 e java.
    Você um documentação para criar os hostvirtual para rodar aplicação em java?
    Desde já agradeço.

  11. Márcio Machado Apr 19th, 2013 @ 08:16 | #-39

    Há eu estou usando o CentOs6

  12. anderson Apr 22nd, 2013 @ 09:46 | #-38

    Rapaz, infelizmente tem um tempão que não trabalho com sistemas Web. Então nem tenho como te indicar um bom tutorial. Aconselho você buscar na Internet mesmo. Até!

  13. Juliana C. Silva Aug 2nd, 2013 @ 21:56 | #-37

    Obrigada! Solucionou meu problema…. Parabéns pelo trabalho!

  14. Rondinelle Bispo Dec 10th, 2013 @ 21:26 | #-36

    Olá amigo, ótimo tutorial, porém estou com uma duvida e uma tarefa que até agora não consegui resolver, o seguint: como faço isso em maquinas diferentes?
    meu tomcat7 esta na maquina: 192.168.0.1
    meu apache2 esta na maquina: 200.242.x.x

    minha aplicação esta rodando na porta 443.

    teria como você me dar uma luz?

  15. Adaucy Junior Jan 3rd, 2014 @ 13:40 | #-35

    Obrigado pelo post Anderson! Funcionou, mas tive três problemas.

    1) Eu estava colocando a pasta da minha aplicação na pasta do apache, no meu caso /var/www/, mas a pasta da aplicação tem de ser colocada na pasta do tomcat, no meu caso /opt/tomcat/webapps/.

    2) Quando eu criava o VirtualHost (Passo 5 da integração) e reiniciava o apache aparecia o warn “NameVirtualHost * :80 has no virtual hosts”. Então eu descobri que para criar VirtualHost no apache 2.2.22 tem de adicionar “:80” na tag, ficando assim: em vez de .

    3) Eu estou acessando o meu servidor de outro computador, então eu digito o IP do servidor no browser. Mas aí não funcionava, então eu percebi que na configuração do virtual host o ServerName era “localhost” daí eu o alterei para o IP do servidor e funcionou!

    Pronto! Agora está funcionando que é uma beleza!

    Outra detalhe: testei sem executar o passo 6 e também funcionou.

    Verões que eu utilizei:
    – Debian 7
    – jdk-7u45-linux-x64
    – apache-tomcat-7.0.47
    – apache 2.2.22

    É isso! Mais uma vez, obrigado!

  16. Adaucy Junior Jan 3rd, 2014 @ 13:48 | #-34

    “” em vez de “”

  17. Adaucy Junior Jan 3rd, 2014 @ 13:51 | #-33

    &ltVirtualHost *:80&gt em vez de &ltVirtualHost *&gt

  18. Adaucy Junior Jan 3rd, 2014 @ 13:54 | #-32

    &ltVirtualHost *:80&gt em vez de &ltVirtualHost *&gt

  19. Adaucy Junior Jan 3rd, 2014 @ 13:56 | #-31

    Anderson, me desculpa a bagunça. To tentando postar a tag de configuração do VirtualHost, mas na hora que eu posto o blog interpreta como uma tag html e some com ela. Sabe como eu posso fazer para inserir a tag no comentário para que ela fique visível?

  20. Adaucy Junior Jan 3rd, 2014 @ 14:20 | #-30

    Rondinelle Bispo, acho que este post irá te ajudar:

    http://www.ramkitech.com/2012/03/virtual-host-apache-httpd-server-tomcat.html

  21. Thiago Jun 20th, 2018 @ 11:34 | #-29

    s

  22. Diego Cassol Sep 25th, 2018 @ 20:06 | #-28

    Boa noite senhores.

    Sei que esse post é antigo, porém estou usando ele como base para integração entre tomcat8 e apache2.

    Estou tendo uma exceção de classe inexistente:

    ClassNotFoundException: org.apache.jk.config.ApacheConfig.

    No restante, segui exatamente todos os passos determinados, porém quando tento reinicar o tomcat8 não inicia. E nos logs do catalina tenho esse erro.

    Alguém conseguiu realizar a conexão entre tomcat8 e apache2?

    Pelo que li da documentação do tomcat8 essa classe foi descontinuada para versões superiores ao tomcat7.

    Qualquer ajuda ou sugestão será bem vinda.

    Abraços!

Submitting Comment, Give me a second...

Leave a comment

 

Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 1 )
  1. Jul 9th, 2010 @ 15:56 | #1
    Pingback: Apache2+Tomcat6 « Marciods