sábado, octubre 20, 2012

Tomcat, una instalación, varias instancias

Existen varias razones por las que se querría tener una única instalación de Tomcat y varias instancias.

Una de ellas puede ser simplemente por higiene... Tener separados los archivos de la distribución de los propios de las Webs que alojan permiten unas actualizaciones mucho más rápidas y sobre todo, seguras.

Otra ventaja es que que puede alojar distintos sitios de forma independiente, esto es, que pueden pararse y arrancarse instancias sin que el resto de sitios alojados sufra esos parones. O también mantener distintas configuraciones para esos mismos sitios.

Pero la que más me gusta a mi, es la de tener la posibilidad de tener a un equipo de desarrollo compartiendo una misma distribución de Tomcat, usando cada miembro del equipo una instancia distinta.

Sea cual sea el motivo, creo que es una muy buena idea tener separada la distribución de Tomcat de sus aplicaciones desplegadas. Veamos cómo hacerlo.

Durante el uso de Tomcat, el servidor lee la configuración de dos directorios (conf y webapp) y escribe archivos en otros tres (log, temp y work). Además puede cargar algunos ficheros .jar y .class de otros directorios (shared, server y common) del árbol de instalación.

Para conseguir esta separación, usaremos las variables de entorno CATALINA_HOME, que apuntará a los binarios de la distribución Tomcat, y CATALINA_BASE, que apuntarán a los directorios de la instancia. Lo primero que hay que hacer es crear un lugar para albergar los directorios de la instancia.
    cd /opt
    mkdir instancias-tomcat
    cd instancias-tomcat
Después creamos un directorio por cada instancia de Tomcat que vayamos a albergar
    mkdir misite.com
    cd misite.com
Copiaremos ahora el directorio config de la distribución Tomcat a este nuevo directorio, y creamos el resto de directorios de la instancia:
    cp -a $CATALINA_HOME/conf .
    mkdir common logs temp server shared webapps work
Por último, colocaremos el contenido de la aplicación Web para esta instancia en el subdirectorio de CATALINA_BASE, como haríamos en cualquier otra configuración de Tomcat. Ahora necesitamos editar el fichero conf/server.xml de la instancia para asegurarnos que no intentamos abir los mismos puertos que los usados en otras instancias. Cambiaremos el puerto de cierre por un número de puerto diferente para cada instancia de Tomcat:
    <Server port="8007" shutdown="SHUTDOWN">
Y los puertos del conector HTTP:
    <Connector port="8087" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8743" />
Es buena idea limpiar este fichero de todo lo que no sea necesario (conectores para los ejemplos que vienen con Tomcat, configuraciones comentadas...) y realizar una búsqueda en el texto por port= y cambiar el valor del puerto de ese atributo si su elemento no está comentado.

Ahora sólo faltaría crear un script de arranque y otro de parada para cada instancia creada. El de arranque podría ser parecido a esto:

#!bash/sh/
export CATALINA_HOME="/opt/instancias-tomcat/misite.com"
export CATALINA_BASE="/opt/tomcat"
service tomcat start
Y para la parada:

#!bash/sh/
export CATALINA_HOME="/opt/instancias-tomcat/misite.com"
export CATALINA_BASE="/opt/tomcat"
service tomcat stop
Con esto, ya tendríamos disponible nuestras nuevas instancias.