Wildfly 8

Configurando Um Ambiente WildFly 8 Profissional – Parte 2

Postado em Atualizado em

Olá,

Na primeira parte nós instalamos e criamos todos os ambientes que vamos utilizar em nossa arquitetura. Durante os ultimos anos sempre faço um desenho do ambiente que quero configurar antes de iniciar. Isso me ajuda a visualizar melhor o objetivo. Veja abaixo o desenho do ambiente inicial:

11-blog

Essa arquitetura é realmente um clássico da plataforma JBoss. Digo isso pois a maioria dos ambientes que vejo utilizam essa arquitetura variando apenas as camadas de segurança.

O Clinte HTTP ( Navagador ) acessa ( Faz um request ) a URL que está balanceada entre dois Apaches onde o Mod_Cluster decide utilizando uma métrica inteligente qual WildFly deverá atender ( Response ) a request, simples assim.

Vamos ao que interessa!

Configurando o Domain Controller

Os procedimentos abaixo devem ser executados somente no servidor  server-domain-widfly. O primeiro passo é garantir que o WildFly realmente está sendo inicializado como domain. Edite o arquivo /etc/default/wildfly.conf removendo o comentário ( # ) e deixando as valores das variáveis como abaixo:

 JBOSS_MODE=domain
 JBOSS_DOMAIN_CONFIG=domain.xml
 JBOSS_HOST_CONFIG=host-master.xml
 STARTUP_WAIT=30
 SHUTDOWN_WAIT=30
 JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log

Salve o arquivo. Realize o login com o usuário wildfly e reinicie o serviço:

 su wildfly
 sudo service wildfly restart

Observe o log em /var/log/wildfly/console.log e veja se realmente o processo host-controller foi iniciado:

[Host Controller] 18:03:38,805 INFO [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 127.0.0.1:9999
[Host Controller] 18:03:42,940 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://127.0.0.1:9990/management
[Host Controller] 18:03:42,943 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://127.0.0.1:9990
[Host Controller] 18:03:42,944 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 7691ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)

O arquivo host-master.xml já preparado para ser “master” domain controller do nosso ambiente. Vamos apenas alterar o nome para que seja mais fácil identifica-lo. Edite o arquivo  /opt/wildfly/domain/configuration/host-master.xml e na linha:

 <host name="master" xmlns="urn:jboss:domain:2.0">

Altere para:

 <host name="server-domain-widfly" xmlns="urn:jboss:domain:2.0">

Agora edite o arquivo /opt/wildfly/bin/domain.conf e abaixo da linha:

 JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"

Adicione a seguinte configuração:

 JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address.management=162.243.172.56"

Reinicie o wildfly e observe novamente o log em /var/log/wildfly/console.log:

 sudo service wildfly restart
 tailf /var/log/wildfly/console.log

Perceba que agora a interface de gerenciamento está “Listening” em 192.241.138.146:9999:

[Host Controller] 18:22:36,839 INFO [org.jboss.as.remoting] (MSC service thread 1-1) JBAS017100: Listening on 162.243.172.56:9999
[Host Controller] 18:22:40,178 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://162.243.172.56:9990/management
[Host Controller] 18:22:40,181 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://162.243.172.56:9990
[Host Controller] 18:22:40,182 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 6104ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)

Um passo muito importante ao configurar um ambiente WildFly é escolher quais tecnologias serão utilizadas. O WildFly 8 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 ( Agora Java EE 7 ) 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).

Nesse tutorial vamos utilizar o full-ha pois no futuro vamos configurar um Cluster.( ha = high availability e full = teóricamente todas as tecnologias Java EE 7 + implementações da Red Hat).

Pare o WildFly:

 sudo service wildfly stop

Edite o arquivo /opt/wildfly/domain/configuration/domain.xml e busque pela tag  <profile name=”full-ha”> e altere para:

 <profile name="arquitetura-full-ha">

Depois de definir o profile o próximo é criar um Grupo de Servidores: Server Group. Um server group nada mais é que um agrupamento de instâncias WildFly. Nessa arquitetura vamos utilizar dois server group. Isso pode ser definido na tag <server-groups> no domain.xml do master (Domain Controller). Ainda no arquivo  /opt/wildfly/domain/configuration/domain.xml remova a tag <server-groups> com seu conteúdo. Insira a configuração abaixo:

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

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

Reinicie o WildFly e verifique se a configuração deu mesmo certo! Para isso basta verificar se o não existem erros no log em  /var/log/wildfly/console.log:

[Host Controller] 18:55:59,776 INFO [org.jboss.as.remoting] (MSC service thread 1-2) JBAS017100: Listening on 162.243.172.56:9999
[Host Controller] 18:56:03,057 INFO [org.jboss.as] (Controller Boot Thread) JBAS015961: Http management interface listening on http://162.243.172.56:9990/management
[Host Controller] 18:56:03,060 INFO [org.jboss.as] (Controller Boot Thread) JBAS015951: Admin console listening on http://162.243.172.56:9990
[Host Controller] 18:56:03,061 INFO [org.jboss.as] (Controller Boot Thread) JBAS015874: WildFly 8.0.0.Final "WildFly" (Host Controller) started in 6146ms - Started 44 of 44 services (11 services are lazy, passive or on-demand)

Um detalhe sobre a configuração do Server Group é a tag <socket-binding-group ref=”full-ha-sockets”/>, ele deve ser associado ao tipo de profile escolhido ou seja.. se escolher o profile ha, você deverá utilizar o socket-binding ha-sockets.

