Nginx
Linux
Https
Securite
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;
}