Configuración de un proxy inverso

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a configurar Nginx como proxy inverso.

Imagine que un proxy inverso es como la persona encargada de recepción en una empresa grande. Cuando llama al número principal, no habla directamente con el director general ni con el equipo de soporte. Habla con la persona de recepción, quien pregunta «¿En qué puedo ayudarle?» y luego transfiere su llamada a la persona adecuada.

En este escenario:

  • Nginx es la persona de recepción, que escucha en el puerto 80.
  • La aplicación Python es el «equipo de soporte», que escucha en el puerto 8000.
  • Usted es el cliente que realiza la llamada.

Configurará Nginx para que, cuando alguien solicite /app, Nginx reenvíe la solicitud a un servidor Python y devuelva la respuesta al cliente.

Los proxies inversos son fundamentales en la arquitectura web moderna. Se sitúan delante de los servidores de aplicaciones para proporcionar un punto de entrada público estable. También pueden gestionar la terminación de TLS, el balanceo de carga, el almacenamiento en caché y el enrutamiento de solicitudes.

Esto significa que Nginx no siempre sirve archivos directamente. En ocasiones, su función principal es recibir el tráfico de los clientes y pasarlo a otro servicio situado detrás de él.

Iniciar una aplicación backend

Primero, necesitamos algo a lo que reenviar las solicitudes. Crearemos una aplicación web muy sencilla con Python.

Crearemos una carpeta específica desde la que nuestra aplicación servirá archivos.

Cree una carpeta llamada app dentro del directorio del proyecto y cree en ella un archivo HTML sencillo:

mkdir -p ~/project/app
echo "Hello from the Python Backend." > ~/project/app/index.html

Ahora, inicie el servidor Python. Este comando indica a Python que actúe como servidor web y sirva los archivos del directorio actual en el puerto 8000.

En este ejemplo, este proceso de Python es el servidor de aplicaciones backend. Se encargará de generar el contenido, mientras que Nginx se situará delante como punto de entrada público.

Añadimos el símbolo & al final para ejecutarlo en segundo plano. De este modo, podrá seguir usando el terminal mientras el servidor se ejecuta silenciosamente.

cd ~/project
python3 -m http.server 8000 &

Verifique que se haya iniciado correctamente. Buscaremos un proceso que esté escuchando en el puerto 8000:

netstat -tuln | grep 8000

Debería aparecer una salida que muestre 0.0.0.0:8000 (LISTEN). Esto significa que nuestra «aplicación backend» está lista para recibir solicitudes en la extensión 8000.

Configurar el proxy inverso de Nginx

En este paso, modificará el archivo de configuración de Nginx para indicarle dónde está nuestra aplicación Python.

Debe editar el archivo de configuración predeterminado con sudo y el editor de texto nano.

sudo nano /etc/nginx/sites-enabled/default

Desplácese dentro del bloque server { ... }. Allí verá un bloque location / { ... } existente. Debe añadir debajo un nuevo bloque location /app.

Añada el código siguiente al archivo. Preste atención a las llaves { } y al punto y coma ;:

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }

¿Qué hace este código?

  • location /app: indica a Nginx que supervise las solicitudes que comiencen por /app.
  • proxy_pass ...: actúa como el botón de transferencia de llamadas. Indica a Nginx: «Cuando reciba una solicitud para /app, reenvíela a localhost (127.0.0.1) en el puerto 8000».

Este reenvío es la esencia de un proxy inverso. El cliente se comunica con Nginx, pero Nginx se convierte en cliente del servidor backend en nombre del usuario.

La estructura del archivo debería ser similar a esta:

server {
    listen 80 default_server;
    ...
    location / {
        try_files $uri $uri/ =404;
    }

    location /app {
        proxy_pass http://127.0.0.1:8000;
    }
}

Pulse Ctrl+O y después Enter para guardar el archivo. Luego, pulse Ctrl+X para salir de nano.

Validar y recargar

Hemos actualizado el archivo de configuración, pero Nginx todavía utiliza las reglas antiguas. Debemos recargar el servicio.

Primero, pruebe siempre la configuración para detectar errores tipográficos antes de recargarla. Si recarga una configuración incorrecta, el servidor web podría dejar de funcionar por completo.

Ejecute el comando de prueba:

sudo nginx -t

Debería ver lo siguiente: syntax is ok test is successful

Si la prueba se realiza correctamente, recargue Nginx para aplicar los cambios:

sudo service nginx reload

Nginx ya ha actualizado sus instrucciones y está listo para reenviar solicitudes.

A partir de este momento, Nginx actúa como un enrutador entre las URL y los servicios backend, no solo como un servidor de archivos que lee datos del disco.

Probar el proxy

En este último paso, verificaremos que nuestra «persona de recepción» está haciendo correctamente su trabajo.

Enviaremos una solicitud web a Nginx, en el puerto 80, para pedir /app/. Nginx debería reenviarla inmediatamente al servidor Python, que escucha en el puerto 8000.

Ejecute el comando siguiente:

curl http://localhost/app/

Debería ver el mensaje de nuestro servidor backend:

Hello from the Python Backend.

¿Qué acaba de ocurrir?

  1. Usted solicitó /app/ a Nginx (localhost:80).
  2. Nginx comprobó sus reglas, encontró la coincidencia con /app y siguió la instrucción proxy_pass.
  3. Nginx llamó al servidor Python en el puerto 8000.
  4. El servidor Python devolvió la página «Hello...» a Nginx.
  5. Nginx devolvió la página «Hello...» a usted.

Conviene recordar esta cadena de solicitudes porque aparece en prácticamente toda la infraestructura moderna: navegador -> proxy inverso -> servidor de aplicaciones -> proxy inverso -> navegador.

¡Ha creado correctamente un proxy inverso!

Resumen

En este laboratorio, ha configurado correctamente Nginx como proxy inverso. Ha aprendido a:

  1. Alojar una aplicación backend sencilla mediante Python.
  2. Configurar Nginx con un bloque location para el enrutamiento.
  3. Reenviar tráfico mediante la directiva proxy_pass.
  4. Verificar la cadena del proxy con curl.

Esta arquitectura es la base de las aplicaciones web modernas. Le permite utilizar Nginx para la seguridad y el balanceo de carga, mientras otras aplicaciones gestionan la lógica en segundo plano.