Quiero tener un servidor web ejecutándose en el puerto 80. Dondequiera que leo, Apache Tomcat se ejecuta en 8080. ¿Quién quiere tener eso en su URL? Entonces, mi primera pregunta es ¿dónde puedo cambiar el número de puerto? ¿Lo cambio en una única ubicación?

Estoy acostumbrado al hosting virtual apache2. Me gustaría la misma configuración en tomcat. Una carpeta pertenece a cada sitio web. He descubierto cómo crear alojamiento virtual con servers.xml y tengo varias carpetas para cada sitio, pero no puedo averiguar cómo implementar un archivo war en el directorio raíz de cada host virtual.

Cuando se implementa el archivo war, hay un archivo second.war y un directorio en blanco llamado second. Cuando voy a ver el sitio, tengo que ir a http://example.com:8080/second para verlo. No quiero tener que escribir second en la URL. ¿Cómo puedo resolver esto? No soy un programador de Java y el tipo que está compilando Java es un desarrollador JSP principiante.

Aquí está mi anfitriona en servers.xml:

  <Host name="example.com"  appBase="webapps" unpackWARs="true" autoDeploy="true">
      <Alias>www.example2.com</Alias>

      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
       prefix="example_com_app_access_log" suffix=".txt"
       pattern="%h %l %u %t %r %s %b" />

     <Context path="" docBase="/opt/tomcat/webapps/example_com"
       debug="0" reloadable="true"/>
  </Host>
2
Brént Russęll 5 feb. 2019 a las 04:22

2 respuestas

La mejor respuesta

Scary Wombat tuvo la respuesta en los comentarios. Configure un proxy inverso con Apache y ¡funciona muy bien!

0
Brént Russęll 7 feb. 2019 a las 01:22

Tl; dr

Para que Tomcat escuche en el puerto 8080 para recibir solicitudes provenientes de navegadores web en el puerto 80, use una herramienta de filtrado de paquetes en su sistema operativo host para alterar el número de puerto de los paquetes de red entrantes. Este proceso se conoce como reenvío de puertos .

El puerto 80 está restringido 🚫

Quiero tener un servidor web ejecutándose en el puerto 80. Dondequiera que leo, Apache Tomcat se ejecuta en 8080. ¿Quién quiere tener eso en su URL? Entonces, mi primera pregunta es ¿dónde puedo cambiar el número de puerto?

En sistemas operativos similares a Unix (macOS, BSD, Linux, Solaris, etc.) , los números de puerto inferiores a 1024 tienen acceso restringido por motivos de seguridad. Java está diseñado para ser seguro de forma predeterminada, por lo que no tiene ninguna forma (que yo sepa) de acceder a esos puertos. Por lo tanto, todos los servidores Java tienen un número predeterminado entre 1024 y el límite de aproximadamente 64,000. Tomcat toma de forma predeterminada 8080, elegido arbitrariamente por su linda repetición de 80, el puerto habitual para las aplicaciones web.

Todos los navegadores web utilizan ese puerto 80 de forma predeterminada y ocultan ese hecho al usuario. Entonces, una URL como http://www.StackOverflow.com/ es equivalente a una URL con un número de puerto explícito como http://www.StackOverflow.com:80/.

Como sugirió, generalmente no queremos molestar a nuestros usuarios con un puerto explícito como 8080 a Tomcat. Cómo resolver este Catch-22 donde el navegador web quiere utilizar el puerto 80 de forma predeterminada, pero ¿Los servidores basados en Java como Tomcat no pueden escuchar en el puerto 80? La solución común se conoce como reenvío de puertos .

Reenvío de puertos ⏩

La mayoría de los sistemas operativos tipo Unix vienen con una herramienta firewall conocida como filtro de paquetes. Cada paquete de datos que se transporta a través de una red y hacia su servidor puede ser inspeccionado, filtrado e incluso modificado por dicha herramienta.

La modificación que queremos es que cualquier paquete entrante que ingrese en el puerto 80 sea redirigido al puerto 8080 en el que está escuchando Tomcat. En este enfoque, modificamos el tráfico de la red, sin que Tomcat lo sepa y sin hacerle nada a Tomcat. Ni el navegador web ni el servidor web sabrán que está sucediendo algo, ambos permanecen felizmente ignorantes. El navegador envía solicitudes dirigidas al puerto 80, y el servidor web (Tomcat, Jetty, etc.) recibe las solicitudes ahora modificadas que llegan al puerto 8080.

Las herramientas de filtrado de paquetes que he visto funcionan todas de la misma manera: usted especifica una lista de reglas. Cada regla especifica una condición que, si se cumple, debería dar lugar a la adopción de una acción. Cada paquete se compara con las reglas una por una. La lista de reglas está ordenada, cada regla tiene un número asignado. La primera regla que coincide con el paquete gana y se toma su acción, mientras que las reglas restantes de la lista se ignoran. Por lo tanto, necesitamos configurar una regla que diga "si este paquete llega por el puerto 80, cambie el puerto a 8080 y deje que continúe su camino".

Idea simple. Desafortunadamente, cada herramienta de filtrado de paquetes tiene su propia sintaxis para estas reglas. Deberá buscar qué filtro de paquetes es el actual para su sistema operativo, ya que algunas herramientas antiguas han desaparecido, reemplazadas por herramientas más nuevas. Y luego necesitará aprender la sintaxis de las reglas de esa herramienta. Con suerte, encontrará fácilmente un fragmento de ejemplo para copiar, ya que el puerto de reenvío de puertos 80 para servidores web es extremadamente común.

Tenga en cuenta que la mayoría de los filtros de paquetes mantienen sus reglas solo para la sesión de trabajo actual. Cuando la máquina que aloja los sistemas operativos se reinicia, el filtro de paquetes vuelve a su configuración predeterminada, sin su regla agregada. Puede agregar manualmente su regla de reenvío de puertos después de cada reinicio o encontrar una manera para que su herramienta de filtro de paquetes particular aprenda la regla para que se aplique automáticamente después del reinicio.

Advertencia: Mi discusión anterior asume que estás usando Apache Tomcat como su servidor web además de ser el motor JSP / Servlet. Mencionaste Servidor HTTP Apache . Si está utilizando Tomcat detrás Apache HTTP Server, por lo que Tomcat actúa solo como un motor JSP / Servlet pero no como un servidor web, esa es una situación completamente diferente.

0
Basil Bourque 7 feb. 2019 a las 04:06