Cómo configurar Apache Webserver Proxy frente a Apache Tomcat en Red Hat Linux

Cómo configurar Apache Webserver Proxy frente a Apache Tomcat en Red Hat Linux

Objetivo

Nuestro objetivo es configurar Apache Httpd para que funcione como un proxy frente al contenedor de aplicación Apache Tomcat.

Sistema operativo y versiones de software

  • Sistema operativo: Red Hat Enterprise Linux 7.5
  • Software: Apache httpd, Apache Tomcat

Requisitos

Acceso privilegiado al sistema

Dificultad

FÁCIL

Convenciones

  • # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
  • ps - Dados los comandos de Linux para ser ejecutados como un usuario regular no privilegiado

Introducción

El uso de Apache Httpd como proxy para un contenedor de aplicación Apache Tomcat es una configuración común. Viene con muchos casos de uso, el más trivial es servir contenido estático de httpd, mientras proporciona servicios que implementan una lógica de negocios pesados ​​de una aplicación escrita en Java que reside en el contenedor Tomcat.

Al crear un proxy, podemos crear un tipo de front-end para la capa de aplicación, donde podemos introducir medidas de seguridad en el servidor web, aplicar equilibrio de carga, usar redirección condicional o usar cualquier otra funcionalidad proporcionada por el servidor web. De esta manera, no necesitamos implementar ninguna de estas funciones en nuestra aplicación, y podemos enfocar sus capacidades para el servicio en sí. Tendremos un servidor web con todas las funciones presentadas para los usuarios, algunas de las URL reenviadas en silencio al contenedor de aplicaciones al que no puede ser accesible por sí solo. Las respuestas de la aplicación se devuelven a los clientes que no sabrán que hablaron cualquier otra cosa que no sea el servidor web, es decir, si tenemos cuidado de no exponer ninguna información (como mensajes de error no controlados) de la aplicación que puede hacer que adivinen que hay más que una capas.

Utilizaremos el protocolo AJP que se puede utilizar entre los servidores web y los contenedores de aplicaciones basados ​​en Java para proporcionar la capacidad de equilibrar la carga entre múltiples servidores de aplicaciones; sin embargo, para configurar un equilibrador de carga está fuera del alcance de este tutorial.

Configuraremos nuestra configuración en Red Hat Linux 7.5, pero el servidor web de Apache, el módulo AJP y el contenedor de la aplicación Apache Tomcat están disponibles en todas partes, y por lo tanto, esta configuración es portátil con pequeños ajustes como rutas del sistema de archivos o nombres de servicio.



Instalación del software requerido

Primero necesitamos instalar los servicios que utilizaremos. En una configuración de carga equilibrada, los servidores Tomcat podrían estar en diferentes máquinas, y a menudo lo están, proporcionando una granja de contenedores que construyen un servicio.

# yum install httpd tomcat tomcat-webapps

Instalamos el Tomcat-Webapps Para fines de prueba, dentro de este paquete hay una aplicación web ejemplos implementada en nuestro servidor Tomcat en la instalación. Usaremos esta aplicación para probar que nuestra configuración funciona según lo previsto.

Ahora podemos habilitar e iniciar nuestro servidor Tomcat:

# SystemCTL Habilitar Tomcat
# SystemCTL Start Tomcat

Y nuestro servidor web:

# SystemCTL Habilitar httpd
# SystemCTL Inicio HTTPD

El valor por defecto httpd La instalación contiene los módulos proxy que necesitamos. Para verificar que es así, podemos consultar el servidor web con apachectl:

# apachectl -m | GREP AJP Proxy_ajp_module (compartido) 
Copiar

Nota 1.X Apache Versiones usa mod_jk módulo en lugar de proxy_ajp.

configuración de httpd

La aplicación web de ejemplos implementada en TomCat se publican después de la instalación de forma predeterminada en SERVER-URL: 8080/Ejemplos. Prosxy solicitudes que llegan al puerto 80 del servidor (el puerto HTTP predeterminado) solicitando algo desde el servidor-url/ejemplos para ser atendido por el ejemplos Aplicación web implementada en Tomcat. Las solicitudes que lleguen a cualquier otra URL en el servidor serán atendidas por el servidor web. Configuraremos un contenido estático para mostrar esta funcionalidad.

