Configura Nginx como proxy inverso con SSL y Let's Encrypt
Aprende a configurar Nginx como proxy inverso con SSL gratuito de Let's Encrypt paso a paso, seguro y optimizado.
Si usas Nginx para servir aplicaciones web o APIs, sabes que exponer puertos directamente no es lo más elegante ni seguro. Un reverse proxy te permite redirigir tráfico hacia servicios internos (como Node.js, Python o Docker) usando un único punto de entrada. Y si encima lo blindas con SSL gratis vía Let’s Encrypt, tienes una configuración profesional en pocos minutos.
Vamos al grano: configurar Nginx como proxy inverso con certificados SSL automáticos en Ubuntu.
Requisitos previos
Antes de empezar, asegúrate de tener:
- Un servidor Ubuntu 22.04 o 24.04 con Nginx instalado (
sudo apt install nginx). - Un dominio apuntando a la IP pública de tu servidor (ejemplo:
miapp.mohamedch.com). - Puertos 80 y 443 abiertos en el firewall (UFW:
sudo ufw allow 80/tcp && sudo ufw allow 443/tcp).
Configurar el sitio como proxy inverso
Crea un archivo de configuración para tu dominio en /etc/nginx/sites-available/:
sudo nano /etc/nginx/sites-available/miapp
Pega este bloque básico (ajusta server_name y proxy_pass a tu caso). Aquí redirigimos a un servicio local en el puerto 3000:
server {
listen 80;
server_name miapp.mohamedch.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;
}
}
Habilita el sitio y prueba la sintaxis:
sudo ln -s /etc/nginx/sites-available/miapp /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Si tu servicio corre en localhost:3000, ya deberías verlo accediendo vía HTTP. Ahora toca el SSL.
Instalar y configurar Certbot para SSL automático
Usaremos Certbot con el plugin de Nginx, que modifica la configuración automáticamente:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d miapp.mohamedch.com
Sigue el asistente: introduce tu email, acepta términos y elige si redirigir HTTP a HTTPS (recomiendo sí). Certbot hará lo siguiente:
- Obtendrá el certificado de Let’s Encrypt.
- Modificará el bloque
serverpara añadirlisten 443 ssly las rutas a los archivos.pem. - Añadirá un bloque
serverpara redirigir HTTP a HTTPS si se lo pides.
Puedes verificar que la renovación automática funciona:
sudo certbot renew --dry-run
Si todo sale bien, tu sitio ya sirve contenido por HTTPS.
Buenas prácticas y ajustes finales
Para que el proxy sea más robusto, añade estas cabeceras de seguridad dentro del bloque location:
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
Si tu servicio usa WebSockets (por ejemplo, con Node.js o Django Channels), las dos primeras líneas son imprescindibles.
Además, puedes forzar HTTPS a nivel de Nginx añadiendo en el bloque server que escucha en el puerto 80:
return 301 https://$server_name$request_uri;
Recuerda comprobar los logs si algo falla: tail -f /var/log/nginx/error.log.
Conclusión
Con Nginx como proxy inverso y Let’s Encrypt gestionado por Certbot, tienes una solución sólida, segura y gratuita para exponer tus aplicaciones. En apenas diez minutos has montado un sistema que escala, se renueva solo y te ahorra problemas de puertos y certificados caducados. Para entornos de producción, añade rate limiting y monitorización, pero esta base ya te cubre lo esencial.