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.comse 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 80server_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 entrantesproxy_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
- El cliente envía una solicitud a example.com
- Nginx recibe la solicitud en el puerto 80
- Nginx reenvía la solicitud a 127.0.0.1:3000
- El backend procesa la solicitud
- La respuesta regresa a través de Nginx
- 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:
- Preguntará qué dominio deseas asegurar
- Verificará la propiedad del dominio
- Actualizará automáticamente tu configuración de Nginx
- Recargará Nginx
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
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.