Introducing ZYNOO General Purpose & CPU Optimized Servers   Learn More >

Cómo configurar un proxy inverso de Nginx en Ubuntu

Un proxy inverso de Nginx recibe las solicitudes de los visitantes de un sitio web y las reenvía a otro servidor o aplicación. Se utiliza habitualmente para hacer accesibles mediante un nombre de dominio las aplicaciones que se ejecutan en puertos como el 3000, sin exponer sus puertos internos a internet.

En este tutorial, configurarás Nginx en Ubuntu para reenviar solicitudes a una aplicación local, conectar un dominio y activar HTTPS.

¿Qué es un proxy inverso de Nginx?

Un proxy inverso se sitúa entre los visitantes y la aplicación backend.

En lugar de conectarse directamente a una aplicación que se ejecuta en el puerto 3000, los visitantes se conectan a Nginx a través de los puertos HTTP o HTTPS estándar.

Nginx reenvía la solicitud a la aplicación y devuelve su respuesta.

El flujo de solicitudes es el siguiente:

Visitante → Nginx → Aplicación backend

Esta configuración se utiliza habitualmente con Node.js, Python y otras aplicaciones web. También puede permitir la terminación TLS, el balanceo de carga y la gestión centralizada de solicitudes.

¿Necesitas un VPS para tu configuración de Nginx?
Despliega tus aplicaciones con acceso root y recursos de servidor flexibles.
Explora los planes VPS →

Requisitos previos

Antes de empezar, necesitarás:

  • Un servidor con Ubuntu 24.04 LTS y acceso sudo.
  • Acceso SSH a tu servidor.
  • Un nombre de dominio que apunte a la dirección IP pública de tu servidor.
  • Una aplicación backend que escuche en un puerto local.

En este ejemplo, utilizaremos el puerto 3000.

Si no tienes experiencia con SSH, lee nuestra guía de comandos SSH para principiantes antes de continuar.

Cómo configurar un proxy inverso de Nginx

Paso 1: Instala Nginx en Ubuntu

Conéctate a tu servidor Ubuntu mediante SSH.

Actualiza el índice de paquetes e instala Nginx:

sudo apt update
sudo apt install nginx -y

Comprueba si Nginx está en ejecución:

sudo systemctl status nginx

Deberías ver active (running).

Si Nginx no se ha iniciado, ejecuta:

sudo systemctl enable --now nginx

También puedes visitar la dirección IP pública de tu servidor en un navegador. Si se permite el acceso HTTP, debería aparecer la página de bienvenida predeterminada de Nginx.

Si utilizas UFW, permite el tráfico HTTP y HTTPS:

sudo ufw allow 'Nginx Full'

Comprueba también las reglas de cortafuegos configuradas a través de tu proveedor de alojamiento. No desactives el cortafuegos para permitir el acceso a Nginx.

Paso 2: Inicia una aplicación backend de prueba

Antes de configurar el proxy inverso, necesitamos una aplicación a la que Nginx pueda reenviar las solicitudes.

Para hacer una prueba sencilla, crea un directorio temporal:

mkdir -p ~/nginx-proxy-test
cd ~/nginx-proxy-test

Crea una página HTML básica:

echo '<h1>Nginx Reverse Proxy Works!</h1>' > index.html

Ahora inicia el servidor HTTP integrado de Python:

python3 -m http.server 3000 --bind 127.0.0.1

Esto sirve tu página de prueba en el puerto 3000, accesible únicamente a través de la dirección local de loopback.

Deja esta terminal en ejecución y abre una segunda sesión SSH.

Comprueba que la aplicación responde:

curl http://127.0.0.1:3000

Deberías ver:

<h1>Nginx Reverse Proxy Works!</h1>

Este servidor de Python es solo para la demostración. Para una aplicación en producción, utiliza el servidor de aplicaciones y la configuración de gestión de servicios recomendados para ella.

Paso 3: Crea una configuración de proxy inverso de Nginx

Crea un nuevo bloque de servidor de Nginx:

sudo nano /etc/nginx/sites-available/app.example.com

Sustituye app.example.com por tu dominio real.

Añade la siguiente configuración:

server {
    listen 80;
    server_name app.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;
    }
}

Guarda el archivo.

Cómo funciona la configuración

  • listen 80 acepta solicitudes HTTP.
  • server_name especifica el dominio que debe gestionar Nginx.
  • proxy_pass reenvía las solicitudes a la aplicación en el puerto 3000.
  • proxy_set_header transmite al backend información útil sobre la solicitud original.

El backend debe interpretar y gestionar de forma segura las cabeceras reenviadas. Configura las aplicaciones para que confíen en estas cabeceras únicamente cuando las solicitudes lleguen a través de tu proxy de confianza.

Paso 4: Activa y prueba la configuración

Activa el nuevo bloque de servidor:

sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/

Si el enlace ya existe, no vuelvas a crearlo.

Comprueba si hay errores en la configuración:

