Instalar y proteger Nginx en Ubuntu

Configura Nginx, un sitio, UFW, HTTPS, permisos y comprobaciones conservando el acceso remoto.

Instalar y proteger Nginx en Ubuntu

Configura Nginx, un sitio, UFW, HTTPS, permisos y comprobaciones conservando el acceso remoto.

Requisitos y DNS

Usa Ubuntu Server actualizado y sudo. Para HTTPS, example.com debe apuntar a la IP pública. Publica www o AAAA solo si funcionan. Mantén otra sesión SSH y acceso de rescate; comprueba A/AAAA con dig.

Instalación y verificación

Instala el paquete Ubuntu y comprueba servicio, sintaxis y respuesta HTTP local. Un HTTP 200 local no prueba acceso público.

sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo systemctl enable --now nginx
sudo nginx -t
curl -I http://127.0.0.1

Cortafuegos UFW

Antes de habilitar UFW, permite el puerto SSH real. OpenSSH en el ejemplo asume el perfil estándar; para otro puerto usa NÚMERO/tcp. Nginx Full abre TCP 80/443. Prueba otra sesión SSH sin cerrar la primera. Revisa también firewall del proveedor e IPv6.

sudo ufw status verbose
sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose

Directorio y permisos

El ejemplo estático pertenece al administrador, grupo www-data, directorios 750 y archivos 640. Comprueba acceso a cada directorio padre. Las aplicaciones dinámicas necesitan reglas propias; evita chown -R generalizado y 777.

sudo install -d -o "$USER" -g www-data -m 750 /var/www/example.com/public
printf '%s
' '<!doctype html><title>Example</title><h1>It works</h1>' | tee /var/www/example.com/public/index.html >/dev/null
chmod 640 /var/www/example.com/public/index.html

Bloque HTTP

Crea /etc/nginx/sites-available/example.com. Empieza solo con example.com; añade www si DNS y certificado lo cubren. La regla para archivos ocultos puede afectar /.well-known/: prueba el desafío HTTP y deja que el plugin Nginx gestione la excepción o define una location explícita para el desafío.

server {
    listen 80;
    listen [::]:80;
    server_name example.com;
    root /var/www/example.com/public;
    index index.html;
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
    location / { try_files $uri $uri/ =404; }
    location ~ /\. { deny all; }
}

Activación y prueba

Crea el enlace si no existe, ejecuta nginx -t antes de reload y prueba el Host local. Deshabilita el sitio por defecto solo tras confirmar que no se necesita. Corrige errores antes de recargar.

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I -H 'Host: example.com' http://127.0.0.1

Certificado HTTPS

Sigue las instrucciones Certbot actuales. Snap está soportado; usar /snap/bin/certbot evita conflictos con otros enlaces. example.com debe ser público por el puerto 80. El ejemplo pide certificado solo para ese nombre. Certbot puede modificar el bloque; comprueba redirección, certificado y renovación simulada.

sudo snap install --classic certbot
sudo /snap/bin/certbot --nginx -d example.com
sudo nginx -t && sudo systemctl reload nginx
curl -I https://example.com
sudo /snap/bin/certbot renew --dry-run

Cabeceras y límites

server_tokens off oculta la versión, pero no garantiza seguridad. Adapta las cabeceras y considera cómo add_header se hereda en las locations. SAMEORIGIN puede bloquear marcos legítimos. 8m es solo ejemplo. Activa HSTS tras probar HTTPS y subdominios, sin preload al principio.

server_tokens off;
add_header X-Content-Type-Options nosniff always;
add_header Referrer-Policy strict-origin-when-cross-origin always;
add_header X-Frame-Options SAMEORIGIN always;
client_max_body_size 8m;

Proxy inverso opcional

Sustituye la location / estática por este bloque: no dupliques la misma location. Haz que el backend escuche solo en 127.0.0.1:8080 si no debe ser público. Confía en cabeceras reenviadas solo desde el proxy previsto; prueba redirecciones, WebSockets y tiempos de espera.

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;
    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;
}

Mantenimiento y registros

Actualiza sistema y aplicaciones; evalúa unattended-upgrades según tu política. Revisa logs, espacio y nginx -t. Un 403 puede indicar permisos o falta de índice; un 502, backend caído. Prueba antes de recargar.

sudo tail -f /var/log/nginx/example.com.error.log
sudo journalctl -u nginx --since '1 hour ago'
df -h
sudo nginx -t

Comprobación final

Verifica SSH tras UFW, DNS/IPv6, puertos, permisos, nginx -t, HTTPS y renovación simulada. Ajusta subidas, cabeceras y proxy a la aplicación. Guarda copias de configuración y supervisa servicios.

Fuentes oficiales

Nginx: https://nginx.org/en/docs/ ; Certbot: https://certbot.eff.org/instructions?ws=nginx&os=snap ; UFW: https://documentation.ubuntu.com/server/how-to/security/firewalls/ .

Compartir

¿Cuál es tu reacción?

Me gusta Me gusta 0
No me gusta No me gusta 0
Me encanta Me encanta 0
Divertido Divertido 0
Enfadado Enfadado 0
Triste Triste 0
¡Vaya! ¡Vaya! 0