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.conf
Configuration 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 listen
Port d’écoute listen 80;
server_name
Nom du serveur server_name exemple.com;
root
Répertoire racine root /var/www/html;
index
Fichiers d’index index index.html index.php;
error_page
Pages 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