Aunque tengo bastante experiencia en servidores de aplicaciones (Weblogic sobretodo y Apache Tomcat), este es la primera entrada que voy a hacer sobre esto.
La versión 7 de JBoss podemos decir que es impresionante (http://www.jboss.org/jbossas), respecto a la versión 6. Todo está mucho más organizado y permite la creación de dominios y grupos de servidores donde desplegar/mantener de forma centralizada las aplicaciones.
En este caso vamos a montar un dominio en JBoss 7, preparado para alta disponiblidad y replicación de sesiones (más adelante configuraremos un balanceador para probar todo esto).
La documentación oficial se encuentra en:
https://docs.jboss.org/author/display/AS71/Documentation
Aunque la verdad es que no explica demasiado bien (o yo no he sabido comprenderla) como configurar un dominio.
Antes de comenzar algunos conceptos sobre los procesos implicados en un dominio:
- Host Controller, este proceso se encarga de gestionar el dominio (en caso de ser la máquina controladora del dominio), o conectarse al controlador del dominio (resto de máquinas). Uno por máquina,
- Process Controller, encargado de arrancar y parar procesos de servidor a petición del Host Controller. Uno por máquina.
- Server:server_name, uno proceso por cada uno de los servidores arrancados en la máquina.
Vamos a configurar un dominio que se llamará «ha-server-group» con 2 servidores en la misma máquina con nombres: node1 y node2.
Gŕaficamente:
Para crear esto se ha usado CentOs 6 x32, aunque la instalación se puede hacer sobre cualquier sistema operativo.
Pasos a seguir (la IP de la máquina es 192.168.128.220):
1- Creamos entorno (usuario directorio, etc…):
[root@clu01 ~]# useradd -m jboss
[root@clu01 ~]# passwd jboss
Changing password for user jboss.
New UNIX password:
BAD PASSWORD: it is too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@clu01 ~]# mkdir /vol
[root@clu01 ~]# chown jboss: /vol/ -R
[root@clu01 ~]# su - jboss
[jboss@clu01 ~]$ cd /vol
2-Descargamos el software necesario en /vol:
Java JDK 7: http://www.oracle.com/technetwork/java/javase/downloads/jdk7u7-downloads-1836413.html
JBoss 7.1.1.final: http://www.jboss.org/jbossas/downloads
3- Descomprimimos y configuramos variables de entorno:
[jboss@clu01 vol]$ pwd
/vol
[jboss@clu01 vol]$ tar xfz jdk-7u7-linux-i586.tar.gz
[jboss@clu01 vol]$ tar xfz jboss-as-7.1.1.Final.tar.gz
Añadimos al .bash_profile:
export JAVA_HOME=/vol/jdk1.7.0_07
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
4- Definimos grupo para el dominio, editamos el fichero (por JBOSS_HOME se entiende /vol/jboss-as-7.1.1.Final) :
<JBOSS_HOME>/domain/configuration/domain.xml
Añadir el grupo (al final del archivo):
<server-groups>
<server-group name="ha-server-group" profile="ha">
<jvm name="default">
<heap size="64m" max-size="512m"/>
</jvm>
<socket-binding-group ref="ha-sockets"/>
</server-group>
</server-groups>
Si hay más grupos los eliminamos (que los habrá porque vienen preconfigurados), no los necesitamos para nada.
5- Definir el host, como domain controller, los servidores y los interfaces añadiéndolos en el grupo, editar el fichero:
<JBOSS_HOME>/domain/configuration/host.xml
Nombre host en (principio archivo):
<?xml version='1.0' encoding='UTF-8'?>
<host name="host1-controller" xmlns="urn:jboss:domain:1.2">
Definir como domain controller (esto es por defecto en la configuración pero mejor asegurar), tiene que buscar el domain controller en local:
<domain-controller>
<local/>
<!-- Alternative remote domain controller configuration with a host and port -->
<!-- <remote host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9999}"/> -->
</domain-controller>
Definir interfaces de escucha (la IP de la máquina si queremos acceder desde fuera de ella):
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:192.168.128.220}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:192.168.128.220}"/>
</interface>
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:192.168.128.220}"/>
</interface>
</interfaces>
Creamos 2 servidores (node1 y node2 en el grupo ha-server-group):
<servers>
<server name="node1" group="ha-server-group" auto-start="true">
<socket-bindings port-offset="100"/>
</server>
<server name="node2" group="ha-server-group" auto-start="true">
<socket-bindings port-offset="200"/>
</server>
</servers>
Atención al detalle del parámetro port-offset, muy útil para desplazar todos los puertos de un servidor mediante un solo parámetro.
Eliminar el resto de los servidores porque son de ejemplo.
6- Creación de usuario/password de administración para acceder a la consola:
[jboss@clu01 bin]$ pwd
/vol/jboss-as-7.1.1.Final/bin
[jboss@clu01 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) :
Username : admin
Password :
Re-enter Password :
The username 'admin' is easy to guess
Are you sure you want to add user 'admin' yes/no? yes
About to add user 'admin' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'admin' to file '/vol/jboss-as-7.1.1.Final/standalone/configuration/mgmt-users.properties'
Added user 'admin' to file '/vol/jboss-as-7.1.1.Final/domain/configuration/mgmt-users.properties'
7- Arrancamos el dominio, que arrancará los 2 servidores al mismo tiempo:
[jboss@clu01 bin]$ pwd
/vol/jboss-as-7.1.1.Final/bin
[jboss@clu01 bin]$ ./domain.sh
Esto generará una salida donde podemos ver el estado del arranque, si cerramos la consola se cierra el servidor, habrá que crear un script de arranque si esto va a ponerse en producción.
8 – Accedemos a la consola (con el usuario y contraseña que hemos creado):
http://192.168.128.220:9990
En la consola ya deberíamos ver los dos servidores.
Y desplegamos la aplicación de ejemplo ClusterWebApp.
Ya podemos desplegar en el grupo creado la aplicación ClusterWebApp.war (botón «Add to groups»), y podemos testear que funciona, si accedemos a:
http://192.168.128.220:8180/ClusterWebApp/
http://192.168.128.220:8280/ClusterWebApp/
Con esto hemos terminado. En la siguiente entrada crearemos un nuevo nodo en una máquina adicional, gestionada por el mismo controlador de dominio.
Pingback: Ampliación Dominio JBoss 7 (nuevo servidor en máquina externa al controlador) « Administrando sistemas
excelente blog lo que necesito es si me puedes ayudar como crear datasources para oracle
Bueno lo que tenemos que hacer es instalar el driver como módulo.
Si la instalación se ha hecho en $JBOSS_HOME, los pasos son:
1-Crear los directorios:
mkdir -p $JBOSS_HOME/modules/com/oracle/main
2-Copiar el driver jdbc de Oracle en $JBOSS_HOME/modules/com/oracle/main, supongamos que usamos ojdbc6.jar (la última versión)
3-Creamos un fichero de descriptor $JBOSS_HOME/modules/com/oracle/main/module.xml, con el contenido:
4-Reiniciamos JBoss
5-Desde la consola de administración ya podemos crear un datasource Oracle, en el profile que queramos.
Espero que te sea de utilidad.
Muy bien explicado y gran aporte. Pero no he conseguido entender que configuración he de dar al nodo1 y al nodo2. Ya que siguiendo los pasos escrupulosamente, no me funciona.
Realmente la configuración es muy sencilla.
Yo verificaría en el fichero $JBOSS_HOME/domain/configuration/domain.xml;
1-La existencia del grupo:
Y en el fichero $JBOSS_HOME/domain/configuration/host.xml:
1-La entrada en host:
2-La definición de interfaces:
Sustituyendo la IP por la de tu máquina.
3-Creamos los servers
Luego queda el detalle de la creación del usuario y poco más.
Si me das alguna pista más quizás pueda ayudarte.
Lo acabo de comprobar y esta todo correcto, el problema es que los nodos no se inician, cuando doy la orden de «Start» de alguno de los dos nodos, jboss responde «Your request timed out.»
Has visto más detalles en los logs?
El log de cada uno de los nodos debería estar en:
$JBOSS_HOME/domain/servers/node1/log
$JBOSS_HOME/domain/servers/node2/log
Y el del dominio en:
$JBOSS_HOME/domain/log
Seguro que se puede obtener más información, es posible que simplemente los puertos estén en uso.
Hola juan, a mi también se me presenta la misma situación te anexo el mensaje que me genera el log.
[usuario@localhost log]$ cat boot.log
11:49:03,571 INFO [org.jboss.modules] (main) JBoss Modules version 1.1.1.GA
11:49:04,930 INFO [org.jboss.msc] (main) JBoss MSC version 1.0.2.GA
11:49:05,194 INFO [org.jboss.as] (MSC service thread 1-4) JBAS015899: JBoss AS 7.1.1.Final «Brontes» starting
11:49:25,523 INFO [org.xnio] (MSC service thread 1-1) XNIO Version 3.0.3.GA
11:49:25,582 INFO [org.xnio.nio] (MSC service thread 1-1) XNIO NIO Implementation Version 3.0.3.GA
11:49:25,631 INFO [org.jboss.remoting] (MSC service thread 1-1) JBoss Remoting version 3.2.3.GA
11:49:42,434 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-4) MSC00001: Failed to start service jboss.host.controller.client: org.jboss.msc.service.StartException in service jboss.host.controller.client: java.net.ConnectException: JBAS012144: Could not connect to remote://192.168.0.118:9999. The connection timed out
at org.jboss.as.server.mgmt.domain.HostControllerServerClient.start(HostControllerServerClient.java:161) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_60]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_60]
at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_60]
Caused by: java.net.ConnectException: JBAS012144: Could not connect to remote://192.168.0.118:9999. The connection timed out
at org.jboss.as.protocol.ProtocolChannelClient.connectSync(ProtocolChannelClient.java:155) [jboss-as-protocol-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.mgmt.domain.HostControllerServerConnection.openChannel(HostControllerServerConnection.java:158) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.mgmt.domain.HostControllerServerConnection.connect(HostControllerServerConnection.java:86) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
at org.jboss.as.server.mgmt.domain.HostControllerServerClient.start(HostControllerServerClient.java:135) [jboss-as-server-7.1.1.Final.jar:7.1.1.Final]
… 5 more
Si nos puedes ayudar te agradeceria
Parece que no puede conectar a 192.168.0.118:9999 (algo evidente :)), puedes hacer ifconfig y pasarme la configuración de los 2 nodos de JBoss a ver que puede estar ocurriendo?
Buenos días.
Me pueden decir por favor a que se debe este ERROR ?
[jboss@centos bin]$ ./domain.sh
[Host Controller] 11:34:46,014 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] 11:34:46,108 INFO [org.jboss.as] (MSC service thread 1-2) JBAS015950: JBoss AS 7.1.1.Final «Brontes» stopped in 43ms
11:34:46,445 INFO [org.jboss.as.process.Host Controller.status] (reaper for Host Controller) JBAS012010: Process ‘Host Controller’ finished with an exit status of 99
11:34:46,453 INFO [org.jboss.as.process] (Thread-8) JBAS012016: Shutting down process controller
11:34:46,454 INFO [org.jboss.as.process] (Thread-8) JBAS012015: All processes finished; exiting
Gracias de antemano
Saludos
Hola:
La verdad es que no hay información suficiente en lo que has pegado, si adjuntas más lineas de log quizá podamos avanzar algo.
Un saludo.
Hola Juan y gracias por reponder…
Sigo con el mismo problema
[Host Controller] 20:27:00,310 FATAL [org.jboss.as.host.controller] (Controller Boot Thread) JBAS01 0933: Host Controller boot has failed in an unrecoverable manner; exiting. See previous messages fo r details.
La arquitectura de mi servidor es
CentOS7 64 bIT
[jboss@centos8 vol]$ arch
x86_64
Los paquetes que descargue son estos
-rw-r–r–. 1 jboss jboss 132775715 oct 26 23:36 jboss-as-7.1.1.Final.tar.gz
-rw-r–r–. 1 jboss jboss 181260798 oct 26 23:34 jdk-8u65-linux-x64.gz
Si gustas te puedo pasar los archivos de configuracion que se movio..?
Saludos cordiales
Maestro buenos días..
Me puedes mandar tus archivos de configuración por favor de acuerdo a la conf del manual que indicas…?
Quiero ver donde me esta faltando poner algo….
Gracias de antemano…
Saludos cordiales
Hola.
Tengo un jboss7 vulnerable a atques DDOS. Las conexiones vienen desde un frontal de forma que siempre es la misma IP origen.. ¿que puedo modificar para que no caiga el servicio frente a dos?
Hola, este tipo de cosas es mejor pararlas lo antes posible. Antes de JBoss (y cualquier otro servidor de aplicaciones), es muy recomendable tener una Apache que filter este tipo de cosas, en los las entradas de abajo se explican un par de técnicas:
https://juancarlosmolinos.net/linux/impedir-ataques-denagacion-de-servicio-dos-denial-of-service-en-linux/
https://juancarlosmolinos.net/linux/iptables-ddos-configurar-recent-impedir-ataques-denegacion-de-servicio-dos-denial-of-service-en-linux-match-extension-recent/
Buenas tardes
Me gustaría recibir vuestra ayuda, os expongo mi problema.
Tengo dos servidores redhat cada uno de ellos tiene instalado wildfly 11, indicar que tengo los firewall y las iptables desactivadas ya que se trata de un entrono de pruebas. He configurado uno de los servidores como maestro y el otro como esclavo, el esclavo conecta correctamente con el maestro según veo en los logs.
En el servidor maestro he configurado apache con mod_cluster para balancear la carga entre los dos servidores (Maestro y esclavo).
He procedido a desplegar una aplicación concretamente clusterjsp, esta tiene la opción en en su código. Compruebo que el balanceo funciona perfectamente, lo único que no consigo es que me mantenga la sesión, por mas que he mirado por foros no consigo que la sesión se replique entre ambos servidores. Si paro un servidor wildfly apache me pasa al otro pero se pierde la sessión.
Por favor, cualquier ayuda seria muy agradecida.
Muchas gracias por todo
Un saludo
Para que la replicación de sesión sea posible es necesario aplicar el profile adecuado al grupo de servidores, que profile estás utilizando? debería ser HA o Full HA.
Buenos días
Muchas gracias por la respuesta. Conseguí solventar el problema siguiendo los pasos de esta web.
https://loveyourlinux.com/
Donde configuran los puerto 8180 y 8280 ????
http://192.168.128.220:8180/ClusterWebApp/
http://192.168.128.220:8280/ClusterWebApp/
Realmente se configura un offset del tipo:
Este offset es sumando al puerto 8080.