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:

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:
- Usando mod_jk 1.2.x
- 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.