Nginx : configuration et sécurisation

🏷️ Administration Serveur 📅 30/03/2026 09:00:00 👤 Mezgani said
Nginx Linux Https Securite
Nginx : configuration et sécurisation

Installer et configurer Nginx sur un serveur Linux, gérer les virtual hosts, le HTTPS avec Let's Encrypt et les règles de sécurité de base.

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;
}