miércoles, abril 16, 2008

Multiples instancias de Tomcat

Para correr multiples instancias de Tomcat en el mismo servidor.

Tengo un Tomcat instalado en un RHEL5 en /opt/apache-tomcat-5.5.23 con una liga simbólica de /opt/tomcat5
Dentro de esta instalación en /opt/tomcat5/conf/server.xml tengo configurados varias aplicaciones. Teniendo varias desventajas.
  • Si una aplicación consume muchos recursos, todas las demás bajan de rendimiento.
  • Si una aplicación congela el JVM, las demás dejan de funcionar también.
No es práctico tener una instancia para cada aplicación, sobre todo cuando estas son pequeñas soluciones.

Ahora estoy desarrollando para Tomcat 6 y no quise migrar todas la aplicaciones ya configuradas y probadas en Tomcat 5.5.

Cree un directorio nuevo /var/tomcat y extraje el último Tomcat 6 en /var/tomcat/apache-tomcat-6.0.16
Cree otro directorio, exclusivo para mi instancia lo llamé serverB (pensando en que luego habrá un serverA y un serverC) y cree el siguiente árbol.

|-- conf
| |-- server.xml
| |-- tomcat-users.xml
| `-- web.xml
|-- logs
| `-- catalina.out
|-- temp
|-- webapps
`-- work


Ahora viene lo bueno.
Para correr la instancia y que no choque con la que ya está corriendo, hay que cambiar algunos puertos.

<Service name="Catalina">
<Connector port="8082" URIEncoding="UTF-8" />

<!-- Define an AJP 1.3 Connector on port 8020 -->
<Connector port="8020" enableLookups="false" redirectPort="9972" protocol="AJP/1.3"
URIEncoding="UTF-8" />

Creamos un script de arranque,
run

#!/bin/sh -e
JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun-1.5.0.11"
JAVA_OPTS="-Xmx800m -Xms800m"
#CATALINA_HOME=/opt/tomcat5
CATALINA_HOME=/var/tomcat/apache-tomcat-6.0.16
CATALINA_BASE=/var/tomcat/serverB
export JAVA_HOME JAVA_OPTS CATALINA_HOME CATALINA_BASE

# -p preserves the environment (for $JAVA_HOME etc.)
# -s is required because tomcat's login shell is /bin/false
su -p -s /bin/sh tomcat -c "$CATALINA_HOME/bin/catalina.sh start"


y un script de parada
stop

#!/bin/sh -e
JAVA_HOME="/usr/lib/jvm/java-1.5.0-sun-1.5.0.11"
JAVA_OPTS="-Xmx800m -Xms800m"
CATALINA_HOME=/var/tomcat/apache-tomcat-6.0.16
CATALINA_BASE=/var/tomcat/serverB
export JAVA_HOME JAVA_OPTS CATALINA_HOME CATALINA_BASE

su -p tomcat -c "$CATALINA_HOME/bin/catalina.sh stop"


Ahora tenemos otro Tomcat corriendo en el mismo servidor con puertos diferentes. Creamos un workerb en /etc/httpd/conf/worker.properties apuntando al puerto 8020.

worker.workerb.port=8020
worker.workerb.host=localhost
worker.workerb.type=ajp13
worker.workerb.lbfactor=1


y listo!

4 comentarios:

usuario de tomcat dijo...

Y si quiero actualizar las clases del catalina home, tengo q bajarlo y subirlo.
Pero en el 8082 seguira atendiendo el catalina base sin interrupciones. Cierto ???

cuales serian las instrucciones para eso (bajar y subir cada tomcat independiente).?

juparave dijo...

Cada script de arranque y parada definen la variable de ambiente CATALINA_BASE, de ella toma el conf/server.xml del árbol de la instancia que estás operando.

Como buena práctica, ten una copia de los scripts de arranque y parada en cada árbol de tus instancias de Tomcat.

Anónimo dijo...

No consigo hacerlo funcionar...
En mi instalación el archivo catalina.sh no existe.

vasto lorde vizard dijo...

en caso de que quiera aplicar alguna restriccion a tomcat, supongamos que tomcat se ejecuta por el puerto 9091 y tengo varias aplicaciones, pero estas aplicaciones las tengo que correr en otro puerto, no se en el puerto 9095, ejemplo

localhost:9095/aplicaciondeprueba

y cuando quite aplicaciondeprueba y solo se quede localhost:9095/
una vez que este hecho esto en vez de mostrarme el panel principal de tomcat, me aparezco una pagina que indique que no existe esa pagina

es posible hacer eso?