Introducción
En esta serie de artículos, vamos a ver las diferentes formas que hay para definir una estructura de Apache Tomcat para su puesta en producción. Veremos cómo podemos configurar
Apache Tomcat con Apache HTTP mediante <mod_jk> y
cómo poner <squid-cache> como frontend haciendo de proxy reverso.
Como es
una serie y no un
unico post iremos viendo cómo montar la infraestructura, desde lo más básico, hasta -en las últimas entregas- cómo ponerlo en producción.
Instalar Apache Tomcat "Stand Alone"
Uno de los
problemas con los encontramos al montar Apache Tomcat, es que si no queremos ejecutarlo con
root debemos levantarlo en un puerto superior a 1024. Esto hace que tengamos que
utilizar ipfilter para realizar un
redirect, por ejemplo:
rdr ed0 0.0.0.0/0 port 80 -> 127.0.0.1 port 8080
De esta forma, hacemos que la peticiones a nuestro puerto http(80) sean
redireccionadas al puerto 8080 de
localhost.
Con este sencillo paso, hemos conseguido
publicar nuestro Apache Tomcat en el puerto http(80), sin embargo, esta configuración -así sola- no nos sirve de mucho, ya que principalmente no tenemos alta disponibilidad, balanceo, firewall, virtual hosts. Además, se incluye el
problema del contexto.
Contextos de Aplicaciones Web
El
contexto de una aplicación Web es -en casos generales- el nombre de la aplicación, por ejemplo, si tenemos la aplicación web llamada
HelloWorld.war, su contexto será <HelloWord>, es decir, la URL resultante será:
http://www.sfchildren.com/HelloWord/index.jsp
Así que tendremos tantos contextos como aplicaciones. Sin embargo, si tecleamos la URL
http://www.sfchildren.com/
Nuestro
tomcat utilizará una aplicación
expecífica llamada
ROOT -que en la instalación por defecto será el manager-
# ls -l $TOMCAT_HOME/webapps/ROOT
total 256
-rw-r--r-- 1 webrunner www 5866 may 14 2009 asf-logo-wide.gif
-rw-r--r-- 1 webrunner www 3376 may 14 2009 build.xml
-rw-r--r-- 1 webrunner www 21630 may 14 2009 favicon.ico
-rw-r--r-- 1 webrunner www 7777 may 14 2009 index.html
-rw-r--r-- 1 webrunner www 8307 may 14 2009 index.jsp
-rw-r--r-- 1 webrunner www 7317 may 14 2009 RELEASE-NOTES.txt
-rw-r--r-- 1 webrunner www 2324 may 14 2009 tomcat-power.gif
-rw-r--r-- 1 webrunner www 1934 may 14 2009 tomcat.gif
-rw-r--r-- 1 webrunner www 65643 may 14 2009 tomcat.svg
drwxr-xr-x 2 webrunner www 512 jun 16 2009 WEB-INF
Para evitar que nos muestre la página de administración de Tomcat, tenemos varias soluciones, vamos a ir viendo cada una de ellas.
Crear un <index.html> con un redirect a la página correcta
Por ejemplo, podemos crear una página <index.html> con un pequeño
script en JavaScript que nos
mande un 301 a la nueva dirección. Siguiendo con el ejemplo,
$ cd $TOMCAT_HOME/webapps/ROOT
$ vi index.html
<HTML>
<HEAD>
<META
HTTP-EQUIV="Refresh"
CONTENT="0; URL=http://www.sfchildren.com/HelloWord/index.jsp">
</HEAD>
<BODY>
</BODY>
</HTML>
:wq
Problemas de esta solución
Bueno, no hace falta decir que si tenemos varias aplicaciones en el mismo
tomcat sólo podremos hacer un
redirect a una de ellas, además de no tener soporte para VirtualHosts
Sustituir la aplicación <ROOT> por nuestra <HelloWord>
Ya hemos comentado antes que
tomcat tiene definida una
aplicación por defecto llamada <ROOT> la cual hace referencia a la aplicación
sin contexto, podemos por lo tanto, sustituir
esta por nuestra aplicación <HelloWord>, veamos un ejemplo -imaginamos que tenemos la aplicación HelloWorld.war en nuestro HOME-
$ cd $TOMCAT_HOME/webapps/ROOT
$ jar xvf $HOME/HelloWorld.war
$ ls -l
total 258
-rw-r--r-- 1 webrunner www 148 abr 14 11:35 index.html
drwxr-xr-x 2 webrunner www 512 jun 16 2009 WEB-INF
Qué hemos conseguido
Al hacer este cambio, hemos hecho que el
contexto <HelloWord> no sea necesario, y por lo tanto, nuestra URL ahora será la siguiente:
http://www.sfchildren.com/
Problemas de esta solución
Al igual que sucedía antes, seguimos necesitando
una instalación de tomcat por aplicación y por lo tanto, muchos sistemas a administrar. Además, no tenemos VirtualHosts ...
Creación de VirtualHosts en Tomcat6
Para solucionar estos problemas tenemos los
VirtualHost que -de forma sencilla- hacen una discriminación de la petición en función del valor de la cabecera HOST de cada petición
http, por lo tanto, lo que nosotros queremos es que las peticiones a:
- http://app1.sfchildren.com/ sean enviadas a HelloWorld1
- http://app2.sfchildren.com/ sean enviadas a HelloWorld2
La activación de los
virtualhost en Tomcat6 no requiere de grandes configuraciones, tan sólo es necesario modificar un par de archivos de configuración,
es muy importante que el tomcat esté detenido antes de comenzar
Lo primero que debemos hacer es
dar de alta los
hosts en el archivo de configuración del servidor <$TOMCAT_HOME/conf/server.xml> en el apartado de <Engine>. El formato del
tag es:
<Host name="_nombre_vhost_" appBase="_path_to_base_dir" />
En nuesto ejemplo, crearemos <app1> y <app2> como virtual hosts
$ vi $TOMCAT_HOME/conf/server.xml
...
<Host name="app1.sfchildren.com" appBase="vdomains/app1.sfchildren.com" />
<Host name="app2.sfchildren.com" appBase="vdomains/app2.sfchildren.com" />
...
:wq
A continuación crearemos el directorio
appBase con sus
subdominios
$ mkdir -p $TOMCAT_HOME/vdomains/app1.sfchildren.com
$ mkdir -p $TOMCAT_HOME/vdomains/app2.sfchildren.com
Y creamos las aplicación <ROOT> con nuestra
HelloWorld -como hemos visto antes-
$ mkdir $TOMCAT_HOME/vdomains/app1.sfchildren.com/ROOT
$ mkdir $TOMCAT_HOME/vdomains/app2.sfchildren.com/ROOT
$ cd $TOMCAT_HOME/vdomains/app1.sfchildren.com/ROOT
$ jar xvf $HOME/HelloWorld1.war
$ cd ../app2.sfchildren.com/ROOT
$ jar xvf $HOME/HelloWorld2.war
A continuación, levantaremos el
tomcat con
svc y con un navegador nos pondremos en cada una de las diferentes URL para ver cómo vamos a una u otra.
Un concepto muy importante a tener en cuenta es el uso de
resources dentro de los
contextos de aplicaciones, es decir, el acceso mediante JNDI a un
DataSource. Para que el procedimiento de
virtualhost de tomcat no nos
amargue la vida con problemas, deberemos
pedir que los aplicativos (war) tengan definido su
context.xml dentro de la carpeta <WebAPP/META-INF/>, esto nos hará los despliegues en
virtualhost mucho más sencillos
$ ls -l $TOMCAT_HOME/vdomains/app1.sfchildren.com/ROOT/META-INF/
total 4
-rw-r--r-- 1 webrunner www 536 feb 28 22:51 context.xml
-rw-r--r-- 1 webrunner www 102 abr 13 00:02 MANIFEST.MF
Problemas de esta Solución
Claro, no todo puede ser
tan bonito. Hemos solucionado el problema del
contexto y de tener varias aplicaciones web sobre el mismo servidor Tomcat, sin embargo, tenemos algunas carencias que no podemos cubir: Balanceo de Carga -Alta disponibilidad-, URL Rewrite, Firewall L7
Conclusiones
En esta primera parte de Puesta en producción de
Apache Tomcat, hemos visto cómo podemos utilizar los VirtualHosts para solucionar los problemas a múltiples aplicaciones dentro del mismo
tomcat. Sin embargo, sólo con
apache tomcat no podemos ofrecer las soluciones a todos los problemas que se nos presentan -alta disponibilidad, URL rewrite-.
En la próxima entrega veremos cómo incluir
Apache HTTPD con su módulo <mod_jk> el cual nos permitirá
conectarnos a tomcat y realizar tareas de balanceo, standby, ... hasta entonces, esperar
Referencias