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:
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 [...]
Genial! Gracias por tu aporte! Te quería consultar como puedo definir el numero de conexiones que puede adminitir/recibir jboss desde apache. Gracias de antemano.