Back-End

9 jan, 2013

Configurando JBoss 7 com Apache

Publicidade

Existe um monte de artigos por aí sobre a implementação de aplicativos para JBoss e sobre como monitorar o JBoss, e nesses artigos o aplicativo web normalmente é acessado por um navegador apontando para o contêiner da web em execução na porta 8080. Em ambientes de produção corporativos, no entanto, o application server não existe em um vácuo – JBoss é geralmente defrontado com o servidor web (geralmente o Apache). Esse tipo de configuração traz vários benefícios:

  • A segurança foi aperfeiçoada limitando o acesso ao application server. Em um aplicativo de Internet, o servidor web é acessado diretamente pelos clientes. Separar o servidor web do application server nos permite colocar o primeiro em uma Demilitarized Zone (DMZ), enquanto o servidor de aplicativo pode viver em uma rede corporativa mais protegida. Se o servidor web estiver comprometido, existe uma barreira adicional para os hackers superarem antes que possam ter acesso ao seu precioso aplicativo e aos servidores de banco de dados.
  • Segurança aperfeiçoada, limitando o acesso ao application server. Alguns plugins de terceiros permitem que o servidor web execute a autenticação nos servidores LDAP ou RADIUS – solicitações não autenticadas/não autorizadas nem chegam ao seu application server.
  • Desempenho aperfeiçoado com cache de conteúdo estático. O Apache pode armazenar em cache o seu conteúdo estático (imagens, JavaScript e .css), enquanto permite que o application server se concentre no que faz de melhor – o processamento da lógica de negócio.
  • Desempenho SSL aperfeiçoado. O SSL realiza a codificação/decodificação on-the-fly, que pode ser computacionalmente dispendiosa. Enquanto o JBoss pode certamente lidar com isso, faz mais sentido tirar a carga dos seus ombros e permitir que o Apache faça o trabalho pesado do SSL (ele ainda pode usar a aceleração de hardware do SSL).
  • Por último, mas não menos importante, dada a configuração certa, o Apache pode balancear a carga entre os application servers de forma muito eficaz (vamos ver como daqui a pouquinho).

Para simplificar, vamos supor o seguinte:

  • estamos executando JBoss 7.1 no modo autônomo
  • o sistema operacional é CentOS 6.x
  • $JBOSS_HOME refere-se ao diretório de instalação do JBoss 7 (você não tem que definir essa variável de ambiente)
  • vamos usar o Monitis JMX agent web application para ilustrar o processo – o contexto do aplicativo web é mon_jmx_agent

Configurando AJP

AJP significa “Apache JServ Protocol” – esse é o método padrão da interface do Apache com o Tomcat (e, mais tarde, JBoss) desde as primeiras versões do Tomcat. É um protocolo baseado em pacotes, que em sua última reencarnação da 1.3 é muito rápida ao adicionar muito pouca sobrecarga. Tomcat (e, por extensão, JBoss) fala com o AJP de uma maneira fora do padrão. Do lado do Apache, o mod_proxy_ajp fornece a funcionalidade necessária. Então vamos ver como colocar tudo isso junto.

Passo 1. Habilite o conector AJP. No JBoss 7, o conector AJP não é ativado por padrão, então vamos permitir isso. Abra $JBOSS_HOME/standalone/configuration/standalone.xml, localize a tag subsystem e adicione o conector AJP:

.....
        <subsystem xmlns="urn:jboss:domain:web:1.1" native="false" default-virtual-server="default-host">
...
            <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
...
        </subsystem>
.....

Em seguida, certifique-se de que a definição da ligação aip socket existe:

    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:0}">
        ....
        <socket-binding name="ajp" port="8009"/>
...

Passo 2. Configurar mod_proxy_ajp. Vá para /etc/httpd/conf.d e crie um arquivo proxy_ajp.conf desta forma:

<IfModule !proxy_ajp_module>
  LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
</IfModule>
ProxyPass /mon_jmx_agent ajp://localhost:8009/mon_jmx_agent

 Passo 3. Reiniciar o JBoss e Apache (nessa ordem)

Agora, abra um navegador e vá até http://localhost/mon_jmx_agent. Você deverá ver a tela de login do agente JMX.

Configurando mod_cluster

Se você estiver executando um cluster de várias instâncias JBoss, você vai precisar de um load balancer para distribuir a carga entre eles. Embora ambos mod_proxy_ajp e mod_proxy_http forneçam funcionalidade de load-balancing básica, ela é um pouco limitada. A forma mais flexível para implementar load-balancing com apache hoje em dia é mod_cluster. Além de simplesmente encaminhar as solicitações para os nodes do cluster, mod_cluster mantém um canal de comunicação separado para os nodes do cluster.Isso permite um load balancing mais refinado com base em uma ampla gama de cargas relacionadas com parâmetros calculados por nodes do cluster. Também permite que os nodes do cluster comuniquem eventos de ciclo de vida (lifecycle) para o loadbalancer mod_cluster, de modo é possível reencaminhar o tráfego de forma apropriada. Por exemplo, se você “desimplementar” um arquivo WAR em um dos nodes do cluster, o load balancer estará ciente disso e irá encaminhar os pedidos para os outros nodes. Outro ponto importante é que o mod_cluster suporta a descoberta dinâmica – o balanceador não precisa ser explicitamente configurado com endereços IP/números de porta dos nodes individuais.

