viernes, 7 de julio de 2006

Apache + Tomcat + Redirección + Ocultamiento de puertos

   En el trabajo tenemos una arquitectura un tanto particular para comunicar los sistemas entre sí. En lugar de que se llamen unos a otros de manera incontrolada, todos tienen que utilizar un middleware comun llamado dispatcher que, en función de un parámetro que es el código de la operación que se quiere realizar, llama al sistema apropiado pasándole los parámetros necesarios. Ocurre que este dispatcher es una "simple" aplicación web corriendo en un tomcat y se está migrando a una nueva plataforma. Antes de esta migración definitiva lo que está montado es que el dispatcher reenvía todas las operaciones a la nueva plataforma, ésta se comunica con el sistema final, reenvía la respuesta al dispatcher y éste finalmente responde.

   En el entorno de validación, que es el que nosotros administramos, para ir acostumbrando a la gente a utilizar la nueva arquitectura hemos decidido capar diversas operaciones (si no les funcionan van a tener que migrar forzosamente) de una forma elegante y transparente para desarrollo. Vamos a montar un apache "delante" del tomcat, levantado en su mismo puerto que redirija todas las peticiones al tomcat, que estará levantado en otro puerto. Además, en el apache caparemos diversas operaciones para mostrar un mensaje de error y cuando se realice la redirección de las operaciones correctas, mantendremos el puerto del tomcat oculto.

Configuración en Apache
Hemos utilizado la versión 1.3.26 de Apache y el sistema operativo en el que corre es Solaris 8.
En el archivo httpd.conf hemos añadido las siguientes líneas.

Conector de Tomcat:
LoadModule jk_module libexec/mod_jk.so
AddModule mod_jk.c


Definición de las operaciones que queremos capar:
RewriteEngine on
RewriteLog "logs/rewrite_log"
RewriteLogLevel 2
Options +FollowSymLinks
RewriteCond %{THE_REQUEST} .*OPERACION_01.* [OR]
RewriteCond %{THE_REQUEST} .*OPERACION_02.* [OR]
...
RewriteCond %{THE_REQUEST} .*OPERACION_N.* [OR]
RewriteRule dispatcher /error_dispatcher.xml [PT]


Redirección al tomcat:
JkWorkersFile /ruta/del/apache/conf/workers.properties
JkLogFile /ruta/del/apache/logs/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /* worker1

Creamos el worker.properties:
# Define 1 real worker using ajp13
worker.list=worker1
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=IP_DE_LA_MAQUINA
worker.worker1.port=8009
worker.worker1.lbfactor=50
worker.worker1.cachesize=10
worker.worker1.cache_timeout=600
worker.worker1.socket_keepalive=1
worker.worker1.recycle_timeout=300


   Y listo. Reiniciamos el tomcat y el apache y haciendo una prueba vemos que las operaciones "prohibidas" se redirigen al mensaje de error definido y el resto se resuelven por el tomcat.

No hay comentarios:

Publicar un comentario