Configurando Ambiente de Produção no JBoss AS 7.1.3 (JBoss EAP 6.0.1) – Parte 2

Postado em Atualizado em

Olá amigos,

Continuando o post anterior hoje nós vamos iniciar a configuração do JBoss AS 7.1.3 (JBoss EAP 6). Muitos pessoas que acompanham o blog devem estar se perguntando o por que de utizar o JBoss EAP 6 e não o JBoss AS 7.1.1.
Isso é bem simples!! O JBoss EAP 6 é baseado no JBos AS 7.1.1. Nessa versão Enterprise todos os bugs que tínhamos no JBoss AS 7.1.1 já estão corrigidos e futuramente todas essas correções irão voltar para a versão comunidade que virá a ser o JBoss AS 7.2.0. Para baixar o JBoss EAP é necessário ter uma conta em http://access.redhat.com/.Você pode criar uma conta de testes e ter acesso por 30 dias. Se decidir comprar o produto terá a sua disposição um dos melhores suportes do mundo (sem propaganda). Caso nao tenha grana como eu, você ainda poderá continuar utilizando o JBoss EAP 6 só que você estará por sua conta. O JBoss EAP 6 não “trava” depois de 30 dias, você apenas perde o direito de baixar os produtos e acessar a base de conhecimento disponibilizada no portal.

Você pode ainda compilar o JBoss EAP 6 🙂

Para facilitar vou deixar aqui os binários do JBoss EAP 6 que vamos utilizar nesse post.

Para colocar o JBoss AS 7, como serviço no Linux, existem alguns pré-requisitos. Em hipótese alguma inicie o JBoss utilizando o usuário root, pois a plataforma Java oferece APIs para execução de códigos nativos do sistema operacional e mecanismos de gerenciamento remoto. No Linux crie um usuário com privilégios adequados para iniciar o serviço do JBoss. Já no Windows crie um usuário com poderes administrativos, mas com privilégios reduzidos.

Incialmente vamos criar um grupo:

  groupadd jboss

Adicione o usuário:

  useradd -s /bin/bash -d /home/jboss -m -g jboss jboss

Vamos baixar o JBoss no diretório tmp:

 cd /tmp
 wget https://www.dropbox.com/s/nbij0z285i376h2/jboss-eap-6.0.1.zip

Crie a estrutura de diretórios para armazenar o JBoss:

 mkdir /usr/local/jboss
 chown jboss:jboss /usr/local/jboss
 su jboss
 mkdir /usr/local/jboss/7.1.3
 cd /usr/local/jboss/7.1.3
 unzip /tmp/jboss-eap-6.0.1.zip

Como boa prática antes de iniciar o JBoss pela primeira vez, faça uma cópia do perfil Domain ou Standalone  e renomeie com algum nome objetivo:

 $ cp –Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/example-domain

Uma vez instalado é fortemente aconselhável iniciar o JBoss AS para verificar se existe alguma incompatibilidade com a arquitetura do JDK utilizado ou até mesmo se a memória disponibilizada é suficiente.

 ./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
 -Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/example-domain/

 JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4) started in 29604ms - Started 162 of 245 services (82 services are passive or on-demand)

Para esse post eu decidi utilizar duas instâncias para testarmos o balanceamento de carga com o mod_cluster. Inicialmente vamos subir o Domain Controller  e depois vamos conectar dois Host Controller com uma Instância  JBoss em cada.

ModoDomain

Como já configuramos o Apache Web Server com SSL e Mod Cluster agora devemos criar e configurar o nosso Domain. Um Domain nada mais é que um conjunto de instãncias JBoss (Não tem nada a ver com cluster).  Existem alguns elementos envolvidos nessa arquitetura por exemplo o modelo Domain oferece:

  • Gerenciamento Centralizado;
  • Configuração Centralizada;
  • Deploy Centralizado;
  • Manutenção Centralizada;

A única diferença entre o modo Standalone e modo Domain é a capacidade de gerenciamento. Características como clustering, high availability,  fail-over e outros recursos do Java EE  estão disponíveis nos dois modelos!

Domain Controller  é o ponto central de controle onde está toda política de gerenciamento de todos os servidores. Nele estão as configurações de todas as instâncias que participam do domínio. O Domain Controller é basicamente um processo Host Controller onde dependendo da arquitetura se torna o Domain Controller.

