Archive for Mayo, 2009

Apache y JBOSS AS (puerto 80)

Posted on Mayo 8th, 2009 in Java | 1 Comment »

Para seguir con los ejemplos de clusterización nos vamos a centrar en el uso de un cluster en un entorno web para poder crear la siguiente arquitectura:

clustering-web

Esta estructura es interesante cuando nos queremos tener en un entorno web múltiples instancias de JBOSS sobre la misma url (http://www.duroty.com). En la figura se observa que todas las peticiones de los usuarios de internet son procesadas por Apache y este las distribuye sobre los servidores de aplicaciones que a su vez se encargan de ejecutar la lógica de negocio de la aplicación y devuelven (o no) las respuesta adecuada. Esta arquitectura es una de las más utilizadas y existen buenos tutoriales en red que permiten parametrizar muchos detalles (http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/Server_Configuration_Guide/index.html)

Descargar Apache 2.2

Para seguir con el montaje necesitamos un servidor Apache 2.2, una vez descargado vamos a suponer que está en el path /etc/httpd/….

Existen dos maneras de montar el proxy apache sobre cada servidor de aplicaciones del cluster:

  1. Usando mod_jk 1.2.x
  2. Usando mod_proxy con JBoss bundle y Apache2.2.x

Configurar mod_proxy en httpd.conf

Por la sencillez, robustez y estabilidad vamos a escoger la opción 2. Y empezamos habilitando el módulo correspondiente en la configuración del apache, para ello:

> vi /etc/httpd/conf/httpd.conf

Y descomentar las siguientes líneas en el apartado “Dynamic Shared OBject (DSO) Support”

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_http_module modules/mod_proxy_http.so

Con esto es suficiente para cargar el balanceador http en el apache.

Es siguiente paso es registrar nuestro cluster de dos nodos en el apache editando:

> vi /etc/httpd/conf/httpd.conf

y pegando el siguiente código al final del fichero (recordar las configuraciones de red de los servidores de aplicaciones):

##### balancer://jbosscluster es el nombre del balanceador apache sobre nuestro cluster node1 y node2
<Proxy balancer://jbosscluster>
# cluster member 1
BalancerMember http://10.0.0.1:8080 route=node1
# cluster member 2
BalancerMember http://10.0.0.2:8080 route=node2
ProxySet stickysession=JSESSIONID|jsessionid
ProxySet lbmethod=byrequests
ProxySet nofailover=Off
</Proxy>

<Location /balancer-manager>
SetHandler balancer-manager
Order deny,allow

Deny from all
## Introducir las IPs permitidas separadas por espacios para monitorizar el balanceador.
Allow from 127.0.0.1
</Location>

En la documentación oficial de apache se puede encontrar la definición de todos los parametros que acepta el balanceador (Apache Module mod_proxy)

Destacar que para tener una buena arquitectura WEB es importante que los servidores de aplicaciones NO presenten una dirección IP pública. Como se refleja en el dibujo del inicio de este post los servidores de aplicaciones sólo son visibles por el servidor web a través de un firewall. El elemento publicado a internet será Apache.

Un parámetro importante en el balanceo a través de apache es la sesión de usuario, para esto se utiliza ProxySet stickysession=JSESSIONID|jsessionid, que veremos en más detalle en los próximos puntos. 

Habilitar un virtual host (no publicar aplicaciones en el context-root)

Por defecto el servidor de aplicaciones JBOSS presenta diferentes aplicaciones web para configuración, monitoreo, servicios, etc. con lo que tenemos que asegurarnos de no clusterizar/balancear estos servicios. Para ello vamos a crear un virtual-host en apache sobre el dominio donde montemos nuestra aplicación web.

Nuestra aplicación de ejemplo se publicará bajo el dominio www.duroty.com, escogemos como contexto de aplicación un nombre que no esté reservado por el servidor de aplicaciones, por ejemplo durotyWeb.

Con los nombres anteriores y sin un apache y sin un cluster el acceso a la aplicación sería con:

http://www.duroty.com:8080/durotyWeb/

En el caso de nuestro cluster será:

http://10.0.0.1:8080/durotyWeb/

http://10.0.0.2:8080/durotyWeb/

Normalmente el contexto de aplicación (/durotyWeb) no es muy atractivo para que aparezca en nuestras URLs (sobre todo con la que está cayendo en temas de SEO). Lo que nos interesa es poder publicar la aplicación en context-root y para esto lo que haremos es crear un virtual-host en apache.

Voy a suponer que tenemos bien organizada la configuración del apache y que los virtual-host los tenemos en:

> /etc/htttpd/cond.f/[VIRTUAL-HOST]

Voy a crear el virtual-host para www.duroty.com:

> vi /etc/htttpd/cond.f/www_duroty_com.conf

## La ip pública del apache es 66.249.66.1

<VirtualHost 66.249.66.1:80>
ServerName www.duroty.com
ServerAdmin admin@test.com
DocumentRoot /htdocs/www-duroty-com

ErrorLog logs/www-duroty-com-error_log
CustomLog logs/www-duroty-com-access_log combined

ProxyPreserveHost On
## Paths que no quiero enviar a los servidores de aplicaciones, como por ejemplo contenidor estático js, css, img…
ProxyPass /static !
##
ProxyPass / balancer://jbosscluster/durotyWeb/
## Proxy pass reverse sobre node1
ProxyPassReverse /durotyWeb http://10.0.0.1:8080
## Proxy pass reverse sobre node2
ProxyPassReverse /durotyWeb http://10.0.0.2:8080

<Directory  “/htdocs/www-duroty-com”>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Con la configuración anterior voy a conseguir los siguiente:

http://www.duroty.com/static/* >> el apache se encarga de servir todo el contenido de /htdocs/www-duroty-com/static/*

http://www.duroty.com/* se passa a http://10.0.0.[1/2]:8080/durotyWeb/*

Con lo que ya somos capaces de balancear las peticiones http sobre dos nodos JBOSS

Aún no está completada la configuración final del cluster, ya que para aplicaciones que necesiten mantener la sesión de usuario entre los nodos hay que parametrizar los servidores de aplicaciones y más. Pero esto lo dejo para el siguiente post.

VN:F [1.0.9_379]
Rating: 5.0/5 (5 votes cast)

Instalación de un Cluster JBOSS AS

Posted on Mayo 6th, 2009 in jboss | No Comments »

En este post vamos a montar un cluster JBOSS de dos nodos sobre dos máquinas diferentes (IPs diferentes) pero con el mismo path de instalación del JBOSS. Vamos a llamar a las máquinas node1 y node2

Recordamos del post anterior que tenemos que arrancar el servidor de aplicaciones sobre una IP:

> /opt/jboss/bin/run.sh -c all -b 10.0.0.1

Suponemos que el node1 tiene IP = 10.0.0.1 y que el node2 tiene la IP 10.0.0.2. Con lo que el arranque del nodo2 será

> /opt/jboss/bin/run.sh -c all -b 10.0.0.2

Si ejecutamos los comandos anteriores en las máquinas correspondientes aún NO tenemos el cluster en funcionamiento.  Para habilitarlo seguimos los siguientes pasos para la instalación:

  1. Debemos asegurarnos que las dos máquinas se ven entre si (indispensable para la comunicación del cluster)
  2. JBOSS utiliza JGroups (visto en el post anterior) para la comunicación para la comunicación entre las máquinas y se puede realizar a través de UDP o TCP. El modo de comunicación se puede modificar en /opt/jboss/server/all/deploy/cluster-service.xml, y debemos especificar una grupo para evitar acoplamiento.
  3. Para que nuestro cluster no se acople con otros miembros de la red (en el caso de que existan) debemos dar un nombre

Finalmente los comandos de arranque para los nodos del cluster son:

> /opt/jboss/bin/run.sh -c all -b 10.0.0.1 -Djboss.partition.name=TestCluster -Djboss.partition.udpGroup=230.10.0.1

> /opt/jboss/bin/run.sh -c all -b 10.0.0.2 -Djboss.partition.name=TestCluster -Djboss.partition.udpGroup=230.10.0.1

Donde -Djboss.partition.name fija el nombre del cluster y -Djboss.partition.udpGroup fija el grupo UDP en el caso de escojer el modo de comunicación de red UDP. Si se escoje el modo TCP este segundo parámetro de configuración no es necesario. En los siguientes ejemplos de este blog se utiliza UDP por su mejor rendimiento.

Para comprovar que los dos nodos estan arrancados:

http://10.0.0.1:8080

http://10.0.0.2:8080

Para parar los servidores de aplicaciones:

> /opt/jboss/bin/shutdown.sh -s 10.0.0.1 -S (en el node1)

> /opt/jboss/bin/shutdown.sh -s 10.0.0.2 -S (en el node2)

VN:F [1.0.9_379]
Rating: 3.3/5 (3 votes cast)

Configuración de un JBOSS – single node

Posted on Mayo 6th, 2009 in J2EE, jboss | 2 Comments »

Configuración “all” en JBOSS (modalidad cluster)

En el post anterior se ha visto como arrancar y parar un servidor de aplicaciones JBOSS.

> /opt/jboss/bin/run.sh -c default

> /opt/jboss/bin/shutdown.sh -S

Para aproximarnos a un entorno real hay que añadir otros parámetros en el comando de arrancada. Además en este post se utiliza la configuración all para preparar un entorno clusterizable.

Para ver los posibles valores de arranca del servidor de aplicaciones podemos ejecutar los siguiente:

> /opt/jboss/bin/run.sh –help

Que devuelve las posibles opciones de arranque:

options:
-h, –help                    Show this help message
-V, –version                 Show version information
-D<name>[=<value>]            Set a system property
-d, –bootdir=<dir>           Set the boot patch directory; Must be absolute or url
-p, –patchdir=<dir>          Set the patch directory; Must be absolute or url
-n, –netboot=<url>           Boot from net with the given url as base
-c, –configuration=<name> Set the server configuration name
-B, –bootlib=<filename>      Add an extra library to the front bootclasspath
-L, –library=<filename>      Add an extra library to the loaders classpath
-C, –classpath=<url>         Add an extra url to the loaders classpath
-P, –properties=<url>        Load system properties from the given url
-b, –host=<host or ip> Bind address for all JBoss services
-g, –partition=<name> HA Partition name (default=DefaultDomain)
-u, –udp=<ip> UDP multicast address
-l, –log=<log4j|jdk>         Specify the logger plugin type

Como el propósito del ejemplo es montar un cluster empezamos utilizando la configuración all (que permite arrancar el servidor de aplicaciones en modo cluster, arrancar los web services, HA-JNDI, y otros).

Para arrancar el servidor de aplicaciones con las funcionalidades de cluster:

> /opt/jboss/bin/run.sh -c all

-b <host or ip>, –host=<host or ip>

Este parámetro es importante tenerlo en cuenta pues cambia dos propiedades del sistema jboss.bind.address y bind.address. JGroups -estos parámetros sobreescriben los por defecto en la configuración xml del propio servidor-

jboss.bind.address: indica la dirección donde los servicios Tomcat, jrmp/pooled invokers services,…etc escucharán.

bind.address. JGroups: utilizada para indicar a JGroups (JGroups is a toolkit for reliable multicast communication.) con que IP se hace el bind del cluster.

Se puede fijar a 0.0.0.0 como dirección IP para bindar a todas las direcciones. Existe más información en http://www.jboss.org/community/docs/DOC-9730

Para nuestro ejemplo utilizamos la ip 10.0.0.1 para levantar los servicios:

> /opt/jboss/bin/run.sh -c all -b 10.0.0.1

Finalmente podemos probar en el navegador si el arranque ha sido correcto con http://10.0.0.1:8080

Para parar el servidor de aplicaciones hay que indicar en que dirección IP está arrancado con el parametro -s y utilizar -S para indicar el shutdown:

> /opt/jboss/bin/shutdown.sh -s 10.0.0.1 -S

VN:F [1.0.9_379]
Rating: 4.0/5 (1 vote cast)