Instalación mod_jk
------------------

[Se asume que ya tiene instalado el servidor web Apache y el contenedor de servlets Apache Tomcat]
[El objetivo es poder hacer llamadas Ajax desde un CGI en Perl a un Servlet que está funcionando en Tomcat.]

0) Se recomienda detener el servicio de Tomcat y Apache, si es que se están ejecutando.

1) Instale el conector mod_jk:

Se sugiere que lo hagan con la herramienta de gestión de paquetes del sistema operativo que tengan instalado. En Ubuntu se debe instalar el paquete: libapache2-mod-jk (probablemente agregará automáticamente otros paquetes, entre ellos apxs2)

Otra alternativa es descargar mod_jk desde:

http://www.apache.org/dist/tomcat/tomcat-connectors/jk/source/jk-1.2.30/tomcat-connectors-1.2.30-src.tar.gz

luego de descomprimir, siguen las instrucciones del BUILD.txt (es necesario que instalen apxs2)

2) Una vez instalado, es necesario configurar. Primero, ubiquen el archivo "workers.properties", en mi caso, como instalé mod_jk por medio de Synaptic (gestor de paquetes de Ubuntu) me dejó ese archivo en: 

/etc/libapache2-mod-jk/workers.properties

ubiquen las siguientes líneas y ajusten los valores de acuerdo a su sistema, los valores que vienen por default no siempre están correctos, en mi caso los valores quedaron como:

------------------------------------
workers.tomcat_home=/usr/local/tomcat/apache-tomcat-6.0.29
workers.java_home=/usr/java/jdk1.6.0_21
------------------------------------

Luego, en el mismo archivo busquen la definición del "WORKER", debiese aparecer algo como:

------------------------------------
worker.ajp13_worker.port=8009
worker.ajp13_worker.host=localhost
worker.ajp13_worker.type=ajp13
------------------------------------

Esto significa que el "worker" que comunicará Apache con Tomcat, se llama "ajp13_worker". Recuerden ese nombre.

3) Ahora es necesario configurar el servidor Apache para que envíe al conector las solicitudes que necesitamos. Se debe editar el archivo apache2.conf, en mi sistema está en:

/etc/apache2/apache2.conf

Al final del archivo, se agregan las siguientes líneas que están entre las líneas segmentadas:

------------------------------------
# Where to find workers.properties
JkWorkersFile /etc/libapache2-mod-jk/workers.properties

# Where to put jk logs
JkLogFile /var/log/apache2/mod_jk.log

# Set the jk log level [debug/error/info]
JkLogLevel info

# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
------------------------------------

Deben ajustar la ubicación del archivo de workers (JkWorkersFile) y del archivo de log (JkLogFile). Algunos manuales indican que deben agregar acá las rutas de las aplicaciones que debe manejar el conector con JkMount, pero a mi me resultó agregando las instrucciones con JkMount en el archivo:

/etc/apache2/sites-enabled

Se debe ubicar la línea que define el DocumentRoot:

------------------------------------
DocumentRoot /var/www
------------------------------------

Y agregar un # al principio, para que quede comentada y luego agregar la línea:

------------------------------------
JkMount /ajax/* ajp13_worker
------------------------------------

Con esto, se está indicando que cuando un cliente solicite una URL del tipo:

http://localhost/ajax/NOMBRE_PROGRAMA

Esta solicitud será manejada por el conector, quien la enviará a Tomcat y este buscará dentro de sus webapps la aplicación "ajax" para realizar la ejecución de NOMBRE_PROGRAMA. Este NOMBRE_PROGRAMA puede ser un jsp o un Servlet directamente previamente definido en el archivo web.xml de la aplicación.

4) Ya se tiene configurado el conector y Apache, ahora es el turno de Tomcat. Para ello revisar el archivo "server.xml" que debe estar en el directorio "conf" de Tomcat y deben confirmar que esté descomentado el Listener de JK:

------------------------------------
<Listener className="org.apache.jk.config.ApacheConfig" modJk="/usr/lib/apache2/modules/mod_jk.so" />
------------------------------------

Y también debe estar descomentada la definición del conector:

------------------------------------
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
------------------------------------

5) Finalmente, inicie el servicio de Tomcat y luego el de Apache. Mire si se generó el archivo de log de mod_jk en:

/var/log/apache2/mod_jk.log

Luego, usando un browser asegúrese que Tomcat y Apache partieron bien solicitando la siguientes URL:

http://localhost:8080/
http://localhost/

Para finalizar, solicite una URL erronea pero que hace uso del conector:

http://localhost/ajax/NO_ESTA

y debiese ver el error HTTP 404, pero generado por Tomcat. Con esto, sabemos que la conexión está funcionando.

6) Puede probar su instalación usando el archivo adjunto test.pl, que es un CGI en Perl que lo puede dejar en el directorio de CGI de su instalación (en el mismo en donde tiene la tarea2 que hizo en Perl). Este archivo ejecuta llamadas AJAX a un servlet, el cual retorna el resultado de la ejecución del comando "top", ejemplo visto en la clase de Ajax:

https://www.u-cursos.cl/ingenieria/2010/2/CC5002/1/material_docente/objeto/322038


7) Archivo test.pl:

------------------------------------
#!/usr/bin/perl -w
print "Content-type: text/html\r\n\r\n";

$heredoc = <<END;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
<script type="text/javascript">
function loadXMLDoc() {
  if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  } else {// code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange = function(){
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("myDiv").innerHTML = "<pre>"+xmlhttp.responseText+"</pre>";
    }
  }
  xmlhttp.open("GET","http://localhost/ajax/Procesos.do",true);
  xmlhttp.send();
}
</script>
</head>
<body>
<h2>Ejemplo de Ajax</h2>

<p>Listado de procesos</p>
<button type="button" onclick="loadXMLDoc()">Mostrar listado!</button>

<div id="myDiv"></div>

</body>
</html>
END

print $heredoc;
------------------------------------