Crie um usuário para administrar o WildFly ( jbossdivers ) e o usuário que será utilizado no canal de comunicação entre o Domain Controller e Host Controller (jbossdivershost). Execute o script /opt/wildfly/bin/add-user.sh e siga as instruções como abaixo:

Obs: Vou utilizar o password “Wildfly*#2

[wildfly@server-domain-widfly opt]$ sh /opt/wildfly/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.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : jbossdivers
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphanumeric character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
 - The password should be different from the username
Password :
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
About to add user 'jbossdivers' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'jbossdivers' to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-users.properties'
Added user 'jbossdivers' to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-users.properties'
Added user 'jbossdivers' with groups to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-groups.properties'
Added user 'jbossdivers' with groups to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-groups.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? no

 

[wildfly@server-domain-widfly opt]$ sh /opt/wildfly/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.
Using realm 'ManagementRealm' as discovered from the existing property files.
Username : jbossdivershost
Password recommendations are listed below. To modify these restrictions edit the add-user.properties configuration file.
 - The password should not be one of the following restricted values {root, admin, administrator}
 - The password should contain at least 8 characters, 1 alphanumeric character(s), 1 digit(s), 1 non-alphanumeric symbol(s)
 - The password should be different from the username
Password :
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated list, or leave blank for none)[ ]:
About to add user 'jbossdivershost' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'jbossdivershost' to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-users.properties'
Added user 'jbossdivershost' to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-users.properties'
Added user 'jbossdivershost' with groups to file '/opt/wildfly-8.0.0.Final/standalone/configuration/mgmt-groups.properties'
Added user 'jbossdivershost' with groups to file '/opt/wildfly-8.0.0.Final/domain/configuration/mgmt-groups.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="V2lsZGZseSojMg==" />

No processo de criação do usuário jbossdivershost foi gerado um password com a tag <secret value=”V2lsZGZseSojMg==” />. Guarde pois utilizaremos essa tag na configurações dos Host Controllers.

Para finalizar por enquanto a configuração do Domain Controller, abra o navegador  com a url: http://162.243.172.56:9990. A página de login será exibida e após a validação do usuário jbossdivers o painel de controle será exibido:

12-blog

Configurando Os Hosts Controllers

