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.
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.

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 80acepta solicitudes HTTP.server_nameespecifica el dominio que debe gestionar Nginx.proxy_passreenvía las solicitudes a la aplicación en el puerto 3000.proxy_set_headertransmite 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.
Nuestra guía sobre cómo solucionar el error 502 Bad Gateway en Nginx explica con más detalle los registros, los servicios upstream y los problemas de conexión.
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.
Consulta nuestra guía para solucionar el error 504 Gateway Timeout si necesitas más instrucciones.
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
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.
Sí. Puedes configurar distintos dominios, subdominios o rutas URL para reenviar las solicitudes a diferentes aplicaciones backend.
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.
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.