Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente
Apache Tomcat y la Web
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.
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.
Comentarios en "Ejecutar Apache Tomcat y Apache HTTPD en el puerto 80 simultaneamente"
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 '
Espero que te sirva de ayuda.
Un saludo
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).