sudo nginx -t

Si la prueba se completa correctamente, recarga Nginx:

sudo systemctl reload nginx

Ahora abre:

http://app.example.com

Si el DNS apunta al servidor correcto y el backend de prueba sigue en ejecución, deberías ver:

¡El proxy inverso de Nginx funciona!

Si aparece la página predeterminada de Nginx, comprueba los registros DNS de tu dominio y la configuración de server_name.

Paso 5: Activa HTTPS con Let’s Encrypt

Para un sitio web público, utiliza HTTPS en lugar de dejar el tráfico sin cifrar.

Primero, confirma que tu dominio resuelve a la dirección del servidor correcto y que el puerto 80 permite conexiones entrantes. Esto es importante para el proceso estándar de validación de certificados mediante HTTP.

Instala Certbot mediante el método oficial basado en Snap:

sudo snap install --classic certbot

Si el comando certbot aún no está disponible, crea el enlace para el comando:

sudo ln -s /snap/bin/certbot /usr/local/bin/certbot

A continuación, solicita un certificado:

sudo certbot --nginx -d app.example.com

Sigue las indicaciones. Certbot puede obtener un certificado y configurar Nginx para servir tu dominio mediante HTTPS.

Después, prueba la renovación del certificado:

sudo certbot renew --dry-run

Visita:

https://app.example.com

Tu aplicación de prueba debería cargarse ahora mediante una conexión cifrada.

Paso 6: Comprueba tu proxy inverso

Comprueba la respuesta HTTPS:

curl -I https://app.example.com

En el caso del backend de ejemplo en Python, una respuesta HTTP 200 OK indica que la solicitud ha llegado correctamente a la aplicación.

También puedes comprobar qué procesos están escuchando en tu servidor:

sudo ss -ltnp

Tu instalación de Nginx debería escuchar en los puertos públicos HTTP y HTTPS configurados, mientras que el backend de ejemplo escucha en 127.0.0.1:3000.

Recuerda que el servidor temporal de Python se detendrá cuando cierres su sesión de terminal. Las aplicaciones en producción deben ejecutarse bajo un supervisor de procesos como systemd.

Problemas habituales con el proxy inverso de Nginx

502 Bad Gateway

Esto suele significar que Nginx no ha podido recibir una respuesta válida del backend.

Comprueba que tu aplicación esté en ejecución y que el puerto indicado en proxy_pass sea correcto.

504 Gateway Timeout

El error 504 se produce cuando la puerta de enlace no recibe a tiempo la respuesta necesaria del servidor upstream.

Investiga las solicitudes lentas de la aplicación y el rendimiento del backend antes de aumentar los tiempos de espera.

El dominio no carga

Comprueba que el registro A de tu dominio apunte a la dirección IP pública correcta, que los puertos correspondientes estén abiertos en el cortafuegos y que el bloque de servidor de Nginx coincida con el nombre de host solicitado.

Preguntas frecuentes

¿Qué es proxy_pass en Nginx?

proxy_pass indica a Nginx adónde debe reenviar las solicitudes, por ejemplo, a una aplicación HTTP que se ejecuta en 127.0.0.1:3000.

¿Puede Nginx actuar como proxy inverso para varias aplicaciones?

Sí. Puedes configurar distintos dominios, subdominios o rutas URL para reenviar las solicitudes a diferentes aplicaciones backend.

¿Necesito un dominio para un proxy inverso de Nginx?

No. Puedes probar un proxy inverso con una dirección IP o de forma local. Sin embargo, un dominio facilita el alojamiento público y la obtención de un certificado HTTPS estándar.

¿Es gratuito el proxy inverso de Nginx?

Sí. La versión de código abierto de Nginx admite la funcionalidad de proxy inverso sin necesidad de una licencia comercial.

Conclusión

Has configurado un proxy inverso de Nginx en Ubuntu, reenviado solicitudes a una aplicación local y activado HTTPS.

Puedes adaptar la misma configuración básica para Node.js, Python y otras aplicaciones basadas en HTTP actualizando la dirección del backend en proxy_pass.

Antes de utilizar esta configuración en producción, asegúrate de que tu aplicación se inicie automáticamente, se ejecute con los permisos adecuados y cuente con medidas suficientes de monitorización y seguridad.

Table of Content

Un error 502 Bad Gateway en Nginx suele significar que Nginx no ha podido recibir

El error 504 Gateway Timeout se produce cuando un servidor que actúa como puerta de

Un servidor MCP es un programa que permite a las aplicaciones de IA conectarse con

Build your next project with ZYNOO

From your first website to demanding applications, choose the resources and control you need.

Shared Hosting

Start your blog or business website with cPanel, LiteSpeed and CloudLinux.

VPS Hosting

Grow your websites and applications with NVMe storage, KVM virtualization and full root access.

Dedicated Servers

Power demanding projects with your own physical server, dedicated resources and control over your environment.

Scroll al inicio