Administration Serveur angularforall.com

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

Partager