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