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 demonionginx-common— archivos compartidosnginx-full(onginx-coreen 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
- Guía Fedora 44: Novedades, Instalación y Upgrade para Sysadmins Linux
- Configura VLANs en Linux con nmcli: Guía paso a paso para sysadmins
- Protege tu SSH: Guía esencial para configurar Fail2ban en Linux
- Guía Definitiva: Configura Kubernetes con kubeadm en Ubuntu para Sysadmins Linux
- Configura Prometheus y Grafana: Guía DevOps para SysAdmins Linux

Pingback: La Controversia del Modo Oscuro en Nginx: por qué sigue sin soporte - Soy Linux