Un worker Tomcat es un ejemplar Tomcat que est� esperando para ejecutar servlets por cuenta de alg�n servidor web. Por ejemplo, podemos tener un servidor web como Apache reenviando peticiones servlets a un proceso Tomcat (el worker que se ejecuta detr�s de �l.
El escenario descrito arriba es uno muy simple; de hecho uno puede configurar m�ltiples workers para servir servlets por cuenta de un cierto servidor web. Las razones para dicha configuraci�n pueden ser:
- Queremos que diferentes contextos sean servidos por diferentes workers Tomcat para proporcionar un entorno de desarrollo donde todos los desarrolladores compartan el mismo servidor pero con su propio worker Tomcat.
- Queremos que diferentes host virtuales servidos por diferentes procesos Tomcat proporcionen una clara separaci�n entre los sites pertenecientes a distintas compa��as.
- Queremos proporcionar un balance de carga, lo que significa ejecutar m�ltiples workers Tomcat cada uno en su propia m�quina y distribuir las peticiones entre ellos.
Probablemente haya m�s razones para tener m�ltiples workers pero creo que esta lista es suficiente...
Los workers est�n definidos en un fichero de propiedades llamado workers.properties y est� p�gina explica como trabajar con �l.
�Definir Workers
La definici�n de workers para el plugin Tomcat del servidor web puede hacerse usando un fichero de propiedades (un fichero de ejemplo llamado workers.properties est� disponible en el directorio conf/); el fichero contiene entradas con la siguiente forma:
worker.list=<una lista separada por comas de nombres de workers >
Por ejemplo:
worker.list= ajp12, ajp13
Y
worker.<nombre de worker>.<property>=<valor de propiedad>
Por ejemplo:
worker.local.port=8007
Cuando arranque, el plugin del servidor web ejemplarizar� los workers cuyos nombres aparezcan en la propiedad worker.list, estos tambi�n son los workers a los que podemos mapear peticiones.
Cada worker nombrado deber�a tener una pocas entradas para proporcionar informaci�n adicional sobre s� mismo; esta informaci�n incluye el tipo de worker y otra informaci�n relacionada. Actualmente existen estos tipos de workers en (Tomcat 3.2-dev):
Tipo de Worker | Description |
---|---|
ajp12 | Este worker sabe c�mo reenviar peticiones a workers Tomcat fuera-de-proceso usando el protocolo ajpv12. |
ajp13 | Este worker sabe c�mo reenviar peticiones a workers Tomcat fuera-de-proceso usando el protocolo ajpv13. |
jni | Este worker sabe c�mo reenviar peticiones a workers Tomcat fuera-de-proceso usando jni. |
lb | Este es un worker de balance de carga, que sabe como proporcionar un balance de carga basado en redondeo con un cierto nivel de tolerancia. |
Definir workers de un cierto tipo deber�a hacerse siguiendo este formato de propiedad:
worker.<worker name>.type=<worker type>
Donde worker name es el nombre asignado al worker y worker type es uno de los cuatro tipos definidos en la tabla. Un nombre de worker podr�a no contener espacios (una buena convenci�n de nombres ser�a utilizar las reglas de nombrado para las variables Java).
Por ejemplo:
Definici�n de Worker | Significado |
---|---|
worker.local.type=ajp12 | Define un worker llamado "local" que usa el protocolo ajpv12 para reenviar peticiones a un proceso Tomcat. |
worker.remote.type=ajp13 | Define un worker llamado "remote" que usa el protocolo ajpv13 para reenviar peticiones a un proceso Tomcat. |
worker.fast.type=jni | Define un worker llamado "fast" que usa JNI para reenviar peticiones a un proceso Tomcat. |
worker.loadbalancer.type=lb | Define un worker llamado "loadbalancer" que hace balance de carga de varios procesos Tomcat de forma transparente. |
�Configurar Propiedades del Worker
Despu�s de definir los workers podemos especificar propiedades para ellos. Las propiedades se pueden especificar de la siguiente manera:
worker.<worker name>.<property>=<property value>
Cada worker tiene un conjunto de propiedades que podemos configurar seg�n se especifica en las siguientes subsecciones:
�Propiedades de un Worker ajp12
Los workers del tipo ajp12 reenv�an peticiones a workers Tomcat fuera-de-proceso usando el protocolo ajpv12 sobre sockets TCP/IP. La siguiente tabla especifica las propiedades que puede aceptar un worker ajp12:
Nombre de Propiedad |
Significado | Ejemplo |
---|---|---|
port | El puerto donde el worker Tomcat escucha peticiones ajp12. | worker.local.port=8007 |
host | El host donde el worker Tomcat escucha peticiones ajp12. | worker.local.host=www.x.com |
lbfactor | Cuando trabaja con un worker de balance de carga, este es el factor de balance para el worker. | worker.local.lbfactor=2.5 |
�Propiedades de un Wroker ajp13
Los workers del tipo ajp13 reenv�an peticiones a workers Tomcat fuera-de-proceso usando el protocolo ajpv13 sobre sockets TCP/IP. Las principales diferencias entre ajpv12 y ajpv13 son que:
- ajpv13 es un protocolo m�s binario e intenta comprimir algunos de los datos solicitados codificando los strings m�s frecuentemente usados en enteros peque�os.
- ajpv13 reusa sockets abiertos y los deja abiertos para futuras peticiones.
- ajpv13 tiene un tratamiento especial para informaci�n SSL por eso el contenedor puede implementar m�todos relacionados cono SSL como isSecure().
La siguiente tabla especifica las propiedades que puede aceptar un worker ajp13:
Nombre de Propiedad |
Significado | Ejemplo |
---|---|---|
port | El puerto donde el worker Tomcat escucha peticiones ajp12. | worker.local13.port=8007 |
host | El host donde el worker Tomcat escucha peticiones ajp12. | worker.local13.host=www.x.com |
lbfactor | Cuando trabaja con un worker de balance de carga, este es el factor de balance para el worker. | worker.local13.lbfactor=2.5 |
cachesize | Especifica el n�mero de conexiones sockets abiertas que mantendr� el worker. Por defecto este valor es 1, pero los servidores web multi-thread como Apache2.xx, IIS, y Netscape se beneficiar�n si configuramos este valor a un nivel m�s alto (como una media estimada de los usuarios concurrentes de Tomcat). | worker.local13.cachesize=30 |
�Propiedades de un Worker lb
El worker de balanceo de cargas realmente no se comunica con otros workers Tomcat, en su lugar es el responsable de varios workers "reales". Este control incluye:
- Ejemplarizar los workers en el servidor web.
- Usar el factor de balanceo de carga, realizando un balanceo de carga al redondeo de peso donde el lbfactor m�s alto significa una m�quina m�s fuerte (es la que manejar� m�s peticiones).
- Seguimiento de las peticiones que pertenecen a la misma sesi�n y que se ejecutan en el mismo worker Tomcat.
- Identificar los workers Tomcat fallidos, suspender las peticiones a estos workers y hacer que otros workers las manejen.
El resultado general es que los workers manejados por el mismo worker lb tienen balance de cargas (bas�ndose en su lbfactor y la sesi�n de usuario actual) y tamb�en tienen anti-ca�da por lo que si un proceso Tomcat muere, no "matar�" toda la site.
La siguiente tabla especifica las propiedades que puede aceptar un worker lb:
Nombre de Propiedad |
Significado | Ejemplo |
---|---|---|
balanced_workers | Una lista separada por comas de workers que el balanceador de carga necesita manejar. Estos workers no deber�an aparecer en la propiedad worker.list. | worker.loadbalancer.balanced_workers= local13, local12 |
�Propiedades de un Worker jni
El worker jni abre una JVM dentro del proceso del servidor web y ejecuta Tomcat dentro de ella (es decir en-proceso). Despu�s de esto, los mensajes pasados hacia y desde la JVM son pasados usando llamadas a m�todos JNI, esto hace al worker jni m�s r�pido que los workers fuera-de-proceso que necesitan comunicarse con los workers Tomcat escribiendo mensajes AJP sobre sockets TCP/IP.
Nota: como la JVM es multi-thread; el worker jni s�lo se deber�a usar dentro de servidores multi-thread como AOLServer, IIS, Netscape y Apache2.0. Deber�amos asegurarnos de que el esquema de threads usado por el servidor web corresponde con el usado para construir el plugin jk del servidor web.
Como el worker jni abre una JVM puede aceptar tantas propiedades como pueda reenviar a la JVM como el classpath, etc. como podemos ver en la siguiente tabla:
Nombre de Propiedad |
Significado | Ejemplo |
---|---|---|
class_path | El casspath usado por la JVM en-proceso. Esto deber�a apuntar a todos los ficheros jar/file de Tomcat as� como a cualquier clase u otro fichero jar que queramos a�adir a la JVM
Deber�amos recordar a�adir tambi�n javac al classpath. Esto se hace en Java2 a�adiendo tools.jar al classpath. En JDK1.xx deber�amos a�adir classes.zip. La propiedad class_path se puede dividir en m�ltiples l�neas. En este caso el entorno jk concatenar� todas las entradas classpath poniendo un delimitador (":"/";") entre cada entrada. |
worker.localjni.class_path=path-to-some-jarfile worker.localjni.class_path=path-to-class-directory |
cmd_line | La l�nea de comandos que es manejada sobre el c�digo de arranque de Tomcat.
La propiedad cmd_line puede proporcionarse en m�ltiples l�neas. En este caso el entorno jk las concatenar� poni�ndo espacios entre ellas. Nota: El string cmd_line no soporta espacios en blanco embebidos. Esto afecta principalmente a las especificaciones de paths. Sobre windows, podemos usar los nombres MS-DOS 8.3 para directorios que de otro modo contendr�an un espacio en blanco. |
worker.localjni.cmd_line=-config worker.localjni.cmd_line=path-to-tomcats-server.xml-file worker.localjni.cmd_line=-home worker.localjni.cmd_line=-path-to-tomcat-home |
jvm_lib | El path completo a la librer�a de implementaci�n de la JVM. El worker jni usa este path para cargar la JVM din�micamente. | worker.localjni.jvm_lib=full-path-to-jvm.dll |
stdout | El path completo donde la JVM escribir� su System.out | worker.localjni.stdout=full-path-to-stdout-file |
stderr | El path completo donde la JVM escribir� su System.err | worker.localjni.stderr=full-path-to-stderr-file |
sysprops | Propiedades de sistema para la JVM. | worker.localjni.sysprops=some-property |
ld_path | Path a las librer�as din�micas adicionales (similar en naturaleza a LD_LIBRARY_PATH). | worker.localjni.ld_path=some-extra-dynamic-library-path |
�Macros en Ficheros de Propiedades
Desde Tomcat3.2 podemos definir macros en los ficheros de propiedades. Estas macros nos permite definir propiedades y posteriormente usarlas cuando construyamos otras propiedades. Por ejemplo, el siguiente fragmento:
workers.tomcat_home=c:\jakarta-tomcat workers.java_home=c:\jdk1.2.2 ps=\ worker.inprocess.class_path=$(workers.tomcat_home)$(ps)classes worker.inprocess.class_path=$(workers.java_home)$(ps)lib$(ps)tools.jar
Terminar� con los siguientes valores para las propiedades worker.inprocess.class_path:
worker.inprocess.class_path= c:\jakarta-tomcat\classes worker.inprocess.class_path=c:\jdk1.2.2\lib\tools.jar
�El ejemplo worker.properties
Como escribir worker.properties por nosotros mismos no es una cosa f�cil de hacer; junto con los paquetes de Tomcat3.2 (y superiores) viene un fichero worker.properties de ejemplo. Este fichero est� pensado para ser tan gen�rico como sea posible y usa extensivamente las macros de propiedades.
El ejemplo worker.properties contiene el siguiente nivel de definiciones:
- Un worker ajp12 que usa el host localhost y el puerto 8007.
- Un worker ajp13 que usa el host localhost y el puerto 8009.
- Un worker jni.
- Un worker lb que balancea la carga de los workers ajp12 y ajp13.
Las definicioens de los workers ajp12, ajp13 y lb pueden funcionar sin modificar el fichero. Sin embargo, para hacer que funcione el worker jni deberemos configurar las siguientes configuraciones en el fichero:
- workers.tomcat_home
- tiene que apuntar a nuestro tomcat_home. - workers.java_home
- tiene que apuntar a donde tengamos situado el JDK. - ps
- tiene que apuntar al separador de ficheros de nuestro sistema operativo.
Cuando hagamos esto, el worker jni por defecto, deber�a funcionar.