Configurando Um Ambiente WildFly 8 Profissional – Parte 1
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:
- server-balancer1 –> CentOS 6.5, Apache 2.2.x
- server-balancer2 –> CentOS 6.5, Apache 2.2.x
- server-domain-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
- server-host1-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
- server-host2-widfly –> CentOS 6.5, WildFly 8.0.0.Final, Oracle JDK 1.7.x
- 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:
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
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
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
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:
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
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:
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:
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
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 $*" &
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:
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.
23 de março de 2014 às 11:46
Caramba Mauricio. Parabéns cara. Seus artigos como sempre dignos de um capitulo de livro. Uma ou outra correção boba como você pediu mas que não diminui absolutamente em nada seu brilhante trabalho.
Com exceção do balanceamento do Apache (vc pretende usar heartbit?) o ambiente que estou finalizando é bem similar, só que com EAP 6.2.
Você tem visto o WildFly entrar no mercado em produção? Qual teu sentimento de segurança e estabilidade.
Como você sabe algumas pessoas recorreram ao EAP 6 justamente pelas várias correções que ele tinha sobre o AS 7.1.1.
Um grande abraço e que Deus continue te abençoando.
23 de março de 2014 às 14:17
Fala Mestre… suas sugestões são sempre bem vindas por aqui!
Em relaação ao balanceamento de carga para o Apache estava pensando em utilizar o Red Hat Cluster Suite mas ainda não decidi… essa será a parte 3. Na parte 2 agora pretendo deixar toda a parte JBoss + Cluster + Balanceamento e Métricas do JON pronta.. e depois ir melhorando.
Em relação ao WildFly em produção ainda acho um pouco cedo.. o ideal é esperar o primeiro release e então sim colocar em produção mas nada que possa impedir o desenvolvimento de aplicações para o Java EE 7 e quando sair o primeiro a release 8.1 colocar em prod.
O WildFly parece ser bem estável e seguro mas por enquando ainda estou realizando alguns testes vamos aguardar rs
Abraços
23 de março de 2014 às 21:53
[…] 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: […]