Nginx
Linux
Https
Securite
Configuration
Production
Letsencrypt
Web-Server
Virtual-Hosts
Ssl
Reverse-Proxy
Hardening
Ubuntu
Debian
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.