Host Controller  também coordena as instâncias do domain. Por exemplo, ele é o responsável por fazer algo semelhando ao Farm Deployment(nao existe nessa versão), ou seja ele distribui o arquivo deployado para todas as instâncias do domain.

Server são as instâncias em si, onde estão as aplicações deployadas. Um ponto importante é que cada server é  um processo Java.

Continuando a configuração, execute  add-user.sh e siga as instruções como abaixo:

[jboss@localhost /]$ ./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/add-user.sh

What type of user do you wish to add?
a) Management User (mgmt-users.properties)
b) Application User (application-users.properties)
(a): a

Enter the details of the new user to add.
Realm (ManagementRealm) : ManagementRealm
Username : jboss
Password :
Re-enter Password :
About to add user 'jboss' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'jboss' to file '/usr/local/jboss/7.1.3/jboss-eap-6.0/standalone/configuration/mgmt-users.properties'
Added user 'jboss' to file '/usr/local/jboss/7.1.3/jboss-eap-6.0/domain/configuration/mgmt-users.properties'
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master or for a Remoting connection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <secret value="MTIzNDU2" />

Foi adicionado um usuário chamado jboss com a senha 123456 para que ser utilizado na conexão entre o Host Controller e o Domain Controller.

Crie três novos perfis baseados no modo Domain e renomeie como abaixo:

$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/master
$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01
$ cp -Rap /usr/local/jboss/7.1.3/jboss-eap-6.0/domain  /usr/local/jboss/7.1.3/jboss-eap-6.0/slave02

Como vimos anteriormente todas as configurações e gerenciamento é realizado de forma centralizada no Domain Controller. Quando for necessário adicionar um novo grupo de servidores, configurar logs, criar datasources, alterar portas entre outras coisas, tudo isso deverá ser feito no domain.xml do Domain Controller que no nosso caso será chamado de master. Sendo assim todas as nossas instâncias JBoss usufruirão das configurações realizadas para o Domain ou para o Server Group em questão.

A primeira coisa a ser feita é definir qual o conjunto de tecnologias (subsystems) serão utilizadas na aplicação. Isso pode variar conforme os requisitos de cada sistema. Um conjunto de tecnologias (subsystems) no JBoss 7 é chamado de profile.

 <profile name="full-ha">

O JBoss AS 7 possui 4 profiles por padrão: “default”, “full”, “ha”, “full-ha” , mas nada impede de nós copiarmos qualquer um deles e renomeá-los conforme nossos requisitos.  No Java EE 6 foi introduzido o conceito de Profiles, onde pode-se criar um subconjunto de tecnologias presentes na spec  Java EE ou até mesmo adicionar novas definidas pela JCP (Java Community Process).

Mais informações: https://community.jboss.org/wiki/JavaEE6UtilizandoWebProfileOuFullProfileNoJBossAS7

Nós vamos utilizar o profile ha pois se precisarmos utilizar o recurso de cluster vamos conseguir por que essa tecnologia (subsystem JGroups) já está pré configurada. Nós definimos que vamos utilizar um profile quando vamos criar um Grupo de Servidores: Server Group. Um server group nada mais é que um agrupamento de instâncias JBoss. Nessa arquitetura vamos utilizar apenas um server group. Isso pode ser definido na tag <server-groups> no domain.xml do master (Domain Controller). Crie um Server Group chamado grupo-apps que utilize o profile ha:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/master/configuration/domain.xml

Deixe-o como abaixo:

<server-groups>
 <server-group name="grupo-apps" profile="ha">
  <jvm name="default">
    <heap size="1303m" max-size="1303m"/>
    <permgen max-size="256m"/>
  </jvm>
  <socket-binding-group ref="ha-sockets"/>
  </server-group>
</server-groups>

No profile ha especificamente no subsystem web adicione o atributo instance-id:

<subsystem xmlns="urn:jboss:domain:web:1.2" default-virtual-server="default-host" instance-id="${jboss.server.name}" native="false">

O instance-id será passado como parâmetro na inicialização do Host Controller.

