Configuración de Nginx como un proxy inverso para aplicaciones de backend | INTROSERV
EUR
european

EUR

usa

USD

Spanish Es
Ex. VAT Ex. VAT 0%

Configuración de Nginx como un proxy inverso para aplicaciones de backend

Introducción

En configuraciones modernas de servidores, las aplicaciones rara vez se comunican directamente con internet. En su lugar, un proxy inverso se coloca frente a ellas y maneja las solicitudes entrantes de los clientes. Nginx es una de las herramientas más populares para este trabajo porque es rápido, confiable y fácil de configurar. En este tutorial, aprenderás cómo configurar Nginx como un proxy inverso para una aplicación backend que se ejecuta en el mismo servidor.

¿Qué es un proxy inverso?

Un proxy inverso es un servidor que:

  • Acepta solicitudes de clientes (navegadores, APIs, etc.)
  • Reenvía esas solicitudes a una aplicación backend
  • Envía la respuesta del backend de vuelta al cliente

El cliente nunca se comunica directamente con la aplicación backend.

Proxy inverso vs acceso directo

Sin un proxy inverso:

Cliente ---> Aplicación backend (puerto 3000)

Con un proxy inverso:

Cliente ---> Nginx (puerto 80, 443) ---> Aplicación backend (puerto 3000)

¿Por qué usar Nginx como un proxy inverso?

Usar Nginx frente a tu aplicación te permite:

  • Exponer solo los puertos 80/443 a internet
  • Ocultar servicios backend del acceso directo
  • Terminar HTTPS (TLS) en un solo lugar
  • Agregar registro, control de acceso y limitación de tasa
  • Ejecutar múltiples aplicaciones en un servidor

Para los administradores de sistemas, esto significa mejor seguridad y gestión más sencilla.

Escenario utilizado en este tutorial

Para simplificar las cosas, utilizaremos la siguiente configuración:

  • Nginx escucha en el puerto 80
  • La aplicación backend escucha en 127.0.0.1:3000
  • Las solicitudes a http://example.com se reenvían al backend

Diagrama de flujo de tráfico

[ Navegador ] | v [ Nginx example.com:80,443 ] | v [ Aplicación backend 127.0.0.1:3000 ]

Requisitos previos

Antes de comenzar, asegúrate de tener:

  • Un servidor Linux con la última versión estable de Debian
  • Acceso root o sudo
  • Una aplicación backend ya en ejecución (por ejemplo, una aplicación Node.js, Python o Java)
  • Familiaridad básica con la terminal de Linux

Instalar Nginx

Actualiza las listas de paquetes e instala Nginx y curl (para probar la configuración):

sudo apt update

sudo apt install nginx curl

Verifica que Nginx esté en ejecución:

systemctl status nginx

Deberías ver "active (running)" en la salida.

Prueba Nginx localmente:

curl http://localhost

Si Nginx está funcionando, recibirás la página de bienvenida predeterminada.

Entender la estructura de configuración de Nginx

Los archivos de configuración de Nginx generalmente se almacenan en /etc/nginx/. Directorios importantes:

  • /etc/nginx/nginx.conf — archivo de configuración principal
  • /etc/nginx/sites-available/ — archivos de configuración de sitios (no activos)
  • /etc/nginx/sites-enabled/ — configuraciones de sitios habilitadas (enlaces simbólicos)

Nginx lee los archivos de configuración desde la carpeta sites-enabled, no directamente desde sites-available. Se recomienda crear archivos de configuración de sitios en sites-available y luego crear enlaces simbólicos a ellos en sites-enabled.

Crear una configuración de proxy inverso

Crear un nuevo archivo de sitio

sudo nano /etc/nginx/sites-available/reverse-proxy.conf

Agregar la configuración de proxy inverso

server { listen 80; server_name example.com; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

Entender la configuración

Bloque de servidor

server { listen 80; server_name example.com; }

  • listen 80; — Nginx escucha tráfico HTTP en el puerto 80
  • server_name example.com; — nombre de dominio al que responde este bloque de servidor

Bloque de ubicación

location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }

  • location / — coincide con todas las URL entrantes
  • proxy_pass — reenvía solicitudes a la aplicación backend

Encabezados de proxy

proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;

Estos encabezados aseguran que el backend sepa:

  • El nombre de dominio original
  • La dirección IP real del cliente
  • Si la solicitud fue HTTP o HTTPS

Sin estos encabezados, las aplicaciones backend pueden registrar información incorrecta del cliente.

Habilitar la configuración

Deshabilita el sitio predeterminado de Nginx para evitar conflictos en el puerto 80:

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

Crea un enlace simbólico para habilitar el sitio:

sudo ln -s /etc/nginx/sites-available/reverse-proxy.conf /etc/nginx/sites-enabled/

Prueba la configuración para detectar errores de sintaxis:

sudo nginx -t

Si la prueba es exitosa, recarga Nginx:

sudo systemctl reload nginx

Probar el proxy inverso

Prueba desde el servidor:

curl http://example.com

Abre http://example.com en un navegador para probar. Deberías recibir una respuesta de tu aplicación backend, no la página predeterminada de Nginx. Si todo está configurado correctamente, la aplicación backend se cargará.

Cómo se procesa la solicitud

  1. El cliente envía una solicitud a example.com
  2. Nginx recibe la solicitud en el puerto 80
  3. Nginx reenvía la solicitud a 127.0.0.1:3000
  4. El backend procesa la solicitud
  5. La respuesta regresa a través de Nginx
  6. El cliente recibe la respuesta