Os procedimentos abaixo devem ser executados somente no servidor  server-host1-widfly e server-host2-widfly. O primeiro passo é garantir que o WildFly realmente está sendo inicializado como domain. Edite o arquivo /etc/default/wildfly.conf removendo o comentário ( # ) e deixando as valores das variáveis como abaixo:

 JBOSS_MODE=domain
 JBOSS_HOST_CONFIG=host-slave.xml
 STARTUP_WAIT=30
 SHUTDOWN_WAIT=30
 JBOSS_CONSOLE_LOG=/var/log/wildfly/console.log
 JBOSS_USER=wildfly

Salve o arquivo. Realize o login com o usuário wildfly e reinicie o serviço:

su wildfly
sudo service wildfly restart

Observe o log em /var/log/wildfly/console.log e veja se realmente o processo host-controller foi iniciado:

[Host Controller] 20:26:22,325 INFO [org.jboss.as] (MSC service thread 1-1) JBAS015899: WildFly 8.0.0.Final "WildFly" starting
[Host Controller] 20:26:23,226 ERROR [org.jboss.as.controller.management-operation] (Controller Boot Thread) JBAS014613: Operation ("write-remote-domain-controller") failed - address: ([("host" => "unknown-host.unknown-domain")]) - failure description: "JBAS014802: Cannot resolve expression 'expression \"${jboss.domain.master.address}\"' -- java.lang.IllegalStateException: Failed to resolve expression: ${jboss.domain.master.address}"
[Host Controller] 20:26:23,230 FATAL [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010933: Host Controller boot has failed in an unrecoverable manner; exiting. See previous messages for details.
[Host Controller] 20:26:23,252 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015950: WildFly 8.0.0.Final "WildFly" stopped in 8ms
[Host Controller]
20:26:23,574 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process 'Host Controller' finished with an exit status of 99
20:26:23,576 INFO [org.jboss.as.process] (Thread-8) JBAS012016: Shutting down process controller
20:26:23,577 INFO [org.jboss.as.process] (Thread-8) JBAS012015: All processes finished; exiting
1598 [ OK ]

Perceba que o Host Controller não conseguiu resolver o endereço do Domain Controller (jboss.domain.master.address).

Para resolver esse problema edite o arquivo  /opt/wildfly/bin/domain.conf e abaixo da linha:

 JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"

Adicione a seguinte configuração:

 JAVA_OPTS="$JAVA_OPTS -Djboss.domain.master.address=162.243.172.56"
 JAVA_OPTS="$JAVA_OPTS -Djboss.bind.address=162.243.172.52"

Reinicie o wildfly e observe novamente o log em /var/log/wildfly/console.log:

 sudo service wildfly restart
 tailf /var/log/wildfly/console.log

Um novo erro foi apresentado. A autenticação falhou por que nós ainda não configuramos essa parte:

[Host Controller] 22:05:30,678 ERROR [org.jboss.remoting.remote.connection] (Remoting "unknown-host.unknown-domain:MANAGEMENT" I/O-1) JBREM000200: Remote connection failed: javax.security.sasl.SaslException: Authentication failed: the server presented no authentication mechanisms
[Host Controller] 22:05:30,688 WARN [org.jboss.as.host.controller] (Controller Boot Thread) JBAS016535: Could not connect to master. No domain controller discovery options left. Error was: java.lang.IllegalStateException: JBAS010942: Unable to connect due to authentication failure.
[Host Controller] 22:05:30,690 ERROR [org.jboss.as.host.controller] (Controller Boot Thread) JBAS010901: Could not connect to master. Aborting. Error was: java.lang.IllegalStateException: JBAS016519: Tried all domain controller discovery option(s) but unable to connect
[Host Controller] 22:05:30,729 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015950: WildFly 8.0.0.Final "WildFly" stopped in 26ms
[Host Controller]
22:05:31,053 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process 'Host Controller' finished with an exit status of 99
22:05:31,054 INFO [org.jboss.as.process] (Thread-8) JBAS012016: Shutting down process controller
22:05:31,055 INFO [org.jboss.as.process] (Thread-8) JBAS012015: All processes finished; exiting

Edite o arquivo /opt/wildfly/domain/configuration/host-slave.xml substitua a tag <secret value=”c2xhdmVfdXNlcl9wYXNzd29yZA==”/> pela tag <secret value=”V2lsZGZseSojMg==” /> gerada anteriormente na criação do usuário jbossdivershost.

 <server-identities>
    <!-- Replace this with either a base64 password of your own, or use a vault with a vault expression -->
    <secret value="V2lsZGZseSojMg==" />
 </server-identities>

Edite também o a tag  <remote  …/> e adicione o usuário jbossdivershost:

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

Crie as instâncias arquitetura-1 e arquitetura-2. Deixe a tag  <servers> como abaixo:

 <servers>

    <server name="arquitetura-1" group="arquitetura-grupo-1"/>

    <server name="arquitetura-2" group="arquitetura-grupo-2">
       <socket-bindings port-offset="100"/>
    </server>

 </servers>

Adicione também o nome do Host Controller como abaixo:

  <host name="server-host1-widfly"  xmlns="urn:jboss:domain:2.0">

Finalmente as configurações estão finalizadas. Reinicie o wildfly.

 sudo service wildfly restart

Observe novamente o log no servidor server-domain-widfly e veja o server-host1-widfly se conectando:

[Host Controller] 22:32:38,672 INFO  [org.jboss.as.domain] (slave-request-threads - 1) JBAS010918: Registered remote slave host "server-host1-widfly", WildFly 8.0.0.Final "WildFly"

Abra novamente o navegador com a url: http://162.243.172.56:9990. A página de login será exibida e após a validação do usuário jbossdivers o painel de controle será exibido com a estrutura atual dos Hosts e Intâncias:

13-blog

 

Conectando o Wildfly ao Apache Web Server

No Servidor server-domain-widfly edite o arquivo /opt/wildfly/domain/configuration/domain.xml. Busque pele profile <profile name=”arquitetura-full-ha”>. Dentro desse profile edite o Subsystem <subsystem xmlns=”urn:jboss:domain:modcluster:1.2″> deixando-o como abaixo:

<subsystem xmlns="urn:jboss:domain:modcluster:1.2">
  <mod-cluster-config advertise-socket="modcluster" proxy-list="162.243.172.53:80,192.241.138.146:80" advertise="false" sticky-session="true" load-balancing-group="arquitetura"  connector="ajp">
   <dynamic-load-provider>
     <load-metric type="cpu"/>
   </dynamic-load-provider>
  </mod-cluster-config>
</subsystem>

Observe que na tag proxy-list nós colocamos os dois Balancers / Apache Web Servers. Acesse o mod cluster manager para visualizar as instancias conectadas nos Balancers.

server-balancer1

15-blog

server-balancer2

14-blog

Apenas para garantirmos o funcionamente dos nossos Balancers. Faça o deploy da aplicação SystemProps no WildFly para o Server Group arquitetura-1.

No Console Web do Wildfly navegue até Manage Deployments e realize o deploy como abaixo:

16-blog

17-blog

18-blog

19-blog

20-blog

21-blog

 

Observe novamente o Mod Cluster Manager  nos Balancers e perceba que a aplicação já está publica e habilitada para acesso:

22-blog

 

 

 

Acesse a aplicação utilizando alguns dos Balancers. A aplicação exibirá algumas informações como abaixo:

24-blog

 

Finalizamos assim a configuração inicial do ambiente. Nas proximas partes vamos instalar os agentes de monitoramento para o RHQ Server e configurar o Cluster no Wildfly. Vamos também criar a infra-estrtura para alta disponibilidade do Apache Web Server.

Abraços e até a proxima.

Configurando Um Ambiente WildFly 8 Profissional – Parte 1

Postado em Atualizado em

Olá meus amigos,

A muito tempo eu não escrevo pois a vida anda muito corrida. Com o lançamento do WildFly 8 surgiram algumas novidades no nosso servidor de aplicação preferido 🙂  Java EE 7, Segurança baseada em RBCA, Novo servidor Web são algumas das novidades mas o objetivo aqui hoje é ser bem prático. Para conhecer as novas funcionalidades aconselho a leitura do link: http://wildfly.org/about/ .

Vou separar esse tutorial por partes para ficar melhor organizado.

O que vamos utilizar?

  • WildFly 8.0.0.Final
  • Oracle JDK 1.7.x
  • CentOS 6.5 ( 6 Servidores )
  • Postgres 9.x
  • Apache 2.2.x
  • RHQ 4.10.0

Para deixar bem claro a estrutura que vamos criar ou associar os softwares ao servidores:

  1. server-balancer1 –> CentOS 6.5, Apache 2.2.x
  2. server-balancer2 –> CentOS 6.5, Apache 2.2.x
  3. server-domain-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
  4. server-host1-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
  5. server-host2-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
  6. server-rhq –> CentOS 6.5, Oracle JDK 1.7.x,Postgres 9.x

Apenas por curiosidade para esse tutorial utilizei os servidores da Digital Ocean  pois os valores são bem em conta e meu ThinkPad  não suportaria virtualizar essa quantidade de máquinas.

Instalando JDK

Navegue até o site da Oracle  e realize o download do jdk-7u51-linux-x64.rpm:

Link: http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html?ssSourceSiteId=otnpt

01-Blog

A instalação é bem simples. Utilizando o terminal execute os procedimentos abaixo nos servidores server-domain-widfly, server-host1-widfly, server-host2-widfly e server-rhq:

rpm -Uvh jdk-7u51-linux-x64.rpm
alternatives --install /usr/bin/java java /usr/java/latest/jre/bin/java 200000
alternatives --install /usr/bin/javaws javaws /usr/java/latest/jre/bin/javaws 200000
alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000
alternatives --install /usr/bin/jar jar /usr/java/latest/bin/jar 200000

Para verificar se foi instalado corretamente execute: java -version

03-blog

Instalando WildFly 8

Faça o download do arquivo wildfly-8.0.0.Final.zip:

Link: http://download.jboss.org/wildfly/8.0.0.Final/wildfly-8.0.0.Final.zip

04-blog

A instalação do WildFly 8 é bem simples, basta descompactar. Claro que existem outras fatores envolvidores como boas práticas, script de serviço, criação de grupos entre outras coisas. Sendo assim execute os procedimentos abaixo nos servidores server-domain-widfly, server-host1-widfly, server-host2-widfly:

unzip wildfly-8.0.0.Final.zip -d /opt/
ln -s /opt/wildfly-8.0.0.Final /opt/wildfly
groupadd wildfly
useradd -s /bin/bash -d /home/wildfly -m -g wildfly wildfly
chown -R wildfly:wildfly /opt/wildfly-8.0.0.Final
chown -h wildfly:wildfly /opt/wildfly

Edite o arquivo /etc/sudoers e adicione a seguinte permissão para o usuário wildfly. Lembrando que a policita de sudoers pode variar conforme a politica de segurança de cada sysadmin. Nesse caso estou adicionando total permissão:

wildfly ALL=(ALL) NOPASSWD:ALL

Agore altere o password o usuário wildfly e realize o login. A partir desse momentos vamos utilziar a permissão de sudo para realizar qualquer tarefa que exija permissão administrativa:

passwd wildfly
su wildfly

O proximo passo é configurar o script de serviço. Felizmente o wildfly já nos fornece um exemplo. Execute os comandos abaixo:

sudo cp /opt/wildfly/bin/init.d/wildfly-init-redhat.sh /etc/init.d/wildfly
sudo chkconfig --add /etc/init.d/wildfly
sudo chkconfig --level 3 /etc/init.d/wildfly
sudo cp /opt/wildfly/bin/init.d/wildfly.conf /etc/default/

Realize o teste no script de serviço, execute:

sudo service wildfly start

O seguinte erro ocorrerá:

Starting wildfly: chown: missing operand after `/var/run/wildfly'
Try `chown --help' for more information.

Isso aconteceu por que o script /etc/wildfly utiliza um parâmetro chamado JBOSS_USER que está comentado no arquivo padrão em /etc/default/wildfly.conf. Edite-o e remova o comentário ( # ) da linha JBOSS_USER=wildfly, deixando essa linha configurada.

Execute novamente:

sudo service wildfly start

Observe o log /opt/wildfly/standalone/log/server.log. o WildFly foi iniciado corretamente:  WildFly 8.0.0.Final “WildFly” started in 10717ms

05-blog

Instalando Apache Web Server e Mod Cluster

Instalar o Apache Web Server no CentOS 6.5 é uma tarefa bem simples pois vamos utilizar o gerenciador de pacotes yum. Sendo assim execute os procedimentos abaixo nos servidores server-balancer1 e server-balancer2:

yum install httpd httpd-devel apr-devel openssl-devel mod_ssl -y

Vamos verificar se o Apache Web Server está funcionando. Execute:

service httpd start

Abra seu navegador preferido e digite o IP do servidor em que o Apache foi instalado. A seguinte página de sucesso será exibida:

06-blog

Durante a inicialização o erro abaixo foi exibido:

Starting httpd: httpd: apr_sockaddr_info_get() failed for server-balancer1
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

Ou seja ele não conseguiu resolver o nome do servidor. Você pode adicionar o IP / Nome  do servidor em /etc/hosts ou editar o arquivo /etc/httpd/conf/httpd.conf e alterar o valor do parâmetro ServerName para localhost ( remova também o comentário ‘#’). Reinicie o Apache e perceba que o problema foi resolvido.

O proximo passo é realizar o download do Mod_Cluster. Para quem desconhece, o Mod_Cluster é um componente de balanceamento de carga inteligente desenvolvido pelo Red Hat. A configuração do Mod_Cluster é realizada em duas frentes: Apache Web Server e WildFly. Nessa parte vamos configurar a parte do Web Server.

Faça o download o Mod Cluster 1.2.6.Final.

Link: http://downloads.jboss.org/mod_cluster//1.2.6.Final/linux-x86_64/mod_cluster-1.2.6.Final-linux2-x64-so.tar.gz

07-blog

Descompacte e copie os módulos do Mod_Cluster para o diretório modules do Apache Web Server:

wget http://downloads.jboss.org/mod_cluster//1.2.6.Final/linux-x86_64/mod_cluster-1.2.6.Final-linux2-x64-so.tar.gz
tar -zxvf mod_cluster-1.2.6.Final-linux2-x64-so.tar.gz
cp mod_advertise.so /etc/httpd/modules/
cp mod_manager.so /etc/httpd/modules/
cp mod_proxy_cluster.so /etc/httpd/modules/
cp mod_slotmem.so /etc/httpd/modules/

Agora edite o arquivo /etc/httpd/conf/httpd.conf e comente a linha LoadModule proxy_balancer_module modules/mod_proxy_balancer.so , para não ocorrer um conflito com mod_proxy_cluster.so:

#LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

Em /etc/httpd/conf.d/ crie o arquivo mod_cluster.conf e adicione as configurações abaixo:

######################################################################################
#Configurações Adicionadas por Mauricio Magnani - mmagnani@redhat.com - 22/03/2014

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

MemManagerFile /var/cache/mod_cluster

Maxcontext 100
Maxnode 100
Maxhost 100

<VirtualHost *:80>

<Directory />
Order deny,allow
Allow from all
</Directory>

<Location /mod_cluster_manager>
SetHandler mod_cluster-manager
#Order deny,allow
#Deny from all
#Allow from all
AuthType Basic
AuthName "MCM"
AuthUserFile /etc/modclusterpassword
Require user admin
</Location>

KeepAliveTimeout 60
MaxKeepAliveRequests 0
ServerAdvertise Off
EnableMCPMReceive Off

</VirtualHost>

O arquivo de configuração acima atende basicamente um ambiente onde estamos utilizando UNICAST.

Os  parâmetros  Maxcontext, Maxnode e Maxhost foram adicionados por segurança para que nós possamos ter mais contextos / aplicações disponiveis em nosso ambiente já que por padrão é limitado a 20.

Observe também os parâmetros AuthType, AuthName  e AuthUserFile, eles foram adicionados visando estabelecer o minimo de segurança para o painel mod_cluster_manager em que contextos podem ser habilitados e desabilitados além de fornecer outras métricas. É muito importante nunca deixar esse painel aberto. Sendo assim o passo final é criar o usuário “admin” e password para esse painel.

Execute:

htpasswd -c /etc/modclusterpassword admin

Reinicie o Apache Web Server a abra o contexto mod_cluster_manager utilizando o navegador e se tudo estiver correto a página abaixo será exibida:

08-blog

Lembrando que os procedimentos realizados nessa parte deverão ser feito nos Dois servidores pois nessa arquitetura serão utilizado Dois Apaches.

Instalando Postgresql e  RHQ Server

Estamos instalando o Postgresql para armazenar as tabelas e métricas dos nossos servidores WildFly atrávés do RHQ Server. Os procedimentos abaixo devem ser realizados no servidor server-rhq.

Link: http://yum.postgresql.org/9.2/redhat/rhel-6.5-x86_64/

rpm -Uvh http://yum.postgresql.org/9.2/redhat/rhel-6.5-x86_64/pgdg-redhat92-9.2-7.noarch.rpm
yum install postgresql92 postgresql92-server postgresql92-contrib -y
su - postgres -c /usr/pgsql-9.2/bin/initdb

Edite o arquivo /var/lib/pgsql/9.2/data/postgresql.conf e altere o parâmetro listen_addresses e port como abaixo:

# - Connection Settings -
listen_addresses = '162.243.172.56' # what IP address(es) to listen on;
port = 5432 # (change requires restart)

Edite também o arquivo /var/lib/pgsql/9.2/data/pg_hba.conf adicionando o parâmetro abaixo:

# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0 0.0.0.0 md5

Reinicie o Postgresql para validar as alterações:

service postgresql-9.2 restart

Agora realize o login e crie o usuário e database para armazenar as métricas:

su postgres
createdb rhq
psql rhq
CREATE ROLE rhq WITH SUPERUSER LOGIN PASSWORD 'rhq';

Faça um pequeno teste para garantir que o usuário jon realmente tem acesso ao db rhq:

psql -h 162.243.172.56 -U rhq rhq

Finalizamos assim a configuração do Postgresql. Um ajuste mais fino das configurações pode ser vista no link abaixo:

Link: https://access.redhat.com/site/documentation/en-US/Red_Hat_JBoss_Operations_Network/3.2/html/Installation_Guide/setting-up-dbs.html#setting-postgres-settings

O proximo passo é realizar a instalação do RHQ Server. O servidor de monitoramente RHQ Server ( JON – versão enterprise ) é muito mais que um servidor para monitorar instâncias JBoss / WildFly, é uma plataforma completa de monitoramente que engloda desde file system, interfaces de rede, até envio SNMP traps para outras plataformas.

Faça o download do RHQ Server rhq-server-4.10.0.zip.

Link: http://sourceforge.net/projects/rhq/files/rhq/rhq-4.10/rhq-server-4.10.0.zip/download

09-blog

Execute os procedimentos abaixo:

unzip rhq-server-4.10.0.zip -d /opt/
ln -s /opt/rhq-server-4.10.0 /opt/rhq
groupadd rhq
useradd -s /bin/bash -d /home/rhq -m -g rhq rhq
chown -R rhq:rhq /opt/rhq-server-4.10.0
chown -h rhq:rhq /opt/rhq

O RHQ Server 4.10 oferece um script chamado rhqctl que é a maneiro mais simples de realizar a configuração inicial da instalação. Execute:

./rhq/bin/rhqctl install

O seguinte erro ocorrerá:

There is no JVM available.
Please set RHQ_JAVA_HOME or RHQ_JAVA_EXE_FILE_PATH appropriately.

Devemos definir o valor da variável RHQ_JAVA_HOME. Apenas para realizarmos a instalação na linha de comando execute:

export RHQ_JAVA_HOME=/usr/java/latest

Execute novamente o script rhqctl e siga as instruçãoes como abaixo:

[root@server-rhq opt]# ./rhq/bin/rhqctl install
22:39:10,459 INFO [org.jboss.modules] JBoss Modules version 1.2.0.CR1
The [jboss.bind.address] property is required but not set in [rhq-server.properties].
Do you want to set [jboss.bind.address] value now?
yes|no: yes
jboss.bind.address: 0.0.0.0
Is [0.0.0.0] correct?
yes|no: yes

Um novo erro ocorreu. Edito o arquivo /etc/hosts e adicione a configuração com o IP / Hostname:

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain
162.243.172.56 server-rhq

Para evitar mais problemas remova o arquivo /opt/rhq-data.

Edite também o arquivo /opt/rhq/bin/rhq-server.properties deixando a configuração da postgresql como abaixo:

# PostgreSQL database
rhq.server.database.connection-url=jdbc:postgresql://162.243.172.56:5432/rhq
rhq.server.database.user-name=rhq
rhq.server.database.password=34dd4e5bd20222b8
rhq.server.database.type-mapping=PostgreSQL
rhq.server.database.server-name=162.243.172.56
rhq.server.database.port=5432
rhq.server.database.db-name=rhq
hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
rhq.server.quartz.driverDelegateClass=org.quartz.impl.jdbcjobstore.PostgreSQLDelegate

O password pode deve ser encriptado utilizando o script /opt/rhq/bin/rhq-encode-password.sh.

[root@server-rhq opt]# ./rhq/bin/rhq-encode-password.sh
22:50:57,172 INFO [org.jboss.modules] JBoss Modules version 1.2.0.CR1
Password: rhq
22:51:01,240 INFO [org.rhq.enterprise.server.installer.Installer] *** Encoded password for rhq-server.properties:
22:51:01,241 INFO [org.rhq.enterprise.server.installer.Installer] *** rhq.server.database.password=34dd4e5bd20222b8
[root@server-rhq opt]# vim /opt/rhq/bin/rhq-server.properties

Execute novamente o script ./rhq/bin/rhqctl install e observe que o RHQ Server foi instalado corretamente:

[install] [echo] DONE! Agent version 4.10.0 (build number=fe32169) has been installed to /opt
22:59:37,854 INFO [org.rhq.server.control.command.Install] The agent installer finished running with exit value 0
22:59:37,854 INFO [org.rhq.server.control.command.Install] Configuring the RHQ agent with default configuration file: /opt/rhq-agent/conf/agent-configuration.xml
22:59:37,928 INFO [org.rhq.server.control.command.Install] Finished configuring the agent
Trying to stop the RHQ Server...
RHQ Server (pid=4188) is stopping..e

Crie o script de serviço para o RHQ Server:

cp /opt/rhq/bin/rhqctl /etc/init.d/rhq

Adicione a variável RHQ_SERVER_HOME:

RHQ_SERVER_HOME=/opt/rhq

No topo do arquivo /etc/init.d/rhq abaixo de #!/bin/sh adicione as seguintes linhas:

#chkconfig: 2345 95 20
#description: RHQ Server 4.10
#processname: standalone.sh

Abaixo de das linhas acima configure um usuário “non-root” para iniciar o processo que em nosso caso é o rhq:

su - rhq -c "/etc/init.d/rhq $*" &amp;

Salve o arquivo e execute os comandos abaixo para terminar a configuração do serviço:

chkconfig --add rhq
chkconfig rhq --list
chkconfig --level 5 rhq on

Edite o arquivo /etc/sudoers e adicione a seguinte permissão para o usuário rhq.

rhq ALL=(ALL) NOPASSWD:ALL

Agore altere o password o usuário rhq e realize o login. A partir desse momentos vamos utilziar a permissão de sudo para realizar qualquer tarefa que exija permissão administrativa:

passwd rhq
su rhq

Alter as permissões dos arquivos rhq:

sudo chown -R rhq:rhq /opt/rhq*

Inicie o serviço:

sudo service rhq start
Trying to start the RHQ Server...
RHQ Server (pid 6307 ) is starting
Starting RHQ Agent...
RHQ Agent (pid 6474 ) is ✔running

Abra seu navegador com a url: IP DO SERVIDOR:7080. Se conseguir ver a página abaixo é por que a instalação foi realizada com sucesso:

10-blog

Terminamos a parte de instalação dos nossos servidores. Na proxima parte vamos iniciar a configuração de todos esses softwares para que eles trabalhem em conjunto.

Um grande abraço

— Mauricio Magnani Jr

Obs: Se encontrarem erros de pt BR me avisem pois fiz meio que na madruga rs.

Utilizando System Propertie em Deployable ( *-ds ) Data Sources no WildFly 8

Postado em Atualizado em

wildfly_logoEm ambientes de desenvolvimento normalmente pela facilidade e pelo “cultura” de outras versões decidimos utilizar os já conhecidos *-ds, que são data sources “Deployables”, ou seja basta colocar no diretório wildfly-8.0.0.CR1/standalone/deployments que estará disponivel para uso.

Por exemplos vamos publicar um data souce para o MySQL simplesmente copiando o arquivo mysql-ds para o diretorio wildfly-8.0.0.CR1/standalone/deployments :

<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
 <datasource
  jndi-name="testeDatasource"
  enabled="true"
  use-java-context="true" pool-name="testeDatasource_pool">
    <connection-url>jdbc:mysql://localhost/classicmodels</connection-url>
    <driver>mysql-connector-java-5.1.26-bin.jar</driver>
    <security>
      <user-name>root</user-name>
      <password>root</password>
    </security>
 </datasource>
</datasources>

Observe o LOG após realizarmos o deploy do arquivo mysql-ds.xml :

14:32:49,171 INFO  [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-7) JBAS010400: Bound data source [java:/testeDatasource]
14:32:49,313 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 29) JBAS018559: Deployed "mysql-ds.xml" (runtime-name : "mysql-ds.xml")
14:32:49,314 INFO  [org.jboss.as.server] (ServerService Thread Pool -- 29) JBAS018559: Deployed "mysql-connector-java-5.1.26-bin.jar" (runtime-name : "mysql-connector-java-5.1.26-bin.jar")

Veja os arquivos “deployados”:

ds

Para  testar o data source utilize a aplicação dstest.war.

ds2

Observe que o data source funcionou pefeitamente!

As vezes por questão de segurança ou praticidade desejamos que informações críticas não fiquem expostas nos arquivos *-ds. Para suprir essa necessidade podemos utilizar System Properties definidas no servidor de aplicação. Por exemplo, crie duas propriedades para, uma para o username e outra para o password:

[standalone@localhost:9990 /] /system-property=username:add(value=root)
{"outcome" => "success"}
[standalone@localhost:9990 /] /system-property=password:add(value=root)
{"outcome" => "success"}

Observe que no arquivo wildfly-8.0.0.CR1/standalone/configuration/standalone.xml as propriedades foram criadas:

propsAgora altere o arquivo wildfly-8.0.0.CR1/standalone/deployments/mysql-ds adicionando as propriedades criadas:

<?xml version="1.0" encoding="UTF-8"?>
<datasources xmlns="http://www.jboss.org/ironjacamar/schema">
  <datasource
   jndi-name="testeDatasource"
   enabled="true"
   use-java-context="true" pool-name="testeDatasource_pool">
    <connection-url>jdbc:mysql://localhost/classicmodels</connection-url>
    <driver>mysql-connector-java-5.1.26-bin.jar</driver>
    <security>
      <user-name>${username}</user-name>
      <password>${password}</password>
    </security>
  </datasource>
</datasources>

Salve o arquivo e teste novamente utilizando a aplicação dstest.war:

ds3Observe que não conseguimos obter uma conexão 😦

Calma! Isso foi apenas para que você nunca se esqueça que no JBoss AS 7 / JBoss EAP 6 e WidlFly 8 quando vamos fazer property replacement a tag jboss-descriptor-property-replacement deve estar como true:

 <jboss-descriptor-property-replacement>true</jboss-descriptor-property-replacement>

Utiliando  JBoss CLI execute:

 [standalone@localhost:9990 /] /subsystem=ee:write-attribute(name=jboss-descriptor-property-replacement,value=true)
 {"outcome" => "success"}

Teste novamente:

dsfinal

Agora sim tudo funcionou perfeitamente 🙂

Espero que tenha ajudado!

Abraços

Adicionando Módulo Utilizando JBoss CLI no WildFly 8

Postado em

wildfly_logo
Uma maneira simples de adicionar um novo módulo no WildFly é via JBoss CLI, veja abaixo.

Primeiro inicie o WildFly:

./wildfly-8.0.0.CR1/bin/standalone.sh

Em seguida se conecte ao WidFly utilizando o JBoss CLI:

./wildfly-8.0.0.CR1/bin/jboss-cli.sh -c

Execute o comando abaixo e altere os parâmetros conforme as suas necessidades:

[standalone@localhost:9990 /] module add --name=com.mysql --resources=/home/mmagnani/RedHat/development/oracle/MySQL/mysql-connector-java-5.1.26/mysql-connector-java-5.1.26-bin.jar --dependencies=javax.api

Agora navegue até o diretório de módulos e perceba que o nosso módulo do MySQL foi criado com sucesso!

mod1

mod2

 

Um uso interessante para essa funcionalidade seria executar um script CLI remoto através do  JOB / Jenkins criando o módulo do JAR que está sendo  construido.  Existem muitas arquiteturas internas de empresas que são empacotadas através de arquivos JARs e essa seria uma forma de automatizar a atualização desses módulos no WildFly 8 ou no JBoss EAP 6.

Espero que seja útil!

Abraços

JBoss Diagnostic Reporter no WildFly 8

Postado em Atualizado em

wildfly_logo

O JBoss Diagnostic Reporter ( JDR ) é um subsystem adicionado no JBoss EAP 6 e consequentemente disponivel no WildFly 8.  Ele é utilizado para coletar informações sobre tempo de execução, logs, arquivos de configurações, módulos instalados, informações sobre deploys entre outros recursos. Ele pode ser utilizado on-line ( com o JBoss funcionando ) ou  off-line ( com o JBoss totalmente parado), sendo que na segunda opção menos informações serão coletadas.

Realize o download do WildFly 8, descompacte e inicie:

[mmagnani@mmagnani jboss]$ wget http://download.jboss.org/wildfly/8.0.0.CR1/wildfly-8.0.0.CR1.zip
[mmagnani@mmagnani jboss]$ unzip wildfly-8.0.0.CR1.zip$
[mmagnani@mmagnani jboss]$ ./wildfly-8.0.0.CR1/bin/standalone.sh

Agora execute o Scritp jdr.sh:

[mmagnani@mmagnani jboss]$ ./wildfly-8.0.0.CR1/bin/jdr.sh
Initializing JBoss Diagnostic Reporter...
JDR started: Sun Jan 19 17:26:57 BRST 2014
JDR ended: Sun Jan 19 17:27:01 BRST 2014<
JDR location: /home/mmagnani/RedHat/development/jboss/jdr_14-01-19_05-26-57.zip

Perceba que ele criou um arquivo jdr_14-01-19_05-26-57.zip contendo algumas informações sobre o WildFly permitindo assim uma análise inicial por uma equipe de suporte ou por qualquer membro da nossa equipe.

jdrO JBoss CLI também pode ser utilizado para essa tarefa:

[standalone@localhost:9990 /] /subsystem=jdr:generate-jdr-report()
{
 "outcome" => "success",
 "result" => {
 "start-time" => "Sun Jan 19 17:31:32 BRST 2014",
 "end-time" => "Sun Jan 19 17:31:37 BRST 2014",
 "report-location" => "/home/mmagnani/RedHat/development/jboss/wildfly-8.0.0.CR1/standalone/tmp/jdr_14-01-19_05-31-32_mmagnani.zip"
 }
}

Pelo fato de conseguirmos pegar todos os detalhes das configurações talvez essa seja uma das melhores formas de compartilhar as configurações de uma instância especifica entre os membros de um time.

Espero que tenha ajudado.

Abraços

Wildfly em 8.0.0.Beta1

Postado em

WildFly

Confesso que ainda não me acostumei com esse nome!

Wildfly é a continuação do sucesso que está sendo o JBoss AS 7. Voltado para nova especificação o Java EE 7, o servidor tráz consigo algumas inovações além do nome.

Uma das grandes inovações é o uso do Undertow com servidor Web que veio substituir o nosso antigo conhecido JBoss Web. Mais informações sobre o Undertow podem ser encontradas nesse link: http://undertow.io/

No release notes também podemos notar o a diminuição do número de portas. Uma coisa que me chamou a atenção foi “The native management port, 9999, is deprecated and will be removed by final.” Isso vai causar algum impacto nas configurações…

Quando tiver um tempinho eu vou testar 🙂

Wildfly 8.0.0.Beta1 http://download.jboss.org/wildfly/8.0.0.Beta1/wildfly-8.0.0.Beta1.zip

Ps: Obrigado ao Madeira Junior por ter alertado sobre o Beta do WildFly.

Abs

Iniciando no Wildfly 8.0.0.Alpha1

Postado em Atualizado em

Olá amigos tudo bom?

Como todos sabem o projeto JBoss AS 7 foi renomeado recentemente para WildFly.  Então hoje vamos instalar a versão Alpha que deve ser utilizada apenas para testes.   A documentação inicial do WildFly está disponível em https://docs.jboss.org/author/display/WFLY8/Documentation.

Em alguns comunidades dos desenvolvedores do WildFly e em outros da própria Red Hat foi dito que o principal objetivo do WildFly é atender a especificação do JavaEE 7 que pode ser visualizada aqui.

Faça o download da versão WildFly 8.0.0.Alpha1 na seguinte url: http://www.wildfly.org/download/ . Baixe o arquivo wildfly-8.0.0.Alpha1.zip.

WildFly1

Descompacte o arquivo e veja que a estrutura de diretório no “JBOSS_HOME” é a mesma do JBoss AS 7.

WildFly2

A principal mudança nessa versão WildFly Alpha em relação ao JBoss AS 7 foi a novo estrutura de arquivos que armazena os módulos. Os módulos “base” do WildFly estão em wildfly-8.0.0.Alpha1\modules\system\layers\base:

WildFly3

Para iniciar o WildFly execute o script wildfly-8.0.0.Alpha1\bin\standalone.bat.

Eu tentei rodar utilizando JDK 6 e foi exception para todo os lados:

WildFly4

Já com o JDK 7  funcionou perfeitamente:

WildFly5

Acesse a url http://localhost:8080/  e veja a página de boas vindas do WildFly:

WildFly6

Existem alguns Quickstarts que podem ser utilizados para testes.

Muita coisa ainda pode mudar… essa é apenas uma versão Alpha mas vamos acompanhando tudo bem de perto 🙂

Grande Abraço,

Mauricio Magnani