Nginx est un serveur web haute performance, proxy inverse et load balancer largement utilisé pour servir des sites web et des applications modernes.
⚙️ Gestion du service
📌 Action 🧠 Commande ▶️ Démarrer nginx sudo systemctl start nginx⏹️ Arrêter nginx sudo systemctl stop nginx🔁 Redémarrer nginx sudo systemctl restart nginx🔄 Recharger la config sudo systemctl reload nginx📊 Statut du service sudo systemctl status nginx🚀 Activer au démarrage sudo systemctl enable nginx✅ Tester la configuration sudo nginx -t📋 Version de nginx nginx -v
📂 Configuration
📌 Fichier/Dossier 🧠 Description /etc/nginx/nginx.confConfiguration principale /etc/nginx/sites-available/Sites disponibles /etc/nginx/sites-enabled/Sites actifs (liens symboliques) /etc/nginx/conf.d/Configurations additionnelles /var/log/nginx/Logs d’accès et d’erreur /var/www/html/Répertoire web par défaut /usr/share/nginx/html/Pages par défaut nginx
🌐 Gestion des sites
📌 Action 🧠 Commande 📝 Créer un site sudo nano /etc/nginx/sites-available/monsite🔗 Activer un site sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/❌ Désactiver un site sudo rm /etc/nginx/sites-enabled/monsite📋 Lister sites actifs ls -la /etc/nginx/sites-enabled/✅ Vérifier la config sudo nginx -t && sudo systemctl reload nginx🗑️ Supprimer un site sudo rm /etc/nginx/sites-available/monsite
📍 Directive de base
📌 Directive 🧠 Description 📊 Exemple listenPort d’écoute listen 80;server_nameNom du serveur server_name exemple.com;rootRépertoire racine root /var/www/html;indexFichiers d’index index index.html index.php;error_pagePages d’erreur personnalisées error_page 404 /404.html;
📝 Configuration basique de site
Site statique simple
server {
listen 80 ;
server_name exemple.com www.exemple.com;
root /var/www/exemple.com;
index index.html index.htm;
location / {
try_files $uri $uri/ =404 ;
}
}
Site avec PHP (FastCGI)
server {
listen 80 ;
server_name exemple.com;
root /var/www/exemple.com;
index index.php index.html;
location / {
try_files $uri $uri/ =404 ;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Proxy vers application
server {
listen 80 ;
server_name app.exemple.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
🔒 Configuration SSL/HTTPS
📌 Action 🧠 Commande 🔐 Générer certificat auto-signé sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx.key -out /etc/ssl/certs/nginx.crt🌐 Installer Certbot sudo apt install certbot python3-certbot-nginx🔒 Obtenir cert Let’s Encrypt sudo certbot --nginx -d exemple.com🔄 Renouveler certificats sudo certbot renew⏰ Auto-renouvellement sudo crontab -e → 0 0 * * * certbot renew --quiet
Configuration HTTPS
server {
listen 443 ssl http2;
server_name exemple.com;
ssl_certificate /etc/ssl/certs/exemple.com.crt;
ssl_certificate_key /etc/ssl/private/exemple.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on ;
root /var/www/exemple.com;
index index.html;
}
# Redirection HTTP vers HTTPS
server {
listen 80 ;
server_name exemple.com;
return 301 https://$server_name$request_uri;
}
📊 Logs et monitoring
📌 Action 🧠 Commande 📜 Logs d’accès en temps réel sudo tail -f /var/log/nginx/access.log❌ Logs d’erreur en temps réel sudo tail -f /var/log/nginx/error.log🔍 Rechercher dans les logs sudo grep "404" /var/log/nginx/access.log📈 Statistiques des codes `awk ‘{print $9}’ /var/log/nginx/access.log 🌐 Top des IPs visiteurs `awk ‘{print $1}’ /var/log/nginx/access.log 📊 Pages les plus visitées `awk ‘{print $7}’ /var/log/nginx/access.log
Configuration générale (/etc/nginx/nginx.conf)
# Processus et connexions
worker_processes auto;
worker_connections 1024 ;
# Optimisation fichiers
sendfile on ;
tcp_nopush on ;
tcp_nodelay on ;
# Gestion timeouts
keepalive_timeout 65 ;
client_max_body_size 64M ;
# Compression Gzip
gzip on ;
gzip_vary on ;
gzip_min_length 1024 ;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
Cache statique (accélérer les fichiers images/CSS/JS)
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y; # Cache 1 an
add_header Cache-Control "public" ; # Cache public
}
⚖️ Load Balancing
Configuration upstream
upstream backend {
server 192.168.1.10:8080 weight = 3 ;
server 192.168.1.11:8080 weight = 2 ;
server 192.168.1.12:8080 backup;
}
server {
listen 80 ;
server_name app.exemple.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Méthodes de load balancing
# Round robin (défaut)
upstream backend {
server srv1.exemple.com;
server srv2.exemple.com;
}
# Least connections
upstream backend {
least_conn ;
server srv1.exemple.com;
server srv2.exemple.com;
}
# IP Hash (session sticky)
upstream backend {
ip_hash ;
server srv1.exemple.com;
server srv2.exemple.com;
}
🛡️ Sécurité
📌 Protection 🧠 Configuration 🚫 Masquer version nginx server_tokens off;🔒 Headers de sécurité add_header X-Content-Type-Options nosniff;🛡️ Protection XSS add_header X-XSS-Protection "1; mode=block";🔐 HSTS add_header Strict-Transport-Security "max-age=31536000";❌ Bloquer IPs deny 192.168.1.100;✅ Autoriser seulement allow 192.168.1.0/24; deny all;
Configuration sécurisée
# Headers de sécurité
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self' http: https: ws: wss: data: blob: 'unsafe-inline'; frame-ancestors 'self';" always;
# Cacher fichiers sensibles
location ~ /\. {
deny all ;
}
location ~* \.(conf|ini|sql|sh|py|yml|yaml)$ {
deny all ;
}
🛠️ Dépannage courant
🆘 Problème 🧠 Solution ❌ Erreur de config sudo nginx -t puis corriger les erreurs🚫 403 Forbidden Vérifier permissions des fichiers 🔍 404 Not Found Vérifier root et index dans la config 📡 Connexion refusée Vérifier que nginx écoute sur le bon port 🔧 Proxy error Vérifier que l’application backend fonctionne 📝 Logs vides Vérifier les permissions du dossier logs