Cooperando con Java (Tomcat) en Apache

Porque se necesita Tomcat para ejecutar Java en Apache ?

El funcionamiento principal de Apache desde su creación fue la de aceptar y responder requisiciones de Páginas en Internet, y como fue mencionado en Servidores de Páginas y "Java Application Servers" , estas requisiciones correspondían a documentos estáticos (puro HTML ), es por esto que cuando se requiere ejecutar algún tipo de contenido dinámico (programas) como "Java", es necesario coordinar los esfuerzos de Apache con otro ambiente, en el caso de "Java" es precisamente "Tomcat" quien ofrece facilidades para ejecutar los dos componentes más utilizados en ambientes "Java": "JSP ("Java Server Pages")" y "Servlets".

Gráficamente

Requisicion Comun

En esta guia se hablará exclusivamente sobre la linea verde del diagrama, donde el Servidor de Páginas es "Apache" y el Servlet Engine es "Tomcat".

Pasos Previos

Creación del Módulo Mod_JK

El módulo Mod_JK es aquel utilizado por Apache para comunicarse con "Tomcat", debido a que este módulo es externo de Apache, se incluye en la distribución de Código Fuente de "Tomcat" , a continuación se mencionan los pasos a seguir para su creación

  1. Obtener el archivo Tar con el Código Fuente de "Tomcat" (no el binario!).

  2. Descomprimir el Código Fuente de "Tomcat" en un directorio temporal (generalmente /tmp) , esto genera un directorio por nombre jakarta-tomcat-<numero_de_version>-src .

  3. Ahora se debe descender dentro de jakarta-tomcat-<numero_de_version>-src al directorio src/native/apache1.3.

  4. Dentro de este directorio se debe ejecutar el siguiente comando:

    apxs -o mod_jk.so -I../jk -I/usr/local/jdk/include/ -I/usr/local/jdk/include/linux -c *.c ../jk/*.c
    

    apxs es un comando incluido en Apache utilizado para compilar módulos empleados por productos que operan en conjunción con Apache.

    Las letras -I en la instrucción indican los directorios que deben ser incluidos al compilar el módulo; en el caso anterior el directorio /usr/local/jdk indica el directorio base del JDK de Java. (Vea instalación de Tomcat para más detalles sobre el JDK)

  5. Una vez ejecutado el comando anterior exitosamente, se genera el archivo mod_jk.so dentro del directorio.(Este es el Módulo en sí)

Instalación del Módulo Mod_JK

Para instalar el módulo en Apache primeramente se debe copiar el Módulo (mod_jk.so) al directorio /usr/local/apache/libexec, para que este disponible en Apache.

A diferencia de los módulos incluidos en Apache los cuales generalmente requieren que Apache sea re-compilado-instalado, el módulo Mod_JK solo requiere de unas modificaciones al archivo general de configuración httpd.conf .

httpd.conf

Los parámetros para incluir el módulo Mod_JK son los siguientes:

LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c
JkWorkersFile /usr/local/tomcat/conf/workers.properties
JkLogFile /usr/local/tomcat/log/mod_jk.log
JkLogLevel warn
JkMount

Hasta este punto ya están configurados casi todos los aspectos relacionados con "Tomcat" y "Apache", solo falta uno: Como indicar a Apache que solicitudes deben ser enviadas a Tomcat ?, esto es, si ya se diseñaron 5 o 10 programas en "Java" ( JSP y/o Servlets ) como se coordinan estas con la información que actualmente es enviada por Apache ?

Se utiliza el parámetro JkMount dentro de httpd.conf:

JkMount /*.jsp ajp13
JkMount /servidordatos/Insertar ajp13

La declaración indica que toda requisición terminada en jsp (un Java Server Page), será enviada por Apache vía el protocolo ajp13 , este protocolo da precisamente a Tomcat, como fue mencionado en workers.properties; la segunda declaración indica que una requisición para el archivo Insertar bajo el directorio servidordatos también debe ser enviada a "Tomcat".

Nótese el énfasis en enviada, el hecho de que sea enviada no implica éxito, una vez enviada la solicitud el mismo "Tomcat" debe estar configurado apropiadamente para atender estas solicitudes, pero bueno , esto es tema de Tomcat .

Si se utilizan "Virtual Hosts" ?

Al igual que todo parámetro en httpd.conf , basta incluirlo en el segmento de "Virtual Host":

<Virtual Host 127.0.0.1>
ServerName www.filantropia.org 
DocumentRoot /www/beneficio/
DirectoryIndex ayuda.htm, index.htm
JkMount /donaciones/Intl
JkMount /donaciones/Local
</Virtual Host>
Cuidado con muchos JkMount's !

Si empieza a utilizar muchos JkMount's solo significa una cosa: La mayor parte del trabajo la esta realizando "Tomcat" ya que todo se esta enviando hacia "Tomcat", en este caso es conveniente eliminar "Apache" de la Arquitectura y que "Tomcat" reciba las requisiciones directamente; si observa la gráfica inicial este caso se da con la linea roja y será descrito a mayor detalle en la configuración de Tomcat .

Si de cualquier manera opta por mantener "Apache" en la Arquitectura se recomienda el uso del parámetro Include al definir una gran cantidad de JkMount's, esto incrementa la legibilidad de httpd.conf y reduce la carga Administrativa de mantener diversos JKMount's; el archivo httpd.conf cambiaría a:

# Ningun JkMount Aqui 
Include /usr/local/apache/conf/mijava.txt 

Y sería dentro del archivo mijava.txt donde se incluyen los JkMount's

JkMount /*.jsp ajp13
JkMount /servidordatos/Insertar ajp13
JkMount /servidor/Actualizar ajp13
JkMount /servidor/Eliminar ajp13
JkMount /foros/Insertar ajp13
JkMount /foros/Eliminar ajp13
JkMount /registro/Nuevo ajp13
JkMount /foros2/Insertar ajp13