É de grande importância remover  a “silent authentication” do CLI.  Por padrão nenhum password é solicitado para usuários “locais” do CLI deixando assim uma porta para pessoas mal intencionadas realizarem o que desejarem com nossas instâncias JBoss.  Para remover essa autenticação remova as tags  <local default-user=”$local” /> e  <local default-user=”$local” allowed-users=”*” /> nos arquivos:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/master/configuration/host-master.xml
vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01/configuration/host-slave.xml
vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave02/configuration/host-slave.xml

Agora devemos configurar a autenticação dos Host Controllers. Anteriormente adicionamos um usuário chamado jboss e nesse processo foi gerado um hash com um tag <secret value=”MTIzNDU2″ />. Essa tag será utilizada nos nossos Host Controllers para se autenticarem no Domain Controller.

Edite o arquivo:

vim /usr/local/jboss/7.1.3/jboss-eap-6.0/slave01/configuration/host-slave.xml

Adicione a tag <secret value=”MTIzNDU2″ /> em <server-identities> removendo a que estava configurada por default.

<server-identities>
   <secret value="MTIzNDU2" />
</server-identities>

Em  <domain-controller> na tag  <remote> adicione a propriedade username:

<domain-controller>
   <remote host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}" security-realm="ManagementRealm" username="jboss"/>
</domain-controller>

Na tag <servers> é onde estão de fato as nossas instâncias JBoss. Quando criamos uma novo  <server> estamos criando uma nova instância JBoss.  Isso é algo similar ao copiarmos um profile all, production, web, etc em versões anteriores.

Conforme definimos o Host Controller 01 conterá apenas uma instância JBoss chamada server-one. Deixe o <servers> como abaixo:

<servers>
  <server name="server-one" group="grupo-apps">
  </server>
</servers>

Definimos que a instância JBoss server-one fará parte do Server Group “grupo-apps”.

Para finalizar na tag  <host> adicione o name slave01.

  <host name="slave01" xmlns="urn:jboss:domain:1.3">

Repita os procedimentos realizados no slave01 para o slave02 alterando apenas o nome do servidor que será server-two  e  do <host> será slave02.

No meu ambiente possuo 3 servidores:

  • Domain Controller + Apache Web Server: 192.168.0.128
  • Hostr Controller 01: 192.168.0.140
  • Hostr Controller 02: 192.168.0.117

Inicie o Domain Controler (master) utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/master
-Djboss.host.default.config=host-master.xml
-Djboss.bind.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.128

Verifique  o log:

JBAS015874: JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4) (Host Controller) started in 6181ms - Started 11 of 11 services (0 services are passive or on-demand)

O Domain Controller foi iniciado com sucesso!

Vamos conectar o primeiro Host Controller 01 (slave01) ao Master. Inicie o Perfil slave01 utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/slave01
-Djboss.host.default.config=host-slave.xml
-Djboss.domain.master.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.140
-Djboss.bind.address=192.168.0.140
-Djboss.server.name=server-one

Agora observe os logs no Domain Controller e perceba que o Host Controller 01 se conectou do Domain:

JBAS010918: Registered remote slave host "slave01", JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4)

Abra também o Mod Cluster Manager em http://192.168.0.140/mod_cluster-manager e veja que a nossa primeira instância já apareceu:

node01

Inicie o Host Controller 02 (slave02) utilizando os seguintes parâmetros:

./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/domain.sh
-Djboss.domain.base.dir=/usr/local/jboss/7.1.3/jboss-eap-6.0/slave02
-Djboss.host.default.config=host-slave.xml
-Djboss.domain.master.address=192.168.0.128
-Djboss.bind.address.management=192.168.0.117
-Djboss.bind.address=192.168.0.117
-Djboss.server.name=server-two

Agora observe novamente os logs no Domain Controller e perceba que o Host Controller 02 se também conectou:

JBAS010918: Registered remote slave host "slave02", JBoss EAP 6.0.1.GA (AS 7.1.3.Final-redhat-4)

Novamente no Mod Cluster Manager agora temos as nossas duas instâncias:

node2

Para testar o Balanceamento vamos fazer o deploy da aplicação SystemProps que pode ser baixada  aqui.

Para fazer o deploy conecte do domain controller utilizando o CLI:

