Configurar Apache como Frontend de JBoss

En esta entrada vamos a ver como configurar un servidor web Apache delante de un servidor de aplicaciones JBoss. Comenzaremos con las instalaciones de Apache y JBoss y después realizaremos la instalación del módulo mod_jk en Apache para crear el conector entre ambos. Finalmente configuraremos ambos servidores para interactuar juntos. En esta entrada el servidor web Apache y el servidor de aplicaciones JBoss se encuentran en el mismo host.

El objetivo de configurar un Apache delante de un servidor de aplicaciones, ya sea Tomcat, JBoss o Glassfish es disponer de una capa que ofrezca un mejor rendimiento para servir contenido estático (Apache > JBoss, Tomcat…) y además poder añadir otras funcionalidades en las que Apache les supera claramente, reescritura de URLs, virtualhosting, medidas de seguridad, balanceo de carga, etc.

Instalación de Apache Web Server

Podemos instalar Apache compilando manualmente o a través de los repositorios oficiales de cada distribución. Si os interesa la compilación manual revisar el post que acabo de enlazar, en caso contrario:

Instalación en CentOS, RHEL, Fedora

# # yum install httpd

Instalación en Debian, Ubuntu

# apt-get install apache2

Instalación de JBoss

Hace unos días hice un artículo en el que explicaba el paso a paso de la instalación de JBOss, echadle un vistazo:

Cómo instalar JBoss

Instalación de mod_jk

mod_jk es un un módulo de Apache que permite conectar el servidor web Apache con los servidores de aplicaciones JBoss, Tomcat, iPlanet Web Server, etc.

Al igual que con Apache, el módulo mod_jk puede ser instalado por repositorio o compilandolo manualmente. El problema de instalarlo por repositorio es (que yo sepa) que no se incluye en los repositorios oficiales y tienes que buscarte la vida para instalarlo, verificar el repo, bajar el RPM, etc. Así que en este caso no nos vamos a complicar, y como la instalación compilando es sencilla nos decantamos por este paso.

Para compilad mod_jk debemos asegurarnos de que tenemos instalados en el sistema tanto l os compiladores gcc y gcc-c++ como el paquete devel de apache (httpd-devel), este último contiene los binarios APXS y otros archivos necesarios para poder compilar DSOs (Dynamic Shared Objects) en Apache, es decir, módulos cargados dinámicamente.

Así pues, instalamos los compiladores y httpd-devel, en el caso de Red Hat, CentOS y Fedora:

# yum install httpd-devel gcc gcc-c++

Nota: si trabajáis en una instalación minimal o base os saldrán muchas dependencias, es completamente normal::

Installing:
gcc i686 4.4.7-4.el6 base
gcc-c++ i686 4.4.7-4.el6
httpd-devel i686 2.2.15-31.el6.centos
Installing for dependencies:
apr-devel i686 1.3.9-5.el6_2
apr-util-devel i686 1.3.9-3.el6_0.1
cloog-ppl i686 0.15.7-1.2.el6
cpp i686 4.4.7-4.el6
cyrus-sasl-devel i686 2.1.23-13.el6_3.1
db4-cxx i686 4.7.25-18.el6_4
db4-devel i686 4.7.25-18.el6_4
expat-devel i686 2.0.1-11.el6_2
glibc-devel i686 2.12-1.132.el6_5.4
glibc-headers i686 2.12-1.132.el6_5.4
kernel-headers i686 2.6.32-431.29.2.el6
libgomp i686 4.4.7-4.el6
libstdc++-devel i686 4.4.7-4.el6
mpfr i686 2.4.1-6.el6
openldap-devel i686 2.4.23-34.el6_5.1
ppl i686 0.10.2-11.el6
Updating for dependencies:
db4-utils i686 4.7.25-18.el6_4
glibc i686 2.12-1.132.el6_5.4
glibc-common i686 2.12-1.132.el6_5.4
libgcc i686 4.4.7-4.el6
libstdc++ i686 4.4.7-4.el6
openldap i686 2.4.23-

En el caso de Debian y Ubuntu:

# apt-get install build-essential apache2-threaded-dev

El paquete de Apache es si se usa en modo threaded, si se usa con prefork Multi-Processing Module (MPM):

# apt-get install build-essential apache2-prefork-dev

Y una vez que tenemos los requisitos y dependencias, pasamos a la compilación de mod_jk:

