skip to content

Recherche

Nginx

Serveur web Nginx - configuration, virtual hosts, SSL et optimisation !

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 nginxsudo systemctl start nginx
⏹️ Arrêter nginxsudo systemctl stop nginx
🔁 Redémarrer nginxsudo systemctl restart nginx
🔄 Recharger la configsudo systemctl reload nginx
📊 Statut du servicesudo systemctl status nginx
🚀 Activer au démarragesudo systemctl enable nginx
✅ Tester la configurationsudo nginx -t
📋 Version de nginxnginx -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 sitesudo nano /etc/nginx/sites-available/monsite
🔗 Activer un sitesudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
❌ Désactiver un sitesudo rm /etc/nginx/sites-enabled/monsite
📋 Lister sites actifsls -la /etc/nginx/sites-enabled/
✅ Vérifier la configsudo nginx -t && sudo systemctl reload nginx
🗑️ Supprimer un sitesudo rm /etc/nginx/sites-available/monsite

📍 Directive de base

📌 Directive🧠 Description📊 Exemple
listenPort d’écoutelisten 80;
server_nameNom du serveurserver_name exemple.com;
rootRépertoire racineroot /var/www/html;
indexFichiers d’indexindex index.html index.php;
error_pagePages d’erreur personnaliséeserror_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 Certbotsudo apt install certbot python3-certbot-nginx
🔒 Obtenir cert Let’s Encryptsudo certbot --nginx -d exemple.com
🔄 Renouveler certificatssudo certbot renew
⏰ Auto-renouvellementsudo crontab -e0 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éelsudo tail -f /var/log/nginx/access.log
❌ Logs d’erreur en temps réelsudo tail -f /var/log/nginx/error.log
🔍 Rechercher dans les logssudo 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

🔧 Optimisation et performance

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 nginxserver_tokens off;
🔒 Headers de sécuritéadd_header X-Content-Type-Options nosniff;
🛡️ Protection XSSadd_header X-XSS-Protection "1; mode=block";
🔐 HSTSadd_header Strict-Transport-Security "max-age=31536000";
❌ Bloquer IPsdeny 192.168.1.100;
✅ Autoriser seulementallow 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 configsudo nginx -t puis corriger les erreurs
🚫 403 ForbiddenVérifier permissions des fichiers
🔍 404 Not FoundVérifier root et index dans la config
📡 Connexion refuséeVérifier que nginx écoute sur le bon port
🔧 Proxy errorVérifier que l’application backend fonctionne
📝 Logs videsVérifier les permissions du dossier logs