$ ./usr/local/jboss/7.1.3/jboss-eap-6.0/bin/jboss-cli.sh -c --controller=192.168.0.128:9999
Authenticating against security realm: ManagementRealm
Username: jboss
Password:
[domain@192.168.0.128:9999 /]

Faça o deploy da aplicação:

[domain@192.168.0.128:9999 /] deploy /home/jboss/jboss-files/systemprops.war --server-groups=grupo-apps

A aplicação foi deployada para as instâncias do server group ( server-one e server-two).

Acesse a url do nosso balanceador e verifique se a aplicação está disponível: http://192.168.0.140/systemprops/

server-2

Perceba que estamos no server-two. Entao para testarmos o funcionamento do balanceador vamos parar o server-two e quando tentarmos um novo acesso seremos redirecionados para o server-one.

No CLI execute o seguinte comando para parar o server-two:

[domain@192.168.0.128:9999 /] /host=slave02/server-config=server-two:stop
{
"outcome" => "success",
"result" => "STOPPING"
}

Acesse novamente a aplicação: http://192.168.0.140/systemprops/

server-1

Perceba que agora estamos no server-one.

Nosso objetivo foi alcançado 🙂

Na proxima parte vamos aprender como tornar esse ambiente clusterizado!

Abraços

26 comentários em “Configurando Ambiente de Produção no JBoss AS 7.1.3 (JBoss EAP 6.0.1) – Parte 2

    hilner disse:
    5 de dezembro de 2012 às 11:26

    ja configurou filas wmq no jboss eap6?
    teria um tutorial?

    […] Configurando Ambiente de Produção no JBoss AS 7.1.3 (JBoss EAP 6.0.1) – Parte 2 […]

    Neylor Leandro de Sousa disse:
    25 de março de 2013 às 10:20

    Olá Maurício, na sua experiência com o Modo Damain, já teve algum problema em atualização de aplicações, replicação de configurações entre hosts e grupos? Pois vamos iniciar com esta configuração em produção e como sempre trabalhamos em um modelo parecido com standalone, estamos receiosos.

    Referente a uma conta do usuáiro no Windows, o que venho fazendo é a criação de um usuário de domínio não administrativo e vinculado ao serviço do Windows, não tendo a necessidade de acrescentar permissões administrativas, funciona e não agrega problemas de segurança!

    Parabéns ao blog e pelo post, irei acompanha-lo!

    Mauricio Magnani Jr respondido:
    25 de março de 2013 às 10:29

    O Neylor, pode ficar tranquilo por que até hoje não tive nenhum problema com configurações normalmente o domain funciona corretamente e sem problemas.

    É uma grande vantagem ter uma forma centralizada de gerenciamento e configuração. As configurações podem ser aplicadas por Hosts ou Grupos de Instâncias o que facilita e muito a nossa vida né?! 🙂

    Eu só não gosto muito da interface web de gerenciamento prefiro o CLI… De vez em quando ocorrer alguns problemas na hora de persistir as configurações mas nada de tão grave assim. Utilizando CLI é 100%.

    Excelente forma de criação do usuário do Windows acredito que essa seja a melhor maneira (Y)

    Obrigado por acompanhar espero que goste das proximas partes!

    Abs

    marcelo disse:
    3 de maio de 2013 às 11:21

    Fala Mauricio. Como sempre seus posts são um guia e um caminho de luz para aqueles que buscam conhecimento no universo jboss. Parabéns mais uma vez.
    Gostaria apenas de tirar algumas dúvidas, por exemplo: no início do post vc menciona “No post anterior configuramos o Apache, os módulos do mod_cluster e gerarmos o certificados”. Não consigo ver menção de instalação ou configuração de certificados no primeiro post.
    Outra coisa, quando vc menciona “No meu ambiente possuo 3 servidores:” você quer dizer que possui três servidores de aplicação ou três máquinas? Fiquei em dúvida se sua distribuição era vertical ou horizontal.

    Ricardo disse:
    10 de maio de 2013 às 10:55

    Olá, Maurício

    Estou seguindo tudo conforme o post, mas quando vou subir o slave02 da o seguinte erro:
    ERROR [org.jboss.remoting.remote.connection] (Remoting “servprode37.prodesan:MANAGEMENT” read-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: all available authentication mechanisms failed

    Já verifiquei o usuário a senha, ta tudo certo….sabe como posso resolver.

    Abraço

      Mauricio Magnani Jr respondido:
      10 de maio de 2013 às 11:06

      Oi Ricardo,

      Esse erro é bem generico… não consigo ter uma idéia somente com essa parte do log.
      Voce poderia colocar os arquivos utilizados host.xml do domain e host.xml do slave… e também os parametros utilizados para inicializar os dois… talvez seja um pequeno detalhe 😉

      Cola lá no http://pastebin.com/ e me passa url que dou uma olhada!

      Abraços

    Ricardo disse:
    13 de maio de 2013 às 15:36
      Mauricio Magnani Jr respondido:
      13 de maio de 2013 às 15:39

      Vlw Ricardo.

      Vou olhar hoje a noite!

      Abs

      Mauricio Magnani Jr respondido:
      13 de maio de 2013 às 19:47

      Oi Ricardo eu fiz os testes aqui e tudo funcionou corretamente… seus arquivos estao configurados certinhos!
      Sei que pode ser meio besta mas dá uma olhada e verifica se o usuário jboss está mesmo em master/configuration/mgmt-users.properties
      Voce está fazendo esses testes na mesma maquina?
      Abs

    Diógenes Torres disse:
    7 de junho de 2013 às 9:05

    Maurcio, estou testando para implementar no modo domain, pois até então esetou utilizando o modo standard. Na sua explicação acima, você diz: “O JBoss AS 7 possui 4 profiles por padrão: “default”, “full”, “ha”, “full-ha”” , Analisando aqui estas profiles estão apenas no modo STANDARD, no modo DOMAIN, constam apenas as profiles: domain.xml, host.xml, host-master.xml, host-slave.xml.
    Poderia me dar um auxilio! Abraço.

      Mauricio Magnani Jr respondido:
      7 de junho de 2013 às 9:11

      O Diógenes então….

      Vou fazer um De / Para comparando os perfis…

      Standalone Domain

      standalone.xml domain.xml (profile=”default”)

      standalone-full.xml domain.xml (profile=”full”)

      standalone-ha.xml domain.xml (profile=”ha”)

      standalone-full-ha.xml domain.xml (profile=”full-ha”)

      Entendeu?! É como se todos os profiles do modo Standalone estivessem reunidos no domain.xml 🙂

      Dá uma olhada nesse arquivo domain.xml que vc vai entender.

      []s

    Diógenes Torres disse:
    7 de junho de 2013 às 10:08

    Mauricio, valeu mesmo!
    Vou fazer os testes aqui e te aviso.
    Abraço!

    Dennys S Alves disse:
    11 de fevereiro de 2014 às 16:09

    Mauricio esse procedimentos são requisitos aplicável na prova para certificação?

      Mauricio Magnani Jr respondido:
      11 de fevereiro de 2014 às 17:08

      A sim… saber criar um ambiente com JBoss EAP 6 e Mod Cluster + Apache é fundamental para a certificação.

      Abs

    Jean Carlos Danese disse:
    7 de abril de 2014 às 15:21

    Olá Mauricio. Como sempre um ótimo post.
    No entanto gostaria de saber se é possível fazer a configuração das três instancias (master, slave01 e slave02) no mesmo servidor e mesmo IP, usando por exemplo a configuração de -Djboss.socket.binding.port-offset=***.

      Mauricio Magnani Jr respondido:
      7 de abril de 2014 às 16:22

      Opa Obrigado Jean.

      Sim é possível… mas o jboss.socket.binding.port-offset é apenas para instância… sendo assim ainda teria conflito entre as interfaces de gerenciamento e nativa.

      O ideal nesse caso de se utilizar a mesma maquina é utilizar interfaces de redes diferentes… por exemplo o master pode ser inicializar na eth0 já o slave01 na eth1 e slave02 na eth2… nesse caso vc poderia copiar o diretorio domain e criar outros domain como master, slave01 e slave02 e na inicialização apontar… com o param -Djboss.domain.base.dir=….

      Abs

        Jean Carlos Danese disse:
        7 de abril de 2014 às 16:26

        Ok, Obrigado.

    Diógenes Torres disse:
    24 de julho de 2014 às 10:43

    Esse Mauricio é o cara!

Deixe um comentário