A logo showing the text blog.marcnuri.com
English
Inicio»Java»Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente

Entradas Recientes

  • Fabric8 Kubernetes Client 7.2.0 está disponible!
  • Conectarse a un servidor MCP con JavaScript y AI SDK
  • Conectarse a un servidor MCP con JavaScript y LangChain.js
  • El Futuro de las Herramientas para Desarrolladores en la era de la IA
  • Conectarse a un servidor Model Context Protocol (MCP) con Java y LangChain4j

Categorías

  • Antiguo
  • Front-end
  • Go
  • Herramientas
  • Industria y negocios
  • Inteligencia Artificial
  • Java
  • JavaScript
  • Operaciones
  • Personal
  • Proyectos personales

Archivos

  • mayo 2025
  • abril 2025
  • marzo 2025
  • febrero 2025
  • enero 2025
  • diciembre 2024
  • noviembre 2024
  • agosto 2024
  • junio 2024
  • mayo 2024
  • abril 2024
  • marzo 2024
  • febrero 2024
  • enero 2024
  • diciembre 2023
  • noviembre 2023
  • octubre 2023
  • septiembre 2023
  • agosto 2023
  • julio 2023
  • junio 2023
  • mayo 2023
  • abril 2023
  • marzo 2023
  • febrero 2023
  • enero 2023
  • diciembre 2022
  • noviembre 2022
  • octubre 2022
  • agosto 2022
  • julio 2022
  • mayo 2022
  • marzo 2022
  • febrero 2022
  • enero 2022
  • diciembre 2021
  • noviembre 2021
  • octubre 2021
  • septiembre 2021
  • agosto 2021
  • julio 2021
  • diciembre 2020
  • octubre 2020
  • agosto 2020
  • junio 2020
  • mayo 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • noviembre 2019
  • octubre 2019
  • julio 2019
  • diciembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • marzo 2018
  • febrero 2018
  • noviembre 2017
  • octubre 2017
  • agosto 2017
  • julio 2017
  • enero 2017
  • julio 2016
  • enero 2016
  • diciembre 2015
  • noviembre 2015
  • diciembre 2014
  • marzo 2014
  • febrero 2011
  • junio 2008
  • mayo 2008
  • abril 2008
  • enero 2008
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007

Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente

2015-11-19 en Java etiquetado Apache / Apache HTTP / Apache Tomcat / Aplicación / Conector / HTTP / Java / Servidor / Tomcat / Web / www por Marc Nuri | Última actualización: 2021-02-21
English version

Apache Tomcat y la Web

Apache Tomcat
Apache Tomcat

Normalmente cuando se ejecuta un servidor de aplicaciones como Apache Tomcat, se suele vincular un connector 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
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 opciones por 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.

1<VirtualHost *:80>
2    ServerAdmin root@localhost
3    ServerName tomcatserver.com
4    ServerAlias tomcatserver1.com
5    ServerAlias tomcatserver2.com
6    DefaultType text/html
7    ProxyRequests off
8    ProxyPreserveHost On
9    ProxyPass / http://localhost:8080/
10    ProxyPassReverse / http://localhost:8080/
11</VirtualHost>

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.

1<VirtualHost *:80>    
2    ServerAdmin root@localhost
3    DocumentRoot /var/www/
4    ServerName httpserver.com
5    #Aliases
6    ServerAlias httpserver1.com
7    ...
8</VirtualHost>

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.

1<VirtualHost *:80>    
2    ServerAdmin root@localhost
3    DocumentRoot /var/www/
4    ServerName httpserver.com
5    #Aliases
6    ServerAlias httpserver1.com
7    ProxyPass /tomcat http://localhost:8080/
8    ...
9</VirtualHost>

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.

Twitter iconFacebook iconLinkedIn iconPinterest iconEmail icon

Comentarios en "Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente"

  • Avatar for Cristopher Paniagua
    Cristopher Paniagua
    2016-06-30 17:49
    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?
    • Avatar for Marc Nuri
      Marc Nuri
      2016-07-03 07:26
      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 'En el ejemplo anterior no está incluido el tag de definición '[...]' que podría ir dentro del último VirtualHost.

      Espero que te sirva de ayuda.

      Un saludo
      • Avatar for Cristopher Paniagua
        Cristopher Paniagua
        2016-07-05 20:17
        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/?
        • Avatar for Marc Nuri
          Marc Nuri
          2016-07-31 11:43
          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).

Navegador de artículos
Migración de correo electrónico mediante mnIMAPSyncjava.lang.OutOfMemoryError: GC overhead limit exceeded (ES)
© 2007 - 2025 Marc Nuri