Errores comunes y solución de problemas

Backend no en ejecución

  • Asegúrate de que la aplicación esté en ejecución
  • Confirma el puerto correcto

ss -tuln | grep 3000

Dirección incorrecta de proxy_pass

  • Siempre incluye http://
  • Asegúrate de que la IP y el puerto sean correctos

Olvidar recargar Nginx

Después de cada cambio de configuración:

sudo systemctl reload nginx

Firewall bloqueando el acceso

Asegúrate de que el puerto 80 esté abierto:

sudo ufw allow 80

Mejoras opcionales

Una vez que el proxy inverso esté funcionando, considera:

  • Habilitar HTTPS con Let's Encrypt
  • Ejecutar múltiples aplicaciones backend
  • Agregar registros de acceso y errores
  • Configurar balanceo de carga
  • Soportar conexiones WebSocket

Configuración de HTTPS

En entornos de producción, siempre debes usar HTTPS en lugar de HTTP. HTTPS cifra el tráfico entre el cliente y tu servidor, protegiendo contraseñas, tokens de API, cookies y otros datos sensibles. Nginx soporta HTTPS usando certificados SSL/TLS. En esta sección, aprenderás:

  • Qué es Certbot
  • Cómo instalar Certbot
  • Cómo Certbot modifica automáticamente la configuración de Nginx
  • Cómo configurar Nginx manualmente usando un certificado comprado

¿Qué es Certbot?

Certbot es una herramienta que obtiene e instala automáticamente certificados SSL/TLS gratuitos de Let's Encrypt. Puede:

  • Solicitar un certificado gratuito
  • Verificar la propiedad del dominio
  • Configurar automáticamente Nginx
  • Configurar la renovación automática de certificados

Para principiantes y la mayoría de los entornos de producción, Certbot es la forma más fácil y segura de habilitar HTTPS.

Instalación de Certbot

Actualiza las listas de paquetes:

sudo apt update

Instala Certbot y el plugin de Nginx:

sudo apt install certbot python3-certbot-nginx

El paquete python3-certbot-nginx permite que Certbot modifique automáticamente tu configuración de Nginx.

Obtener e instalar un certificado

Antes de ejecutar Certbot, asegúrate de que:

  • Tu nombre de dominio apunte a la dirección IP pública de tu servidor
  • Nginx esté en ejecución
  • Los puertos 80 y 443 estén abiertos en el firewall

Ejecuta:

sudo certbot --nginx

Certbot:

  1. Preguntará qué dominio deseas asegurar
  2. Verificará la propiedad del dominio
  3. Actualizará automáticamente tu configuración de Nginx
  4. Recargará Nginx

Info

Certbot modifica automáticamente tu configuración de Nginx. Normalmente agrega un nuevo bloque de servidor para el puerto 443 (HTTPS), agrega rutas de certificados SSL, configura una redirección de HTTP a HTTPS si eliges esa opción, y agrega configuraciones SSL recomendadas.

Ejemplo de configuración agregada por Certbot:

server { listen 443 ssl; server_name example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

Certbot también puede modificar el bloque HTTP para redirigir el tráfico:

server { listen 80; server_name example.com; return 301 https://$host$request_uri; }

Debido a que Certbot edita archivos de configuración automáticamente, se recomienda:

  • Mantener copias de seguridad de tu configuración
  • Entender qué cambios se realizaron
  • Siempre probar la configuración después de los cambios

Prueba la configuración:

sudo nginx -t

Renovación automática de certificados

Los certificados de Let's Encrypt son válidos por 90 días. Certbot instala automáticamente un temporizador de renovación. Puedes probar la renovación con:

sudo certbot renew --dry-run

Si está configurado correctamente, la renovación ocurrirá automáticamente sin tiempo de inactividad.

Usar un certificado SSL comprado

Si compras un certificado SSL de una autoridad certificadora (CA), debes configurar Nginx manualmente. Después de la compra, generalmente recibes:

  • Un archivo de certificado (por ejemplo, example.com.crt)
  • Una clave privada (example.com.key)
  • Un archivo de paquete CA (ca_bundle.crt)

Crea un directorio seguro:

sudo mkdir -p /etc/nginx/ssl

sudo chmod 700 /etc/nginx/ssl

Copia tus archivos de certificado en este directorio.

Ejemplo de configuración HTTPS con un certificado comprado:

server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; ssl_trusted_certificate /etc/nginx/ssl/ca_bundle.crt; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

Agrega redirección de HTTP a HTTPS:

server { listen 80; server_name example.com www.example.com; return 301 https://$host$request_uri; }

Recarga Nginx después de la configuración manual:

sudo nginx -t

sudo systemctl reload nginx

Tip

Para administradores de sistemas novatos, se recomienda encarecidamente Certbot a menos que tu organización requiera certificados comerciales.

Resumen

En este tutorial, aprendiste:

  • Qué es un proxy inverso y por qué es útil
  • Cómo Nginx reenvía solicitudes a aplicaciones backend
  • Cómo crear y habilitar una configuración de proxy inverso
  • Cómo probar y solucionar problemas comunes
  • Cómo configurar HTTPS

El proxy inverso de Nginx es una habilidad fundamental para los administradores de sistemas y se utiliza ampliamente en entornos de producción.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA