Cómo configurar Nginx reverse proxy con SSL y Let's Encrypt

Aprende a configurar Nginx como proxy inverso con SSL y Let's Encrypt paso a paso, asegurando y optimizando tu servidor web.

Si gestionas varios servicios web en un mismo servidor, sabrás que abrir múltiples puertos o lidiar con certificados por separado puede volverse un caos. Usar Nginx como proxy inverso no solo centraliza el tráfico, sino que además te permite añadir SSL de forma limpia con Let’s Encrypt. Aquí te explico cómo hacerlo paso a paso en Ubuntu.

Requisitos previos

Antes de empezar, necesitas tener:

  • Un servidor Ubuntu (20.04 o 22.04) con Nginx instalado.
  • Un dominio apuntando a la IP pública del servidor (por ejemplo, servicio1.mohamedch.com).
  • Acceso root o sudo.
  • Puerto 80 y 443 abiertos en el firewall.

Si no tienes Nginx, instálalo:

sudo apt update
sudo apt install nginx -y

Configurar el proxy inverso básico

Vamos a crear un archivo de configuración para un servicio que corre, por ejemplo, en localhost:3000. Crea un archivo en /etc/nginx/sites-available/:

sudo nano /etc/nginx/sites-available/mi-servicio

Pega esto (ajusta el server_name y proxy_pass según tu caso):

server {
    listen 80;
    server_name servicio1.mohamedch.com;

    location / {
        proxy_pass http://localhost: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 recarga Nginx:

sudo ln -s /etc/nginx/sites-available/mi-servicio /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Prueba a acceder por HTTP. Si ves tu servicio, el proxy funciona.

Añadir SSL con Let’s Encrypt

Usaremos Certbot, la herramienta oficial de Let’s Encrypt. Instálala:

sudo apt install certbot python3-certbot-nginx -y

Ejecuta Certbot para obtener el certificado automáticamente. El flag --nginx modifica la configuración por ti:

sudo certbot --nginx -d servicio1.mohamedch.com

Sigue el asistente: introduce tu email, acepta los términos y elige si redirigir HTTP a HTTPS (recomiendo que sí). Certbot se encargará de:

  • Obtener el certificado.
  • Modificar tu archivo de configuración para añadir el bloque listen 443 ssl.
  • Configurar la renovación automática.

Para verificar que la renovación automática está activa:

sudo systemctl status certbot.timer

Verificación y ajustes finales

Comprueba que tu sitio carga por HTTPS. Mira el archivo de configuración final, debería verse similar a esto:

server {
    listen 443 ssl;
    server_name servicio1.mohamedch.com;

    ssl_certificate /etc/letsencrypt/live/servicio1.mohamedch.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/servicio1.mohamedch.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
        proxy_pass http://localhost: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;
    }
}

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

Si tienes varios servicios, repite el proceso: crea un archivo por subdominio en sites-available, enlázalo, y ejecuta Certbot con -d para cada uno. Puedes incluso añadir varios dominios en un solo certificado: sudo certbot --nginx -d servicio1.mohamedch.com -d servicio2.mohamedch.com.

Conclusión

Con Nginx como proxy inverso y Let’s Encrypt, tienes una solución gratuita, segura y fácil de mantener. Centralizas el tráfico, los certificados se renuevan solos y cada servicio corre aislado en su puerto interno. Ideal para entornos de producción pequeños o medianos donde no quieres complicarte con configuraciones manuales de SSL.