Instalar y proteger Nginx en Ubuntu
Configura Nginx, un sitio, UFW, HTTPS, permisos y comprobaciones conservando el acceso remoto.
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
0
No me gusta
0
Me encanta
0
Divertido
0
Enfadado
0
Triste
0
¡Vaya!
0