Passo 1. Configurar o yum para o repositório EPEL (se já não estiver habilitado). Uma vez que o mod_cluster ainda não faz parte da distribuição Apache, é preciso baixar separadamente a partir do repositório EPEL, então temos que nos certificar de que o yum esteja configurado para este repositório:

Para verificar se o EPEL já está configurado no YUM, faça:

$rpm -qa epel-release

Se os resultados da busca retornarem em branco, baixe o EPEL RPM aqui (escolha a versão apropriada do SO que você está rodando) e instale-o para configurar o yum para o repositório EPEL:

$rpm -i epel-release-6-5.noarch.rpm

Passo 2. Instalar mod_cluster e módulos dependentes

$yum install mod_cluster

Passo 3. Configurar mod_cluster

Passo 3a. Abra /etc/https/http.conf e certifique-se de que os seguintes módulos estejam habilitados:

LoadModule proxy_module /modules/mod_proxy.so
LoadModule proxy_ajp_module /modules/mod_proxy_ajp.so
LoadModule slotmem_module /modules/mod_slotmem.so
LoadModule manager_module /modules/mod_manager.so
LoadModule proxy_cluster_module /modules/mod_proxy_cluster.so
LoadModule advertise_module /modules/mod_advertise.so

Passo 3b. Crie um arquivo mod_cluster.conf em /etc/httpd/conf.d da seguinte maneira:

<IfModule manager_module>
    Listen 192.168.1.100:6666   # change IP address to suit your environment
    ManagerBalancerName mycluster
    <VirtualHost 192.168.1.100:6666> # change IP address to suit your environment
        KeepAliveTimeout 300
        MaxKeepAliveRequests 0
        ServerAdvertise On
        AdvertiseGroup 224.0.1.105:23364
        AdvertiseSecurityKey secret # change key to match jboss config below

        <Location />
            Order deny,allow
      Deny from all
            Allow from 192.168.1. #change IP address filter to allow access from your local network
        </Location>
  </VirtualHost>
</IfModule>

 

Passo 3c. Modifique /etc/httpd/httpd.conf desta forma:

<VirtualHost *:80>
    ProxyPass / balancer://mycluster stickysession=JSESSIONID|jsessionid nofailover=On
    ProxyPassReverse / balancer://mycluster
    ProxyPreserveHost On

    <Location />
        Order deny,allow
        Allow from All
    </Location>

    <Location /mod_cluster_manager>
        SetHandler mod_cluster-manager
        Order deny,allow
        Deny from all
        Allow from 192.168.1. # change this to match your network setup
    </Location> 
</VirtualHost>

Passo 3d. Modifique o arquivo de configuração do JBoss $JBOSS_HOME/standalone/configuration/standalone-ha.xml

<extensions>
...
    <extension module="org.jboss.as.modcluster"/>
...
</extensions>

<profile>
....
<subsystem xmlns="urn:jboss:domain:modcluster:1.0">
....
    <mod-cluster-config advertise-socket="modcluster" advertise-security-key="secret"/>
....
</profile>

<socket-binding-group name="standard-sockets" default-interface="public"
                       port-offset="${jboss.socket.binding.port-offset:0}">
...
    <socket-binding name="modcluster" port="0" multicast-address="224.0.1.105" multicast-port="23364"/>
...
</socket-binding-group>

Passo 4. Iniciar o httpd

Passo 5. Iniciar o JBoss com o perfil standalone-ha.xml

É isso aí. Abra um navegador e vá até http://192.168.1.100/mod_cluster_manager e você deverá ver a página de status interno do gerenciador de clusters:


O cabeçalho Contexts lista todos os contextos de aplicativos (aplicativos web, por exemplo) que são configurados para esse node. Você deve ser capaz de abrir o Monitis JMX agent web application em uma janela separada do navegador: http://192.168.1.100/mon_jmx_agent (alterar o endereço IP se necessário).

Nota: Se a página de status estiver em branco, então os nodes do cluster não estão registrando corretamente com o balanceador. Certifique-se de que o multicast IP esteja habilitado entre o servidor web e o computador servidor do app (funcionalidade mod_cluster da descoberta usa IP Multicast para anunciar o endereço do balanceador e portar para os nodes do cluster). Os responsáveis habituais são SELinux e iptables, então você pode ter que criar as regras apropriadas. Alternativamente, você pode apontar JBoss 7 para o balanceador explicitamente, em vez de depender de autodescoberta. Substitua a seguinte linha no arquivo de configuração do JBoss standalone-ha.conf:

<mod-cluster-config advertise-socket="modcluster" advertise-security-key="secret"/>

com um assim:

<mod-cluster-config proxy-list="192.168.1.100:6666"/>

Para mais informações:

http://www.jboss.org/mod_cluster

http://docs.jboss.org/mod_cluster/1.1.0/html

http://oddthesis.org/posts/2008-12-jboss-and-mod_cluster/

***

Texto original da equipe Monitis, liderada por Hovhannes Avoyan, disponível em http://blog.monitis.com/index.php/2012/08/31/configuring-jboss-7-with-apache/