En nuestro ejemplo se llama al servidor WS.foobar.comunicarse. Para que el proxy funcione, cree un archivo de texto con su editor favorito en el directorio de configuración del servicio web, que es /etc/httpd/conf.d en sabores de sombrero rojo, con la extensión de .confusión. Nuestra configuración no necesita que Tomcat sea accesible directamente, por lo que usamos hostil como anfitrión de Target en el /etc/httpd/conf.d/Ejemplo_proxy.confusión archivo:

 Servername WS.foobar.com proxyRequests Off proxyPass/ejemplos ajp: // localhost: 8009/ejemplos proxyPassReverse/ejemplos ajp: // localhost: 8009/ejemplos  
Copiar

Para estar en el lado seguro, podemos verificar que nuestra configuración sea correcta antes de aplicar con apachectl:

# sintaxis de configuración apachectl ok 
Copiar

Si la prueba de configuración devuelve un error como el siguiente:

No pudo resolver el nombre de host ws.foobar.com - ignorando!

Si significa que nuestro Nombre del servidor La directiva no es válida, ya que el servidor web no puede resolver. O necesitamos registrarlo en el DNS (local o global) o proporcionar una línea en el /etc/huéspedes Archivo que contiene la dirección IP pública del host seguida del nombre que dimos en la configuración anterior. Si el archivo de hosts ya contiene la IP con otro nombre (tal vez el nombre de host real), podemos agregar el nombre de servidor después de los nombres del host en la misma línea, la configuración funcionará.

Después de una prueba exitosa, debemos aplicar la nueva configuración reiniciando el servidor web:

# SystemCTL reiniciar httpd


Configuración de Tomcat

Con la instalación predeterminada, el contenedor Tomcat escuchará las solicitudes de AJP en todas las interfaces en el puerto 8009. Esto se puede verificar en el archivo de configuración principal:

# Ver/USR/Share/Tomcat/Conf/Server.XML […]   […] 
Copiar

Si no necesitamos que el contenedor Tomcat y las aplicaciones dentro sean accesibles por sí mismos, podemos configurar cada conector para escuchar solo en localhost:

Dirección del conector = "127.0.0.1 "puerto = ..."

Para aplicar podemos reiniciar Tomcat con:

# SystemCTL reiniciar Tomcat

En nuestra máquina de laboratorio no hará esto, ya que necesitamos ver que nos sirvan el mismo contenido en ambos puertos 80 y 8080.

Pruebas

Nuestra configuración mínima de proxy de AJP está completa, podemos probarla. Desde la línea de comando podemos llamar al ejemplos Aplicación directamente en el puerto 8080:

$ wget http: // ws.foobar.com: 8080/ejemplos --2018-09-13 11: 00: 58-- http: // ws.foobar.com: 8080/ejemplos resolviendo WS.foobar.com (ws.foobar.com) .. . 10.104.1.165 Conectando a WS.foobar.com (ws.foobar.com) | 10.104.1.165 |: 8080 .. . conectado. Solicitud de HTTP enviada, en espera de respuesta .. . 302 Ubicación encontrada:/ejemplos/[siguiente] --2018-09-13 11: 00: 58-- http: // ws.foobar.com: 8080/ ejemplos/ reutilización de conexión existente a WS.foobar.com: 8080. Solicitud de HTTP enviada, en espera de respuesta .. . 200 Ok Longitud: 1253 (1.2k) [texto/html] Guardar a: 'Ejemplos' 100%[===================================== ==================================================== ==================================================== ===================================>] 1,253 --.-K/S en 0s 2018-09-13 11:00:58 (102 MB/s)-'Ejemplos' guardados [1253/1253]
Copiar

Y ver el contenido proporcionado:

$ Tail Ejemplos 

Ejemplos de Apache Tomcat

  • Ejemplos de servlets
  • Ejemplos de JSP
  • Ejemplos de WebSocket (JSR356)
  • Ejemplos de WebSocket utilizando la desactivada API propietaria de Apache Tomcat
Copiar

Y si llamamos a la misma aplicación a través de nuestro proxy AJP, también debemos obtener una respuesta, mientras que no hay contenido en la raíz del documento del servidor web:

