Configurar acceso WebSocket en Tomcat a través de Apache2

html5-websockets

Desde Tomcat 7, el contenedor de servlets proporciona soporte para WebSocket tal y como se define en RFC6455. En el sitio web de Tomcat 7 se describen algunos elementos específicos de configuración, pero básicamente no hay que modificar nada de la instalación básica para poder hacer uso de este protocolo de comunicación que, recordemos, permite al servidor iniciar el envío de información al cliente web sin que éste la haya solicitado, es decir, la respuesta del servidor no es el resultado de un request previo.

No obstante lo expuesto, existe una situación en la que el asunto se complica un poco y es cuando entre el cliente y Tomcat hay un servidor Apache2 que se encarga de gestionar todas las peticiones del primero y las respuestas del último. Para tratar este caso ya habremos añadido un archivo de configuración para el módulo que actúa como proxy (mod_proxy) de manera que se encargue de redireccionar todo el tráfico dirigido al servidor Apache pero que en realidad debe tratar Tomcat. Este archivo, ubicado en el directorio de sitios disponibles (y debidamente habilitado) será algo como:

/etc/apache2/sites-available/.conf


ProxyPass <aplicacion> ajp://<tomcat ip>:<ajp port>/<aplicacion>/
ProxyPassReverse <aplicacion> ajp://<tomcat ip>:<ajp port>/<aplicacion>/
<Location /<aplicacion>>
   Order allow,deny
   Allow from all
</Location>

Donde es el context path de nuestra aplicación, es la ip de la máquina donde se encuentra instalado Tomcat y es el puerto de escucha del protocolo ajp, tal y como lo tenemos definido en el archivo server.xml.

Pues bien, para dar soporte a WebSocket deberemos asegurarnos que nuestro servidor Apache2  corre al menos la versión 2.4.4, que es donde se introduce el módulo mod_proxy_wstunnel , según puede consultarse aquí. Después, debemos modificar el archivo de configuración anterior de manera que, además de redireccionar todas las peticiones dirigidas al protocolo ajp, haga lo propio con las dirigidas al protocolo ws (websocket). De esta forma, el archivo de configuración ahora quedará como:

/etc/apache2/sites-available/.conf


ProxyPass <aplicacion>/primepush ws://<tomcat ip>:<tomcat port>/<aplicacion>/primepush retry=0
ProxyPassReverse <aplicacion>/primepush ws://<tomcat ip>:<tomcat port>/<aplicacion>/primepush retry=0

ProxyPass <aplicacion> ajp://<tomcat ip>:<ajp port>/<aplicacion>/
ProxyPassReverse /<aplicacion> ajp://<tomcat ip>:<ajp port>/<aplicacion>/
<Location /<aplicacion>>
   Order allow,deny
   Allow from all
</Location>

En esta ocasión debemos tener en consideración el nuevo valor aportado como , que se corresponderá con el puerto de escucha de Tomcat según aparece en server.xml (tipicamente el 8080).