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? ;)