$ wget http: // ws.foobar.com/ejemplos --2018-09-13 11: 01: 09-- http: // ws.foobar.com/ejemplos resolviendo ws.foobar.com (ws.foobar.com) .. . 10.104.1.165 Conectando a WS.foobar.com (ws.foobar.com) | 10.104.1.165 |: 80 .. . conectado. Solicitud de HTTP enviada, en espera de respuesta .. . 302 Ubicación encontrada:/ejemplos/[siguiente] --2018-09-13 11: 01: 09-- http: // ws.foobar.com/ ejemplos/ reutilizar la conexión existente a WS.foobar.com: 80. Solicitud de HTTP enviada, en espera de respuesta .. . 200 Ok Longitud: 1253 (1.2k) [texto/html] Guardar a: 'Ejemplos.1 '100%[=============================================== ==================================================== ==================================================== ========================>] 1,253 --.-K/S en 0s 2018-09-13 11:01:09 (101 MB/s)-'Ejemplos.1 'guardado [1253/1253]
Copiar

Si todo funciona, obtendremos una respuesta con el mismo contenido, ya que la misma aplicación proporciona la misma aplicación dentro del contenedor:

$ Tail Ejemplos.1 

Ejemplos de Apache Tomcat

[… .]
Copiar

También podemos probar nuestra configuración con un navegador. Necesitamos llamar a todas las URL con el nombre del servidor como el host (al menos el que está proxy). Para eso, la máquina que ejecuta el navegador debe poder resolver el nombre del servidor, mediante el archivo DNS u hosts.

En nuestro entorno de laboratorio, no hemos deshabilitado a Tomcat escuchando en la interfaz pública, para que podamos ver lo que se proporciona cuando se le pide directamente en el puerto 8080:



Tomcat proporciona la aplicación de ejemplos

Podemos obtener el mismo contenido a través del proxy AJP proporcionado por el servidor web en el puerto 80:

httpd proporciona la aplicación de ejemplos con AJP proxy

Mientras actúa como un proxy, httpd puede servir a cualquier otro contenido. Podemos crear contenido estático que sea accesible en alguna otra URL en el mismo servidor:

# mkdir/var/www/html/static_content # echo "contenido estático">/var/www/html/static_content/static.html
Copiar

Al señalar nuestro navegador a este nuevo recurso, se nos proporciona el nuevo contenido estático.

Contenido estático proporcionado por httpd

Si el contenedor Tomcat no fuera accesible, no sabríamos la respuesta que viene en otro lugar que no sea el servidor web. Como proxizamos solo una aplicación específica, la aplicación raíz predeterminada del contenedor no es accesible a través del proxy, así oculto de todo más allá del servidor web.

Conclusión

El servidor web de Apache es muy extensible por medio de módulos, uno de ellos es el módulo proxy AJP. La guía anterior utiliza una máquina y expone una aplicación con el proxy, pero el mismo servidor web podría proporcionar una entrada única a muchas aplicaciones, posiblemente en muchos hosts que ejecutan contenedores de aplicaciones, al tiempo que proporciona otro contenido web también.

Combinado con otros módulos, como mod_securidad, Podemos agregar muchas características a nuestro servicio sin la necesidad de desarrollarlas dentro de la aplicación, o si la necesidad surge, redirige el proxy a otro punto final con una sola edición del archivo de configuración y la recarga del servidor web, haciendo una migración o el Introducción de la nueva versión de la aplicación Una cuestión de segundos. La misma recarga puede llevar al visitante a una página que explica el tiempo de inactividad planificado, mientras que el mantenimiento se realiza en los servidores de aplicaciones: los casos de uso de un proxy de AJP solo están limitados por la imaginación del personal de TI.

Tutoriales de Linux relacionados:

  • Ubuntu 20.04 Instalación de Tomcat
  • Cosas para instalar en Ubuntu 20.04
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Archivos de configuración de Linux: los 30 principales más importantes
  • Descarga de Linux
  • ¿Puede Linux obtener virus?? Explorando la vulnerabilidad de Linux ..
  • Tutorial de configuración proxy de calamar en Linux
  • La mejor distribución de Linux para desarrolladores
  • Guía de solución de problemas GNU/Linux General para principiantes
  • Cosas que hacer después de instalar Ubuntu 22.04 Jellyfish de Jammy ..