terça-feira, 21 de junho de 2011

Apache e GlassFish 3.0.1 com mod_jk no Ubuntu 10.04

Eu odeio o Glassfish. Tá aí, falei.

Mesmo assim, meu time herdou uma máquina virtual com o Jenkins e o Archiva rodando embaixo do Glassfish. Até que isso não me afetava muito, eu só precisei configurar o Archiva (isso fica para outro post), e não fazia muita diferença se ele estava rodando sob Jetty, Tomcat ou Glassfish (blergh!). Mas claro que uma hora eu ia ter que me entender com o famigerado peixe de vidro, e essa hora (ou melhor, 4 horas) chegou.

Tive que juntar vários pedaços de tutoriais para conseguir fazer funcionar, então resolvi publicar um completo de como consegui.

Estou partindo do princípio que o Glassfish e o Apache já estão instalados no Ubuntu 10.04.

Instale o mod_jk:
Num prompt de comando - você está usando o Ubuntu Server, não está? :) - digite:

apt-get install libapache2-mod-jk

Isso irá instalar o mod_jk, que fará o "meio de campo" entre o Apache e o Glassfish.

Habilite o módulo jk:
Ainda no prompt digite:

a2enmod jk

(Na prática, você obtém o mesmo resultado criando um link simbólico do arquivo jk.load no diretório /etc/apache2/mods-enabled a partir do diretório /etc/apache2/mods-available).

Configure o módulo:
Crie/substitua o arquivo /etc/apache2/mods-available/jk.conf com o seguinte conteúdo (edite com qualquer editor, eu uso o vim, pode copiar as linhas seguintes e colar nele):

# Local onde o mod_jk vai achar as definicoes dos workers
JkWorkersFile /etc/apache2/mods-available/workers.properties

# Local onde o mod_jk vai escrever seu arquivo de log
JkLogFile /var/log/apache2/mod_jk.log
JkShmFile /var/log/apache2/mod_jk.shm

# Nivel de log definido
JkLogLevel info

Crie/substitua o arquivo /etc/apache2/mods-available/workers.properties com o seguinte conteúdo:

# workers.properties -
# Define 1 worker usando ajp13
worker.list=worker1
# Propriedades do worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.socket_keepalive=1
worker.worker1.socket_timeout=300

Habilite a configuração do módulo:
No prompt de comando:


root@localhost:/root# cd /etc/apache2/mods-enabled
root@localhost:/etc/apache2/mods-enabled# ln -s ../etc/apache2/mods-available/jk.conf
root@localhost:/etc/apache2/mods-enabled# ln -s ../etc/apache2/mods-available/workers.properties

Habilite a diretiva JkMountCopy:
Edite o arquivo /etc/apache2/sites-available/default e adicione a linha JkMountCopy On ao final da definição do VirtualHost.

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

    DocumentRoot /var/www

    (...)

    JkMountCopy On
</VirtualHost>

Reinicie o apache:
No prompt de comando:


/etc/init.d/apache2 restart

O apache deve reinicializar normalmente.

Configurando o GlassFish
Agora vem a parte que mais me deu trabalho para achar como fazê-lo corretamente. Alguns blogs mandavam usar o asadmin, outros configurar o o domains.xml, outros mandavam fazer isso e adicionar jars do Tomcat, e eu tive que misturar tudo e ir por tentativa e erro até conseguir. Descobri que o modo que funciona no 3.0.1 é bem simple, basta adicionar um listener jk-enabled e um protocol, editando o domains.xml ou usando o console de administração, que facilita muito a vida.

Sem o console:
Para os fortes de estômago (ou os que sabem o que estão fazendo), edite o arquivo domain.xml em {glassfish_home}/domains/domain1/config


Procure por <protocols> e adicione as linhas:

<protocols> 
    <protocol name="http-listener-3">
        <http default-virtual-server="server" max-connections="250" server-name="" xpowered-by="true">
            <file-cache enabled="false" /> 
        </http>
    </protocol>
    (...)
<protocols>

Agora procure por <network-listeners> e adicione a linha:

<network-listeners>
    <network-listener port="8009" protocol="http-listener-3" transport="tcp" name="http-listener-3-protocol" thread-pool="http-thread-pool" address="0.0.0.0" jk-enabled="true" />
    (...)
</network-listeners>

*Note que a porta 8009 é a mesma definida no workers.properties.

Reinicialize o GlassFish.

Com o console:
No seu browser, coloque o endereço do glassfish acessando a porta 4848. Entre com o usuário admin e a senha.
Na tela que se abre, procure por "Network Config" no menu do lado esquerdo (clique nas imagens para expandi-las):


Expanda a opção e em seguida clique em "Network Listeners". Na tela que se abre, clique em "New".



Preencha a tela com os seguintes valores:

Name: http-listener-3
Protocol (Create a new protocol): http-listener-3-protocol
Port: 8009

Marque a opção "Enabled" em "JK Listener".



As demais opções podem ficar como padrão. Clique em "Ok".

Reinicialize o GlassFish.

E Finalmente...
Agora só falta você habilitar no apache quais aplicações serão redirecionadas. Eu só habilitei o archiva, você pode habilitar outras, se quiser. Desse modo a url que antes era http://meu-servidor:8080/archiva agora é http://meu-servidor/archiva

Habilitando as aplicações no Apache:
Edite o arquivo /etc/apache2/sites-available/default
Lembra do JkMountCopy On? Então, logo abaixo dele você irá listar todos os aplicativos do Glassfish que deseja acessar diretamente pela porta 80, e não mais pela 8080. Basta adicionar uma linha do tipo:

JkMount /archiva* worker1



E reinicie o apache.

/etc/init.d/apache2 restart


Desse modo, tudo que vier para seu Apache com a url /archiva, será redirecionado para o worker1 configurado. Você deve adicionar uma linha para cada aplicativo.

Fácil, não? ;)

Nenhum comentário: