Guias

Nginx en Ubuntu 24.04: configurar reverse proxy + HTTPS automático (guía 2026)

Nginx es el servidor web más usado del mundo (más que Apache, más que cualquier otro). Es liviano, rápido, y sirve tanto páginas estáticas como proxy reverso. Esta guía te lleva de cero a un sitio funcionando con HTTPS en menos de 30 minutos.

TL;DR — Lo que vas a tener al final

  • Tiempo de setup: 30 minutos para instalación, 1-2 horas para upgrade in-place.
  • Requisitos: Backup de /home, conexión a internet, 20+ GB libres.
  • Resultado: Sistema actualizado con soporte extendido, drivers funcionando.
  • Troubleshooting: dnf distro-sync, akmods para NVIDIA, journalctl -p err.

¿Qué es Nginx?

Nginx (pronunciado “engine-x”) es un servidor HTTP, proxy reverso, y balanceador. Lo inventó un ruso llamado Igor Sysoev en 2004 específicamente para resolver el problema C10K (manejar 10.000 conexiones simultáneas).

¿Por qué Nginx y no Apache?

Nginx Apache
Rendimiento con archivos estáticos Muy rápido OK
Consumo de memoria Bajo Alto
Configuración Más simple Más flexible
.htaccess ❌ ✅
Proxy reverso Excelente Mejor con mod_proxy
Ecosistema WordPress Compatible Más plugins

Si vas a servir un sitio estático o hacer reverse proxy, Nginx es la elección clara.

Antes de empezar

Asumimos:

  • Ubuntu 24.04 LTS fresco.
  • Acceso root o sudo.
  • DNS apuntando a tu IP pública (ej: ejemplo.com → 203.0.113.50).
  • Puertos 80 y 443 abiertos en el firewall.

Para desarrollo local (no necesitas DNS ni dominio), puedes seguir los pasos hasta HTTPS. Let’s Encrypt requiere dominio real.

Paso 1: Instalar Nginx

sudo apt update
sudo apt install nginx -y

Lo que se instaló:

  • nginx — el demonio
  • nginx-common — archivos compartidos
  • nginx-full (o nginx-core en servidores) — versión con módulos extra

Después de instalar, Nginx ya arranca automáticamente. verifica:

sudo systemctl status nginx

Deberías ver active (running).

Verificación rápida:

curl -I http://localhost

Deberías ver HTTP/1.1 200 OK y Server: nginx/1.24.x.

Paso 2: Configurar el firewall

Ubuntu usa UFW por default. Nginx trae perfiles preconfigurados:

sudo ufw app list

Vas a ver:

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

habilita solo lo que necesitas:

# Permitir HTTP y HTTPS
sudo ufw allow 'Nginx Full'
# O solo HTTP (sin HTTPS por ahora)
sudo ufw allow 'Nginx HTTP'
# O solo HTTPS (cuando ya configures TLS)
sudo ufw allow 'Nginx HTTPS'

verifica:

sudo ufw status

Deberías ver Nginx Full ALLOW en Anywhere.

Paso 3: Entender la estructura de archivos

Nginx en Ubuntu tiene esta estructura (importante para no romper nada):

/etc/nginx/
├── nginx.conf              # Config principal (no edites este)
├── sites-available/        # Configs de sitios (aún no activos)
│   └── default
├── sites-enabled/          # Symlinks a sites-available (estos SÍ están activos)
│   └── default -> /etc/nginx/sites-available/default
├── conf.d/                 # Configs adicionales (se incluyen automáticamente)
│   ├── gzip.conf
│   └── security.conf
└── snippets/               # Bloques de config reusables
    ├── fastcgi-php.conf
    └── snakeoil.conf

Reglas de oro:

1. NUNCA edites nginx.conf directamente salvo para ajustes globales.

2. Cada sitio tiene su archivo en sites-available/.

3. Para activar, haz symlink a sites-enabled/ (o usa ln -s).

4. include /etc/nginx/sites-enabled/*; es lo que carga las configs activas.

Paso 4: Tu primer sitio

Vamos a configurar ejemplo.com para que sirva una página estática.

4.1 Crear el directorio del sitio

sudo mkdir -p /var/www/ejemplo.com/html
sudo chown -R $USER:$USER /var/www/ejemplo.com/html

4.2 Crear el index.html

nano /var/www/ejemplo.com/html/index.html

Pegá esto:




    
    Mi sitio Nginx
    


    

¡Nginx funciona!

Si ves esto, tu servidor está sirviendo tu página correctamente.

4.3 Crear el server block

sudo nano /etc/nginx/sites-available/ejemplo.com

Pegá:

server {
    listen 80;
    listen [::]:80;
    server_name ejemplo.com www.ejemplo.com;
    root /var/www/ejemplo.com/html;
    index index.html;
    location / {
        try_files $uri $uri/ =404;
    }
    # Logs
    access_log /var/log/nginx/ejemplo.com.access.log;
    error_log /var/log/nginx/ejemplo.com.error.log;
}

4.4 Activar el sitio

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

4.5 (Opcional) Desactivar el default

sudo unlink /etc/nginx/sites-enabled/default

Si no lo hacés, Nginx va a servir tu sitio cuando alguien entre con un dominio que no está en ningún server_name.

4.6 Test y reload

# Testear la config
sudo nginx -t

Deberías ver syntax is ok y test is successful.

# Recargar
sudo systemctl reload nginx

Ahora visitá http://ejemplo.com (o http://localhost si es local) y vas a ver tu página.

Paso 5: HTTPS con Let’s Encrypt (gratis)

Let’s Encrypt da certificados TLS gratis. Lo instalas con Certbot.

sudo apt install certbot python3-certbot-nginx -y

Certbot tiene un plugin para Nginx que edita la config automáticamente:

sudo certbot --nginx -d ejemplo.com -d www.ejemplo.com

Te va a preguntar:

1. Email — para avisos de renovación.

2. Agree to ToS — sí.

3. Share email with EFF? — tu decisión.

4. Redirect HTTP to HTTPS? — Sí (recomendado).

Después de correr, Certbot:

  • Obtuvo el certificado.
  • Modificó tu server block para HTTPS.
  • Agregó redirect HTTP→HTTPS.
  • Configuró renovación automática.

Verificación:

curl -I https://ejemplo.com

Deberías ver HTTP/2 200 y headers de seguridad.

Renovación automática

Certbot instala un systemd timer que renueva automáticamente. verifica:

sudo systemctl status certbot.timer
systemctl list-timers | grep certbot

Test manual de renovación:

sudo certbot renew --dry-run

Si todo está OK, vas a ver “Congratulations, all simulated renewals succeeded”.

Paso 6: Configuraciones útiles que vas a querer

Headers de seguridad

# /etc/nginx/conf.d/security.conf
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

Reload: sudo systemctl reload nginx.

Compresión gzip

# /etc/nginx/conf.d/gzip.conf
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript
           application/json application/javascript application/xml+rss
           image/svg+xml;

Rate limiting básico

# /etc/nginx/conf.d/rate-limit.conf
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
server {
    # ...
    location /api/ {
        limit_req zone=general burst=20 nodelay;
        # Definí el upstream en otro archivo, por ej:
        #   upstream backend { server 127.0.0.1:3000; }
        # o usa directamente un destino:
        proxy_pass http://127.0.0.1:3000;
    }
}

Cache para archivos estáticos

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

Paso 7: Reverse proxy (bonus)

Si tienes una app que corre en localhost:3000 y quieres servirla desde ejemplo.com/api:

location /api/ {
    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;
}

Ejemplo real — Nextcloud + Nginx en Ubuntu:

mira nuestra guía de Cómo instalar Nextcloud en Ubuntu 22.04.

Troubleshooting

“502 Bad Gateway”

El backend (proxy_pass) no responde. verifica:

sudo systemctl status mi-app
curl -I http://localhost:3000

Si la app está caída, arrancala. Si está en otro puerto, ajustá proxy_pass.

“Permission denied” en archivos

Nginx corre como www-data. Tus archivos necesitan ser legibles por ese user:

sudo chown -R www-data:www-data /var/www/ejemplo.com/
sudo chmod -R 755 /var/www/ejemplo.com/

“Server name conflict”

Si dos server blocks escuchan en el mismo dominio/puerto, Nginx usa el primero. Asegurate de tener un solo server_name ejemplo.com activo.

Logs

# Logs del sitio
sudo tail -f /var/log/nginx/ejemplo.com.error.log
sudo tail -f /var/log/nginx/ejemplo.com.access.log
# Logs generales
sudo tail -f /var/log/nginx/error.log

Test de configuración antes de recargar

SIEMPRE corré sudo nginx -t antes de systemctl reload. Si la sintaxis está mal, Nginx NO recarga y queda con la config vieja. Si reloada una config rota, queda fuera de servicio.

sudo nginx -t && sudo systemctl reload nginx

Alias útil:

# En ~/.bashrc
alias ngrep='sudo nginx -t && sudo systemctl reload nginx && echo "✓ Nginx reloaded"'

Performance: optimizaciones avanzadas

Worker processes

# /etc/nginx/nginx.conf (sólo editá esta parte)
worker_processes auto;        # auto = 1 por CPU
worker_connections 1024;      # conexiones por worker

Buffers

client_body_buffer_size 10K;
client_header_buffer_size 1k;
client_max_body_size 8m;       # máximo upload
large_client_header_buffers 2 1k;

FastCGI cache (para WordPress/PHP)

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m max_size=1g inactive=60m;
location ~ .php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 60m;
    # ...
}

Si quieres ver un setup completo con PHP-FPM + WordPress, nuestra guía de WordPress + Podman tiene los detalles.

Preguntas frecuentes

¿Por qué Nginx en Ubuntu 24.04: configurar reverse proxy + HTTPS automático (guía 2026) es relevante para sysadmins Linux?

Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.

¿Qué necesito para empezar con Nginx en Ubuntu 24.04: configurar?

Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.

¿Cuáles son los errores más comunes con Nginx en Ubuntu 24.04: configurar?

Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.

¿Cuándo usar Nginx en Ubuntu 24.04: configurar y cuándo una alternativa?

Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.

¿Cómo migro desde una configuración previa a Nginx en Ubuntu 24.04: configurar?

Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.

Lee también

Alfonso Moreno | Sysadmin Senior

Soy Alfonso, sysadmin senior con RHCE y más de 10 años administrando sistemas Linux para empresas y proyectos personales. Me especializo en infraestructura, redes, virtualización, monitoring, automation y self-hosting. Sobre SoyLinux.com SoyLinux.com es un blog técnico en español sobre Linux, software libre y self-hosting. Lo mantengo en mi tiempo libre. Áreas de expertise - Linux server administration: RHEL, CentOS, Rocky, Alma, Fedora, Debian, Ubuntu - Network services: Postfix, BIND, Samba, NFS, Squid - Virtualización y containers: KVM, Proxmox, Docker, Podman - Monitoring: Prometheus, Grafana, Zabbix - Automation: Ansible, Bash scripting - Self-hosting: Vaultwarden, Nextcloud, Jellyfin, Immich, Homelab Contacto - Email: [email protected]

One thought on “Nginx en Ubuntu 24.04: configurar reverse proxy + HTTPS automático (guía 2026)”

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *