Administration Serveur

Nginx : configuration et sécurisation Linux

Nginx Linux Https Securite Configuration Production Letsencrypt Web-Server Virtual-Hosts Ssl Reverse-Proxy Hardening Ubuntu Debian
Nginx : configuration et sécurisation Linux

Installez et configurez Nginx sur Linux : virtual hosts, HTTPS avec Let's Encrypt, règles de sécurité et configuration production pour vos apps.

Prérequis

Ce guide suppose que tu as:

  • Un serveur Linux (Ubuntu 20.04+ ou Debian 10+) avec accès root ou sudo
  • Un nom de domaine pointant vers ton serveur
  • Connaissances de base en ligne de commande
Conseil: Nginx est léger, rapide et idéal pour servir des sites statiques, des proxies inverses ou des applications web.

Installation de Nginx

Sur Ubuntu/Debian

sudo apt update
sudo apt install nginx

# Démarrer Nginx
sudo systemctl start nginx

# Activer au démarrage
sudo systemctl enable nginx

# Vérifier le statut
sudo systemctl status nginx

Vérifier que Nginx fonctionne

Visite http://ton-serveur-ip dans le navigateur. Tu devrais voir la page par défaut de Nginx.

Fichiers importants

/etc/nginx/nginx.conf           # Fichier de configuration principal
/etc/nginx/sites-available/     # Configurations des sites disponibles
/etc/nginx/sites-enabled/       # Lien symbolique des sites actifs
/var/www/html/                  # Répertoire par défaut du contenu web
/var/log/nginx/access.log       # Logs d'accès
/var/log/nginx/error.log        # Logs d'erreurs

Configuration de base

Configuration simple pour un site statique

server {
    listen 80;
    listen [::]:80;
    server_name monsite.com www.monsite.com;
    root /var/www/monsite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

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

    access_log /var/log/nginx/monsite.access.log;
    error_log /var/log/nginx/monsite.error.log;
}

Activer le site

sudo ln -s /etc/nginx/sites-available/monsite.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Virtual hosts

Héberger plusieurs sites sur un seul serveur

server {
    listen 80;
    server_name site1.com www.site1.com;
    root /var/www/site1;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Proxy inverse pour Node.js

server {
    listen 80;
    server_name api.monsite.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        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;
    }
}

HTTPS avec Let's Encrypt

Installer Certbot et obtenir un certificat

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d monsite.com -d www.monsite.com

Configuration manuelle HTTPS

server {
    listen 80;
    listen [::]:80;
    server_name monsite.com www.monsite.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name monsite.com www.monsite.com;
    root /var/www/monsite;
    index index.html;

    ssl_certificate /etc/letsencrypt/live/monsite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/monsite.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;

    location / {
        try_files $uri $uri/ =404;
    }
}

Sécurité et optimisations

Restriction d'accès par IP

server {
    listen 80;
    server_name admin.monsite.com;

    allow 192.168.1.0/24;
    allow 10.0.0.1;
    deny all;

    location / {
        # ...
    }
}

Bloquer les fichiers sensibles

location ~ /\. {
    deny all;
}

location ~ ~$ {
    deny all;
}

Compression GZIP

http {
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json;
}

Limiter les requêtes

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

server {
    location / {
        limit_req zone=one burst=20 nodelay;
    }
}

Bonnes pratiques

1. Valider avant de recharger

sudo nginx -t        # Valide la syntaxe
sudo systemctl reload nginx  # Recharge sans interruption

2. Monitorer les logs

tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

3. Permissions des fichiers

sudo chown -R www-data:www-data /var/www/monsite
sudo chmod -R 755 /var/www/monsite

4. Backup de la configuration

sudo tar -czf nginx-backup-$(date +%Y%m%d).tar.gz /etc/nginx/

5. Redirection www vers non-www

server {
    listen 80 443 ssl http2;
    server_name www.monsite.com;
    return 301 $scheme://monsite.com$request_uri;
}

Questions fréquentes

Headers de sécurité Nginx essentiels à configurer dans le server block : add_header X-Frame-Options "SAMEORIGIN" always; (protège contre le clickjacking), add_header X-Content-Type-Options "nosniff" always; (bloque le MIME sniffing), add_header X-XSS-Protection "1; mode=block" always; (protection XSS navigateur), add_header Referrer-Policy "strict-origin-when-cross-origin" always; (contrôle les informations de referer), add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; (restreint les APIs navigateur). Le plus important : add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'nonce-{RANDOM}'; style-src 'self' 'unsafe-inline'" always; — à personnaliser selon vos sources autorisées. Testez via securityheaders.com.

Installation HTTPS Nginx avec Certbot (Let's Encrypt) : (1) Installez Certbot : apt install certbot python3-certbot-nginx (Debian/Ubuntu), (2) Obtenez et installez le certificat : certbot --nginx -d monsite.com -d www.monsite.com — Certbot modifie automatiquement la configuration Nginx, (3) Vérifiez le renouvellement automatique : certbot renew --dry-run. Nginx optimisé HTTPS : ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; — HSTS force le HTTPS pour les futures visites. Testez via ssllabs.com/ssltest pour obtenir un A+.

Protection DDoS basique avec Nginx : (1) Rate limiting par IP : limit_req_zone $binary_remote_addr zone=global:10m rate=100r/s; et limit_req zone=global burst=200 nodelay; — limite à 100 req/s par IP avec un burst de 200. (2) Limiter les connexions simultanées : limit_conn_zone $binary_remote_addr zone=conn_limit:10m; et limit_conn conn_limit 20; — max 20 connexions par IP. (3) Timeouts agressifs : client_header_timeout 10s; client_body_timeout 10s; keepalive_timeout 30s; — termine les connexions lentes (slowloris attack). (4) Limiter la taille des requêtes : client_max_body_size 1m; — bloque les uploads massifs. (5) Bloquer les user agents malveillants : if ($http_user_agent ~* "curl|wget|libwww-perl|python") { return 403; } — à adapter selon votre besoin.

Optimisations performances Nginx : worker_processes auto; — utilise tous les CPU disponibles. worker_connections 1024; — connexions par worker. sendfile on; tcp_nopush on; tcp_nodelay on; — optimise les transferts fichiers. gzip on; gzip_types text/plain text/css application/json application/javascript text/xml; gzip_min_length 1000; — compression Gzip. Activez Brotli si disponible (module ngx_brotli) pour meilleure compression. Cache static assets : location ~* \.(css|js|png|jpg|webp)$ { expires 1y; add_header Cache-Control "public, immutable"; } — évite les rechargements inutiles. open_file_cache max=1000 inactive=20s; — cache les file descriptors. Pour PHP-FPM, optimisez fastcgi_cache pour mettre en cache les réponses PHP fréquentes.

Partager