|
Buscador
Secciones
Registro
¡Colabora!
Ganamos
Servicios
|
Inicio > Tutoriales > Lenguajes orientados a objeto > Java > Servidores de Aplicaciones Java > Tomcat - Introducción
Adicionalmente podemos, o Tomcat creará, los siguientes directorios:
|
| Nombre del Script | Descripción |
|---|---|
| tomcat | El script principal. Configura el entorno apropiado, incluyendo CLASSPATH, TOMCAT_HOME y JAVA_HOME, y arranca Tomcat con los parámetros de la línea de comando apropiados. |
| startup | Arrancar tomcat en segundo plano. Acceso directo para tomcat start |
| shutdown | Para tomcat (lo apaga). Acceso directo para tomcat stop; |
El script más importante para los usuarios es tomcat (tomcat.sh/tomcat.bat). Los otros scripts relacionados con tomcat sirven como un punto de entrada simplificado a una sola tarea (configuran diferentes parámetros de la línea de comandos, etc.).
Una mirada más cercana a tomcat.sh/tomcat.bat nos muestra que realiza las siguientes acciones:
| Sistema Operativo | Acciones |
|---|---|
| Unix |
|
| Win32 |
|
Como podemos ver, la versión Win32 de tomcat.bat no es tán robusta como la de UNIX. Especialmente, no se averigua los valores de JAVA_HOME y sólo intenta "." como averiguación de TOMCAT_HOME. Puede construir el CLASSPATH dinámicamente, pero no en todos los casos. No puede construir el CLASSPATH dinámincamente si TOMCAT_HOME contiene espacios, o sobre Win9x, si TOMCAT_HOME contiene nombres de directorios que no son 8.3 caracteres.
Ficheros de Configuración de TomcatLa configuración de Tomcat se basa en dos ficheros:
Esta sección trata la forma de utilizar estos ficheros. No vamos a cubrir la interioridades de web.xml, esto se cubre en profundidad en la especificación del API Servlet. En su lugar cubriremos el contenido de server.xml y discutiremos el uso de web.xml en el contexto de Tomcat.
server.xmlserver.xml es el fichero de configuración principal de Tomcat. Sirve para dos objetivos:
Los elementos más importantes de server.xml se describen en la siguiente tabla:
| Elemento | Descripción |
|---|---|
| Server | El elemento superior del fichero server.xml. Server define un servidor Tomcat. Generalmente no deberíamos tocarlo demasiado. Un elemento Server puede contener elementos Logger y ContextManager. |
| Logger | Este elemento define un objeto logger. Cada objeto de este tipo tiene un nombre que lo identifica, así como un path para el fichero log que contiene la salida y un verbosityLevel (que especifica el nivel de log). Actualmente hay loggeres para los servlets (donde va el ServletContext.log()), los ficheros JSP y el sistema de ejecución tomcat. |
| ContextManager | Un ContextManager especifica la configuración y la estructura para un conjunto de ContextInterceptors, RequestInterceptors, Contexts y sus Connectors. El ContextManager tiene unos pocos atributos que le proporcionamos con:
|
| ContextInterceptor & RequestInterceptor | Estos interceptores escuchan ciertos eventos que sucenden en el ContextManager. Por ejemplo, el ContextInterceptor escucha los eventos de arrancada y parada de Tomcat, y RequestInterceptor mira las distintas fases por las que las peticiones de usuario necesitan pasar durante su servicio. El administrador de Tomcat no necesita conocer mucho sobre los interceptores; por otro lado, un desarrollador debería conocer que éste es un tipo global de operaciones que pueden implementarse en Tomcat (por ejemplo, loggin de seguridad por petición). |
| Connector | El Connector representa una conexión al usuario, a través de un servidor Web o directamente al navegador del usuario (en una configuración independiente). El objeto connector es el responsable del control de los threads en Tomcat y de leer/escribir las peticiones/respuestas desde los sockets conectados a los distintos clientes. La configuración de los conectores incluye información como:
|
| Context | Cada Context representa un path en el árbol de tomcat donde situanos nuestra aplicación web. Un Context Tomcat tiene la siguiente configuración:
|
Se puede encontrar información adicional dentro del fichero server.xml.
Arrancar Tomcat dese Otros DirectorioPor defecto tomcat usará TOMCAT_HOME/conf/server.xml para su configuración. La configuración por defecto usará TOMCAT_HOME como la base para sus contextos.
Podemos cambiar esto usando la opción -f /path/to/server.xml, con un fichero de configuración diferente y configurando la propiedad home del controlador de contexto. Necesitamos configurar los ficheros requeridos dentro del directorio home:
Si la propiedad ContextManager.home de server.xml es relativa, será relativa al directorio de trabajo actual.
web.xmlPodemos encontar una detallada descripción de web.xml y la estructura de la aplicación web (incluyendo la estructura de directorios y su configuración) en los capítulo 9, 10 y 14 de la Servlet API Spec en la site de Sun Microsystems.
Hay una pequeña característica de Tomcat que está relacionada con web.xml. Tomcat permite al usuario definir los valores por defecto de web.xml para todos los contextos poniendo un fichero web.xml por defecto en el directorio conf. Cuando construimos un nuevo contexto, Tomcat usa el fichero web.xml por defecto como la configuración base y el fichero web.xml específico de la aplicación (el localizado en el WEB-INF/web.xml de la aplicación), sólo sobreescribe estos valores por defecto.
Configurar Tomcat para Cooperar con Apache Web ServerHasta ahora no hemos explicado Tomcat como un plugin, en su lugar lo hemos considerado como un contenedor independiente y hemos explicado como usarlo. Sin embargo, hay algunos problemas:
Por todas estas razones es recomendable que las sites del mundo real usen un servidor web, como Apache, para servir el contenido estático de la site, y usen Tomcat como un plugin para Servlets/JSP.
No vamos a cubrir las diferentes configuraciones en profundidad, en su lugar:
Operación del Servidor WebEn resumidas cuentas un servidor web está esperando peticiones de un cliente HTTP. Cuando estas peticiones llegan el servidor hace lo que sea necesario para servir las peticiones proporcionando el contenido necesario. Añadirle un contenedor de servlets podría cambiar de alguna forma este comportamiento. Ahora el servidor Web también necesita realizar lo siguiente:
Por otro lado el adaptador necesita saber qué peticiones va a servir, usualmente basándose en algún patrón de la URL requerida, y dónde dirigir estas peticiones.
Las cosas son incluso más complejas cuando el usuario quiere seleccionar una configuración que use hosts virtuales, o cuando quieren que múltiples desarrolladores trabajen en el mismo servidor web pero en distintos contenedores de Servlets. Cubriremos estos dos casos en las secciones avanzadas.
¿Cuál es la Configuración Necesaria
La configuración más óbvia en la que uno puede pensar es en la identidad de las URLs servlet que están bajo la responsabilidad del contenedor de servlets. Esto está claro, alguién debe conocer qué peticiones transmitir al cotenedor de servlets...
Todavía hay algunos ítems de configuración adicionales que deberíamos proporcionar a la combinación
web-server/servlet-container:
Toda esta información debe aparecer en el fichero de configuración del servidor web, o en un fichero de configuración privado usado por el adaptador. La siguiente sección explicará cómo se puede implementar esta configuración en Apache.
Haciéndolo en ApacheEsta sección nos enseña como configurar Apache para que trabaje con Tomcat; intenta proporcionar explicaciones sobre las directivas de configuración que deberíamos usar. Podemos encontrar información adicional en la página http://java.apache.org/jserv/install/index.html.
Cuando Tomcat arranque generá automáticamente un fichero de configuración para apache en TOMCAT_HOME/conf/tomcat-apache.conf. La mayoría de las veces no necesitaremos hacer nada más que incluir es fichero (añadir Include TOMCAT_HOME/conf/tomcat-apache.conf) en nuestro fichero httpd.conf. Si tenemos necesidades especiales, por ejemplo un puerto AJP distinto de 8007, podemos usar este fichero como base para nuestra configuración personalizada y grabar los resultados en otro fichero. Si manejamos nosotros mismos la configuración de Apache necesitaremos actualizarlo siempre que añadamos un nuevo contexto.
Tomcat: debemos re-arrancar tomcat y apache después de añadir un nuevo contexto; Apache no soporta cambios en su configuración sin re-arrancar. Cuando tomcat arranca, también se genera el fichero TOMCAT_HOME/conf/tomcat-apache.conf cuando arrancar tomcat, por eso necesitamos arrancar Tomcat antes que Apache. Tomcat sobreescribirá TOMCAT_HOME/conf/tomcat-apache.conf cada arrancada para que se mantenga la configuración peronalizada.
La configuración Apache-Tomcat usa las directivas de configuración principales de Apache así como directivas únicas de Jserv por eso podría ser confuso al principio, sin embargo hay dos cosas que lo simplifican:
Veamos ahora un simple fichero tomcat.conf:
########################################################### # A minimalistic Apache-Tomcat Configuration File # ########################################################### # Note: this file should be appended or included into your httpd.conf # (1) Loading the jserv module that serves as Tomcat's apache adapter. LoadModule jserv_module libexec/mod_jserv.so # (1a) Module dependent configuration. <IfModule mod_jserv.c> # (2) Meaning, Apache will not try to start Tomcat. ApJServManual on # (2a) Meaning, secure communication is off ApJServSecretKey DISABLED # (2b) Meaning, when virtual hosts are used, copy the mount # points from the base server ApJServMountCopy on # (2c) Log level for the jserv module. ApJServLogLevel notice # (3) Meaning, the default communication protocol is ajpv12 ApJServDefaultProtocol ajpv12 # (3a) Default location for the Tomcat connectors. # Located on the same host and on port 8007 ApJServDefaultHost localhost ApJServDefaultPort 8007 # (4) ApJServMount /examples /root # Full URL mount # ApJServMount /examples ajpv12://hostname:port/root </IfModule>
Como podemos ver el proceso de configuración está dividio en 4 pasos que explicaremos ahora:
ApJServMount /examples ajpv12://hostname:port/rootmonta el contexto /examples en un proceso tomcat que se está ejecutando en el host hostname y que escucha en el puerto número port.
Ahora que hemos entendido las diferentes instrucciones de configuración en el fichero de ejemplo, ¿cómo podríamos añadirla a la configuración de Apache? Un método sencillo es escribir su contenido en httpd.conf (el fichero de configuración de Apache), sin embargo, esto puede ser muy desordenado. En su lugar deberíamos usar la directiva include de apache. Al final de fichero de configuración de Apache (httpd.conf) añadimos la siguiente directiva:
include <full path to the Tomcat configuration file>
Por ejemplo:
include /tome/tomcat/conf/tomcat.conf
Esto añadirá nuestra configuración de Tomcat a apache, después de haber copiado el módulo jserv al directorio libexec de Apache (o modules en caso de Win32) y re-arrancar (parar+arrancar) Apache, deberíamos poder conectar con Tomcat.
Obtener el Módulo Jserv (mod_jserv)Como vimos anteriormente, necesitamos un adaptador de servidor Web para situarlo en Apache y redirigir las peticiones a Tomcat. Para Apache, este adaptador es una versión ligeramente modificada de mod_jserv.
Podríamos intentar buscarlo en http://jakarta.apache.org/downloads/binindex.html para ver si hay una versión pre-construida de mod_jserv que corresponda con nuestro sistema operativo (Normalmente hay uno para NT), sin embargo, siendo una librería nativa, no deberíamos esperar que esté ya (demasiados sistemas operativos, pocos desarrolladores, la vida es muy corta...) Además, pequeñas variaciones en la forma de construir la variante UNIX de Apache podrían resultar en errores de enlaces dinámicos. Realmente deberíamos intentar construir mod_jserv para nuestro sistema (no te asustes, no es tan dificil!).
Construir mod_jserv sobre UNIX:
apxs -c -o mod_jserv.so *.capxs es parte de la distribución de Apache y debería estar localizado en nuestro APACHE_HOME/bin.
Construir mod_jserv para Win32 no es tan sencillo (ya tenemos una dll descargable para Win32). Pero si todavía queremos construirlo deberíamos instalar visual C++ y realizar las siguientes tareas:
nmake -f Makefile.win32nmake es el programa make de Visual C++.
Esto es todo!, ya hemos construido mod_jserv...
Hacer que Apache sirva los Ficheros Estáticos del ContextoEl fichero anterior de configuración de Apache-Tomcat era de alguna forma ineficiente, instruye a Apache a enviar cualquier petición que empiece con el prefijo /examples para que sea servida por Tomcat. ¿Realmente queremos hacer eso? Hay muchos ficheros estáticos que podrían ser parte de nuestro contexto servlet (por ejemplo imágenes y HTML estático), ¿Por qué debería Tomcat servir esos ficheros?
Realmente tenemos razones para hacer esto, por ejemplo:
En general, sin embargo, este no es ese caso; hacer que Tomcat sirva el contenido estático es sólo malgastar CPU. Deberíamos hacer que Apache sirviera estos ficheros dinámicos y no Tomcat.
Hacer que Apache sirva los ficheros estáticos requiere los siguientes pasos:
y dejar que Apache maneje el resto. Echemos un vistazo a un fichero de ejemplo tomcat.conf que hace exactamente esto:
######################################################################
# Apache-Tomcat Smart Context Redirection #
######################################################################
LoadModule jserv_module modules/ApacheModuleJServ.dll
<IfModule mod_jserv.c>
ApJServManual on
ApJServDefaultProtocol ajpv12
ApJServSecretKey DISABLED
ApJServMountCopy on
ApJServLogLevel notice
ApJServDefaultHost localhost
ApJServDefaultPort 8007
#
# Mounting a single smart context:
#
# (1) Make Apache know about the context location.
Alias /examples c:/jakarta-tomcat/webapps/examples
# (2) Optional, customize Apache context service.
<Directory "c:/jakarta-tomcat/webapps/examples">
Options Indexes FollowSymLinks
# (2a) No directory indexing for the context root.
# Options -Indexes
# (2b) Set index.jsp to be the directory index file.
# DirectoryIndex index.jsp
</Directory>
# (3) Protect the WEB-INF directory from tampering.
<Location /examples/WEB-INF/>
AllowOverride None
deny from all
</Location>
# (4) Instructing Apache to send all the .jsp files under the context to the
# jserv servlet handler.
<LocationMatch /examples/*.jsp>
SetHandler jserv-servlet
</LocationMatch>
# (5) Direct known servlet URLs to Tomcat.
ApJServMount /examples/servlet /examples
# (6) Optional, direct servlet only contexts to Tomcat.
ApJServMount /servlet /ROOT
</IfModule>
Como podemos ver, el inicio de este fichero de configuración es el mismo que vimos en el ejemplo anterior. Sin embargo, el último paso (montar el contexto), ha sido reemplazado por una larga serie de directivas de configuración de Apache y ApJServ que ahora explicaremos:
Es facil ver que este fichero de configuración es mucho más complejo y propenso a errores que el primer ejemplo, sin embargo es el precio que debemos pagar (por ahora) para mejorar el rendimiento.
Configurar Varias JVMs TomcatAlgunas veces es útil tener diferentes contextos manejados por diferentes JVMs (Máquinas Virtuales Java), por ejemplo:
Implementar dichos esquemas donde diferentes contextos son servidos por diferentes JVMs es muy fácil y el siguiente fichero de configuración lo demuestra:
###################################################################### # Apache-Tomcat with JVM per Context # ###################################################################### LoadModule jserv_module modules/ApacheModuleJServ.dll <IfModule mod_jserv.c> ApJServManual on ApJServDefaultProtocol ajpv12 ApJServSecretKey DISABLED ApJServMountCopy on ApJServLogLevel notice ApJServDefaultHost localhost ApJServDefaultPort 8007 # Mounting the first context. ApJServMount /joe ajpv12://joe.corp.com:8007/joe # Mounting the second context. ApJServMount /bill ajpv12://bill.corp.com:8007/bill </IfModule>
Como podemoe ver en el ejemplo anterior, usar varias JVMs (incluso aquellas que se ejecutan en diferentes máquinas) puede conseguirse fácilmente usando una URL completa ajp montada. En esta URL completa realmente especificamos el host donde está localizado el proceso Tomcat y su puerto.
Si tuvieramos los dos procesos Tomcat ejecutándose en la misma máquina, Deberíamos configurar cada uno de ellos con un puerto de conector diferente. Por ejemplo, asumiendo que las dos JVMs se ejecutan sobre localhost, la configuración Apache-Tomcat debería tener algo como esto:
###################################################################### # Apache-Tomcat with Same Machine JVM per Context # ###################################################################### LoadModule jserv_module modules/ApacheModuleJServ.dll <IfModule mod_jserv.c> ApJServManual on ApJServDefaultProtocol ajpv12 ApJServSecretKey DISABLED ApJServMountCopy on ApJServLogLevel notice ApJServDefaultHost localhost ApJServDefaultPort 8007 # Mounting the first context. ApJServMount /joe ajpv12://localhost:8007/joe # Mounting the second context. ApJServMount /bill ajpv12://localhost:8009/bill </IfModule>
Mirando al fichero de arriba podemos ver que tenemos dos puntos de montaje ApJServ explícitos, cada uno apuntando a un puerto diferente de la misma máquina. Esta claro que esta configuración requiere soporte desde la configuración encontrada en los ficheros server.xml. Necesitamos diferentes configuraciones de <Connector> en cada fichero para los diferentes procesos Tomcat. Realmente necesitamos dos ficheros server.xml diferentes (llamémosles server_joe.xml y server_bill.xml) con diferentes entradas <Connector> como se ve en los siguientes ejemplos:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Server>
<!-- Debug low-level events in XmlMapper startup -->
<xmlmapper:debug level="0" />
<!-- @@@
Note, the log files are suffixed with _joe to distinguish
them from the bill files.
-->
<Logger name="tc_log"
path="logs/tomcat_joe.log"
customOutput="yes" />
<Logger name="servlet_log"
path="logs/servlet_joe.log"
customOutput="yes" />
<Logger name="JASPER_LOG"
path="logs/jasper_joe.log"
verbosityLevel = "INFORMATION" />
<!-- @@@
Note, the work directory is suffixed with _joe to distinguish
it from the bill work directory.
-->
<ContextManager debug="0" workDir="work_joe" >
<!-- ==================== Interceptors ==================== -->
...
<!-- ==================== Connectors ==================== -->
...
<!-- Apache AJP12 support. This is also used to shut down tomcat.
-->
<!-- @@@ This connector uses port number 8007 for it's ajp communication -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter name="port" value="8007"/>
</Connector>
<!-- ==================== Special webapps ==================== -->
<!-- @@@ the /jow context -->
<Context path="/joe" docBase="webapps/joe" debug="0" reloadable="true" >
</Context>
</ContextManager>
</Server>
Cuando miramos a server_joe.xml podemos ver que el <Connector> está configurado en el puerto 8007. Por otro lado, en server_bill.xml (ver abajo) el conector está configurado para el puerto 8009.
<?xml version="1.0" encoding="ISO-8859-1"?>
<Server>
<!-- Debug low-level events in XmlMapper startup -->
<xmlmapper:debug level="0" />
<!-- @@@
Note, the log files are suffixed with _bill to distinguish
them from the joe files.
-->
<Logger name="tc_log"
path="logs/tomcat_bill.log"
customOutput="yes" />
<Logger name="servlet_log"
path="logs/servlet_bill.log"
customOutput="yes" />
<Logger name="JASPER_LOG"
path="logs/jasper_bill.log"
verbosityLevel = "INFORMATION" />
<!-- @@@
Note, the work directory is suffixed with _bill to distinguish
it from the joe work directory.
-->
<ContextManager debug="0" workDir="work_bill" >
<!-- ==================== Interceptors ==================== -->
...
<!-- ==================== Connectors ==================== -->
...
<!-- Apache AJP12 support. This is also used to shut down tomcat.
-->
<!-- @@@ This connector uses port number 8009 for it's ajp communication -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter name="port" value="8009"/>
</Connector>
<!-- ==================== Special webapps ==================== -->
<!-- @@@ the /bill context -->
<Context path="/bill" docBase="webapps/bill" debug="0" reloadable="true" >
</Context>
</ContextManager>
</Server>
La configuración del puerto no es la únia diferencia entre los dos ficheros. Tenemos marcas @@@ en los cuatro lugares de los ficheros xml donde hemos realizado cambios. Como podemos ver, esta diferencia es necesaria para evitar que los dos procesos Tomcat sobreescriban los logs y el espacio de trabajo del otro.
Entonces deberíamos arrancar los dos procesos Tomcat usando el la opción -f de la línea de comando:
bin\startup -f conf\server_joe.xml bin\startup -f conf\server_bill.xml
y luego accedemos a ellos desde Apache basándonos en los diferentes prefijos de las URLs del path.
Configurar el Hosting VirtualEs posible soportar host virtuales sobre Tomcat Ver3.2, de hecho la configuración de host virtuales es muy similar a la configuración para múltiples JVM y la razón es sencilla; en Tomcat 3.2 cada host virtual está implementado por un proceso Tomcat diferente.
Con la versión actual de Tomcat (Ver3.2), el hosting virtual sin preocupaciones está proporcionado por el servidor web (Apache/Netscape). El soporte de servidor de host virtual es usado por el adaptador Tomcat para redirigir las peticiones a cierto host virtual a la JVM(s) que conteine los contextos de este host virtual. Esto significa que si (por ejemplo) tenemos dos host virtuales (vhost1 y vhost2), tendremos dos JVMs: una ejecutándose en el contexto de vhost1 y la otra ejecutándose en el contexto de vhost2. Estas JVMs no se preocupan de la existencia de la otra, de hecho, no se preocupan del concepto de host virtual. Toda la lógica del hospedaje virtual está dentro del adaptador del servidor web. Para aclarar las cosas, veamos el siguiente fichero de configuración Apache-Tomcat
###################################################################### # Apache Tomcat Virtual Hosts Sample Configuration # ###################################################################### LoadModule jserv_module modules/ApacheModuleJServ.dll <IfModule mod_jserv.c> ApJServManual on ApJServDefaultProtocol ajpv12 ApJServSecretKey DISABLED ApJServMountCopy on ApJServLogLevel notice ApJServDefaultHost localhost ApJServDefaultPort 8007 # 1 Creating an Apache virtual host configuration NameVirtualHost 9.148.16.139 # 2 Mounting the first virtual host <VirtualHost 9.148.16.139> ServerName www.vhost1.com ApJServMount /examples ajpv12://localhost:8007/examples </VirtualHost> # 3 Mounting the second virtual host <VirtualHost 9.148.16.139> ServerName www.vhost2.com ApJServMount /examples ajpv12://localhost:8009/examples </VirtualHost> </IfModule>
Como podemos ver, los pasos 1, 2 y 3 definen dos host virtuales en Apache y cada uno de ellos monta el contexto /examples en cierta URL ajpv12. Cada URL ajpv12 apunta a una JVM que contiene el host virtual. La configuración de las dos JVM es muy similar a la mostrada en la sección anterior, y también necesitaremos usar dos ficheros server.xml diferentes (uno por cada host virtual) y necesitaremos arrancar los procesos Tomcat con la opción -f de la línea de comandos. Después de hacer esto podremos aproximarnos a Apache, cada vez con un nombre de host diferente, y el adaptador nos redirigirá la JVM apropiada.
La necesidad de mejorar el soporte para hosting virtual
Tener cada host virtual implementado por un JVM diferente es un enorme problema de escalabilidad. Las siguientes versiones de Tomcat haran posible soportar varios host virtuales en la misma JVM Tomcat.
Trucos de Configuración del Mundo RealPor defecto la distribución Tomcat viene con una configuración ingenua cuyo objetivo principal es ayudar al usuario recien experimentado y una operación "recién salido de la caja"... Sin embargo, esta configuración no es la mejor forma de desplegar Tomcat en sitios reales. Por ejemplo, los sites reales podrían requerir algún ajuste de rendimiento y configuraciones específicas de la site (elementos de path adicionales, por ejemplo). Esta sección intentará dirigirnos por los primeros pasos que deberíamos realizar antes de publicar una site basada en Tomcat.
Modificar y Personalizar los Ficheros BatchComo mencionamos en las secciones anteriores, los scripts de arrancada están para nuestra conveniencia. Aunque, algunas veces los scripts que necesitamos para desarrollar deberían ser modificados:
Algunos de estos cambios se pueden hacer sin cambiar explícitamente los scripts básicos; por ejemplo, el script tomcat puede usar una variable de entorno llamada TOMCAT_OPTS para seleccionar los parámetros extras de la línea de comando de la JVM (como configuraciones de memoria, etc). Sobre UNIX también podemos crear un fichero llamando ".tomcatrc" en nuestro directorio home y Tomcat tomará la información de entorno como PATH, JAVA_HOME, TOMCAT_HOME y CLASSPATH desde este fichero. Sin embargo, sobre NT nos veremos forzados a reescrobor algunos de estos scripts de arrancada...
No tengas miedo, sólo hazlo!
Modificar las Configuraciones por Defecto de la JVMLas configuraciones por defecto de la JVM en el script tomcat son muy ingenuas; todo se deja por defecto. Hay algunas cosas que deberíamos considerar para mejorar el rendimiento de Tomcat:
Modificar nuestros ConectoresLos conectores, según los configura el fichero server.xml de Tomcat, contiene dos Connectors configurados como en el siguiente fragmento:
<!-- (1) HTTP Connector for stand-alone operation -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.http.HttpConnectionHandler"/>
<Parameter name="port"
value="8080"/>
</Connector>
<!-- (2) AJPV12 Connector for out-of-process operation -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter name="handler"
value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter name="port"
value="8007"/>
</Connector>
El conector AJPV12 es necesario para cerrar Tomcat. Sin embargo, el conector HTTP podría eliminarse si la operación independiente no lo necesitase.
Usar Almacenes de Threads en nuestros ConectoresTomcat es un contenedor servlet multi-thread lo que significa que cada petición necesita ser ejecutada por algún thread. Anteriomente a Tomcat 3.2, por defecto había que crear un nuevo thread para servir cada petición que llegaba. Este comportamiento era problemático en sitios sobrecargados porque:
La solución para estos problemas es usar un thread pool (almacen de threads), que se usa por defecto en Tomcat 3.2. Los contenedores Servlets que usan almacenes de threads se liberan a sí mismos de manejar sus treads. En lugar de asignar nuevos threads, cada vez que los necesitan, se los piden al almacen, y cuando todo está hecho, el thread es devuelto al almacen. Ahora el almacen de threads se puede utilizar para implementar técnicas de control de de threads, como:
Podemos refinar las técnicas descritas arriba de varias formas, pero sólo serán refinamientos. La principal contribución de los almacenes de threads es la reutilización de los thrreads un límite superior que limite el uso de recursos.
Usar un almacen de threads en Tomcat es un sencillo movimiento; todo lo que necesitamos hacer es usar un PoolTcpConnector en nuestra configuración de <Connector>. Por ejejmplo, el siguiente fragmento de server.xml define ajpv12, como un conector con almacen:
<!-- A pooled AJPV12 Connector for out-of-process operation -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter
name="handler"
value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter
name="port"
value="8007"/>
</Connector>
Este fragmento es muy simple y el comportamiento (por defecto) del almacen instruido por él es:
La configuración por defecto está bien para sites de media carga con un media de 10-40 peticiones concurrentes. Si nuestro site es diferente deberíamos modificar esta configuración (por ejemplo reduciendo el límite superior). La configuración del almacen de threads se puede hacer desde el elemento <Connector> en server.xml como se demuestra en el siguiene fragmento:
<!-- A pooled AJPV12 Connector for out-of-process operation -->
<Connector className="org.apache.tomcat.service.PoolTcpConnector">
<Parameter
name="handler"
value="org.apache.tomcat.service.connector.Ajp12ConnectionHandler"/>
<Parameter
name="port"
value="8007"/>
<Parameter
name="max_threads"
value="30"/>
<Parameter
name="max_spare_threads"
value="20"/>
<Parameter
name="min_spare_threads"
value="5" />
</Connector>
Como se puede ver el almacen tiene 3 parámetros de configuración:
Deberíamos usar estos parámetros para ajustar el comportamiento del almacen a nuestras necesidades.
Desactivar la Auto-Recarga de ServletsLa auto-recarga de servlets es muy util en el momento del desarrollo. Sin embargo es muy costosa (en términos de degradación del rendimiento) y podría poner a nuestra aplicación en extraños confilctos cuando las clases fueran cargadas y ciertos cargadores de clases no puedieran cooperar con las clases cargadas por el classloader actual.
Por eso, a menos que tengamos una necesidad real para recargar las clases durante el despliegue deberíamos desactivar la bandera reloadable en nuestros contextos.
| Leer comentarios (118) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2006
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Hospedaje web y servidores dedicados linux por
Ferca Network