Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente 4


Apache Tomcat y la Web

Apache TomcatNormalmente cuando se ejecuta un servidor de aplicaciones como Apache Tomcat, se suele vincular un conector directamente en el puerto 80. De este modo, los usuarios que visiten la aplicación web, podrán navegar hasta ella simplemente introduciendo el nombre de dominio en la barra de direcciones de su navegador en lugar de tener que especificar el puerto especial después del dominio (http://tudominio.com:8080). Si no hay opciones para vincular el puerto 80 a un contector de Tomcat (algunos sistemas operativos bloquean esta funcionalidad por seguridad), existen otras alternativas de conseguir el mismo comportamiento. Por ejemplo, establecer una redirección del puerto 80 al puerto 8080 (Puerto por defecto de Apache Tomcat) mediante el uso de IPTables o cualquier otra herramienta para redirigir puertos. Ambas alternativas son procedimientos sencillos, pero son bastante problemáticos en el caso que además de Tomcat, queramos ejecutar algún servidor web estándar desde la misma máquina o IP.

Apache HTTP y mod_proxy

Para resolver este problema, podemos ejecutar Apache HTTPD como proxy para Apache Tomcat y redirigir el tráfico al servidor de aplicaciones en función de una serie de reglas. En este tutorial emplearemos mod_proxy, aunque existen muchas otras opciones disponibles.

Apache Tomcat - Apache HTTPd - mod_proxy front-end

En este tutorial se asume que Apache Tomcat ya se encuentra instalado y configurado en la máquina con las opciones por defecto para el Connector (puerto 8080) y que Apache HTTP también se encuentra instalado con las opcione spor defecto (listener en puerto 80).

Vamos a asumir que disponemos de dos dominios distintos (tomcatserver.com y httpserver.com) apuntando a la misma dirección IP. El usuario debería de llegar al servidor de aplicaciones cuando navega hacia un dominio, y al servidor web cuando navega hacia el otro.

El primer paso es asegurarse que el fichero de configuración de Apache HTTP (httpd.conf) tiene el módulo mod_proxy habilitado (lo está por defecto), así que en caso de que no lo esté, hay que descomentar la siguiente línea:

LoadModule proxy_module modules/mod_proxy.so

Teniendo en cuenta que asumimos que hay dos dominios distintos, debemos de usar la directiva NameVirtualHost para definir dos hosts diferentes.

NameVirtualHost *:80

Seguidamente definimos el host virtual que redirigirá el tráfico hacia Tomcat. En el caso en el que en Tomcat se hayan definido también hosts virtuales (distintas aplicaciones para distintos dominios), añadiremos un ServerAlias por cada dominio que también tenga que acceder a Tomcat.

La directiva DefaultType se emplea para establecer el header default type, para respuestas del servidor que no lo especifiquen. Este puede darse en aplicaciones web que no estén bien configuradas y es algo que Tomcat hace por defecto y omitirlo puede hacer que aparezcan errores en el momento en el que comencemos a usar la aplicación desde el proxy.

ProxyRequests  es una medida de seguridad, la opción off previene que el servidor sea usado como un servidor proxy normal por terceros.

ProxyPass enlazará una dirección de un servidor remoto a una ruta local. En este caso, cada petición que se haga a la raíz del servidor local se redirigirá al puerto 8080.

ProxyReverse ajustará los headers del servidor remoto para que concuerden con las direcciones que el cliente espera.

Por último definimos el virtual host que servirá las páginas directamente desde Apache HTTP server.

Reglas del Proxy

En el ejemplo hemos asumido que hay dos dominios distintos (o más) y que cada dominio apuntará aun servidor u otro. mod_proxy nos permite definir reglas más complejas, para redirigir tráfico basado en otras normas como la ruta contextual.

Con este código, todo el tráfico será servido por Apache HTTP, y únicamente aquellas peticiones a la ruta local ‘/tomcat’ se redirigirán a Apache Tomcat. Por tanto, http://httpserver.com/index.php lo servirá Apache HTTP y http://httpserver.com/tomcat/index.do lo hará Apache Tomcat.

Tweet about this on TwitterShare on FacebookShare on LinkedInShare on Google+Pin on PinterestEmail this to someone

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

4 ideas sobre “Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente

  • Cristopher Paniagua

    Hola, primero que nada excelente aporte, hay muy poca información sobre este tema. El problema que tengo es que al aplicarlo, efectivamente me redirige de apache http a tomcat pero al tratar de acceder únicamente al http me aparece un error 404 como si el segundo VHost no lo estuviera tomando en cuenta. Alguna idea de cuál podría ser el problema?

    • Marc Nuri Autor

      Hola Cristopher, gracias por tu comentario.

      Es complicado darte una respuesta sin ver el fichero de configuración.

      En todo caso, si te está devolviendo un 404, es porque sí que ha aplicado la regla del virtual host, pero no está encontrando el contenido. Revisa bien que el DocumentRoot y el resto de parámetros sean correctos. Además, para el DocumentRoot, deberías de haber definido un ‘[…]’ que podría ir dentro del último VirtualHost.

      Espero que te sirva de ayuda.

      Un saludo

      • Cristopher Paniagua

        Gracias por responder, afortunadamente ya pude acceder a mi web en apache sin ningún problema, lo raro es que ahora al ingresar a mi app en tomcat sin el puerto 8080 utilizando la ruta contextual, no me carga los estilos y eso es por que el path de mi app aparece sin la ruta contextual digamos asi http://localhost/myapp/ y la ruta con la accedo al sitio es http://localhost/tomcat/myapp/ ; al querer cargar las imágenes y demás recursos me manda un 404. Si abro una imagen en una pestaña nueva y agrego /tomcat/ a la ruta si la carga. Alguna idea de por que el path de mi app no esta contemplando la ruta contextual /tomcat/?

        • Marc Nuri Autor

          Hola Cristopher
          No termino de comprender cómo está surgiendo el problema. Según cómo hayas configurado el proxy en apache http server y los hosts en apache tomcat puede que ocurran cosas raras como la que mencionas. Asimismo, tal vez tengas las rutas de los recursos en tu CSS desalineadas con tu configuración (revisa que sean rutas relativas).