# cd /var/tmp
# wget http://apache.rediris.es//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.40-src.tar.gz
# tar -xzvf tomcat-connectors-1.2.40-src.tar.gz
# cd tomcat-connectors-1.2.40-src
# cd native
# whereis apxs
apxs: /usr/sbin/apxs /usr/share/man/man8/apxs.8.gz
# ./configure --with-apxs=/usr/sbin/apxs
# make
# make install

Como veis es todo bastante sencillo, antes de compilar he realizado una búsqueda del path del binario apxs ya que es necesario para compilar. Después, simplemente compilamos. En una instalación estandar es suficiente con aplicar estos parámetros de compilación. En caso de haber modificado la configuración de Apache deberemos ajustar la compilación a nuestra instalación, por ejemplo cuando tenemos una ruta base de apache distinta a la estándar. En la ayuda del configure tenéis todos los parámetros disponibles.

# ./configure --help

Una vez que hemos terminado de compilar, nos indicará la ruta en la que se ha instalado el módulo y nos instará a comenzar la configuración de Apache (httpd.conf):

----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/httpd/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 755 /usr/lib/httpd/modules/mod_jk.so

Please be sure to arrange /etc/httpd/conf/httpd.conf...

Efectivamente, el módulo ya está instalado y con los permisos correctos:

# ls -l /usr/lib/httpd/modules/mod_jk.so
-rwxr-xr-x 1 root root 952005 Sep 20 23:51 /usr/lib/httpd/modules/mod_jk.so

Configuración de mod_jk en Apache

Vamos a añadir un nuevo archivo de configuración en Apache en el cual establecemos todas las directivas de mod_jk, lo hacemos dentro del directorio conf.d del base de Apache (/etc/httpd/conf.d/mod_jk.conf):

# vi /etc/httpd/conf.d/mod_jk.conf
# Carga del modulo mod_jk
LoadModule jk_module modules/mod_jk.so                    

# Archivo con todas las propiedades del worker: tipo, 
# puerto y conexion de JBoss...
JKWorkersFile conf.d/workers.properties

# Logs
JkShmFile /var/log/httpd/mod_jk.shm
JkLogFile /var/log/httpd/mod_jk.log
JkLogLevel debug

# Mapeos contra JBoss
# Podriamos ponerlos por virtualhost si tenemos varios dominios
JkMount /jboss* jboss_worker
JkMount /*.jsp jboss_worker

Como podéis observar, he configurado el logging en modo debug, esto nos vendrá bien al principio para detectar cualquier problema que pueda ir surgiendo. Por lo demás, he cargado el módulo, he enlazado al archivo de configuración que vemos a continuación y he definido el mapeo que establece que cuando en la URL se ponga SERVIDOR/jboss se redirija a JBoss y otro ejemplo en el que se redirijen todos los jsp.
Creamos el archivo workers.properties con toda la configuración del conector/worker ajp13:

# vi /etc/httpd/conf.d/workers.properties
# Nombre del worker
worker.list=jboss_worker

# Propiedades
worker.jboss_worker.type=ajp13
worker.jboss_worker.host=127.0.0.1
worker.jboss_worker.port=8009

Configuración en JBoss

Si habéis seguido la guía de instalación de JBoss que enlacé anteriormente, simplemente tendréis que utilizar un archivo de configuración “standalone.xml” diferente. Concretamente en lugar del estándar hay que utilizar el “standalone-ha.xml”, pues ya tiene configurado el conector AJP13:

# grep 'AJP' *
standalone-ha.xml: <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
# grep '8009' standalone-ha*
<socket-binding name="ajp" port="8009"/>

En caso de haber modificado el archivo de configuración standalone.xml, simplemente aplicad los cambios en el nuevo o viceversa.

Cuando reiniciemos JBoss veremos que ya está escuchando en el puerto TCP 8009:

# netstat -nat | grep 8009
tcp        0      0 127.0.0.1:8009              0.0.0.0:*                   LISTEN

Con esto ya debería estar todo, reiniciamos Apache y JBoss si es necesario y verificamos accediendo por URL a nuestro dominio:

# /etc/init.d/httpd configtest
# /etc/init.d/httpd restart
# /etc/init.d/jboss restart
http://dominio/jboss
http://dominio/*.jsp
[...]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *