L'essentiel
sudo nginx -tvalide toute la configuration avantsudo systemctl reload nginx, qui applique les changements sans couper les connexions en cours ;nginx -Taffiche la configuration compilée complète quand un include masque un réglage.- Un site s'active par lien symbolique de
/etc/nginx/sites-available/vers/etc/nginx/sites-enabled/: retirez le sitedefault, servez les fichiers viatry_files $uri $uri/ =404et bloquez les fichiers cachés aveclocation ~ /\. { deny all; }. - Réglages de base du bloc
http:worker_processes auto,worker_connections 1024,sendfile on,keepalive_timeout 65,client_max_body_size 100M,gzip_comp_level 6etserver_tokens offpour ne pas exposer la version. - HTTPS :
certbot --nginxpose le certificat et la redirection, et le renouvellement automatique se répète à blanc aveccertbot renew --dry-run; en configuration manuelle, tenez-vous àssl_protocols TLSv1.2 TLSv1.3et ajoutezStrict-Transport-Security "max-age=63072000". - En reverse proxy, les WebSockets exigent
proxy_http_version 1.1avec les en-têtesUpgradeetConnection "upgrade", plusX-Real-IPetX-Forwarded-Forpour transmettre l'IP réelle du client ; côté protection,limit_req_zone ... rate=1r/maveclimit_req zone=login burst=5freine le bruteforce sur une page de login.
NGINX est un serveur web haute performance, un reverse proxy et un serveur de cache. Il est connu pour sa stabilité, son faible usage de ressources et sa capacité à gérer de nombreuses connexions simultanées.
Prérequis
- Système : Ubuntu 18.04+ ou Debian 9+ (adaptable à CentOS/RHEL)
- Privilèges : Accès root ou sudo
- Ressources : Minimum 1GB RAM, 10GB d'espace disque
- Réseau : Ports 80 et 443 disponibles
Installation de NGINX
Méthode 1 : Installation depuis les dépôts officiels
La méthode la plus simple pour installer NGINX :
# Mise à jour des paquets
sudo apt update
# Installation de NGINX
sudo apt install nginx -y
# Vérification de l'installation
nginx -v
sudo systemctl status nginx
Méthode 2 : Installation depuis le dépôt officiel NGINX
Pour obtenir la dernière version stable directement depuis NGINX :
# Installation des dépendances
sudo apt install curl gnupg2 ca-certificates lsb-release -y
# Ajout de la clé GPG officielle
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
# Ajout du dépôt officiel
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
# Installation
sudo apt update
sudo apt install nginx -y
Démarrage et activation
# Démarrer NGINX
sudo systemctl start nginx
# Activer au démarrage
sudo systemctl enable nginx
# Vérifier le statut
sudo systemctl status nginx
Ouvrez votre navigateur et accédez à
http://votre-ip. Vous devriez voir la page d'accueil par défaut de NGINX.
Structure des fichiers NGINX
Répertoires importants
- /etc/nginx/ : Configuration principale
- /etc/nginx/sites-available/ : Sites disponibles
- /etc/nginx/sites-enabled/ : Sites activés
- /var/www/html/ : Contenu web par défaut
- /var/log/nginx/ : Logs d'accès et d'erreurs
Fichiers de configuration principaux
# Configuration principale
/etc/nginx/nginx.conf
# Configuration par défaut du site
/etc/nginx/sites-available/default
# Vérifier la syntaxe de la configuration
sudo nginx -t
# Recharger la configuration
sudo systemctl reload nginx
Configuration de base
Configuration globale optimisée
Éditez le fichier principal /etc/nginx/nginx.conf :
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
http {
# Types MIME et charset
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8;
# Optimisations performances
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 100M;
# Sécurité
server_tokens off;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# Compression
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# Logs
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
# Inclure les configurations des sites
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Configuration d'un site web simple
Créez un nouveau site dans /etc/nginx/sites-available/monsite :
server {
listen 80;
listen [::]:80;
server_name exemple.com www.exemple.com;
root /var/www/monsite;
index index.html index.htm index.php;
# Logs spécifiques au site
access_log /var/log/nginx/monsite_access.log;
error_log /var/log/nginx/monsite_error.log;
# Gestion des fichiers statiques
location / {
try_files $uri $uri/ =404;
}
# Cache pour les ressources statiques
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# Sécurité - blocage des fichiers sensibles
location ~ /\. {
deny all;
}
location ~ ~$ {
deny all;
}
}
Activation du site
# Créer le répertoire du site
sudo mkdir -p /var/www/monsite
# Créer une page d'accueil
echo "<h1>Bienvenue sur mon site NGINX</h1>" | sudo tee /var/www/monsite/index.html
# Activer le site
sudo ln -s /etc/nginx/sites-available/monsite /etc/nginx/sites-enabled/
# Désactiver le site par défaut (optionnel)
sudo rm /etc/nginx/sites-enabled/default
# Tester et recharger
sudo nginx -t
sudo systemctl reload nginx
Configuration SSL avec Let's Encrypt
Installation de Certbot
# Installation de Certbot
sudo apt install certbot python3-certbot-nginx -y
# Obtenir un certificat SSL
sudo certbot --nginx -d exemple.com -d www.exemple.com
# Test du renouvellement automatique
sudo certbot renew --dry-run
Configuration SSL manuelle
Exemple de configuration avec SSL :
server {
listen 80;
server_name exemple.com www.exemple.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name exemple.com www.exemple.com;
root /var/www/monsite;
index index.html index.htm;
# Certificats SSL
ssl_certificate /etc/letsencrypt/live/exemple.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/exemple.com/privkey.pem;
# Configuration SSL sécurisée
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# Headers de sécurité
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
location / {
try_files $uri $uri/ =404;
}
}
Configuration en Reverse Proxy
Proxy vers une application Node.js
upstream nodejs_backend {
server 127.0.0.1:3000;
keepalive 32;
}
server {
listen 80;
server_name app.exemple.com;
location / {
proxy_pass http://nodejs_backend;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
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;
proxy_cache_bypass $http_upgrade;
}
}
Load Balancing
upstream backend_servers {
least_conn;
server 192.168.1.10:80 weight=3;
server 192.168.1.11:80 weight=2;
server 192.168.1.12:80 backup;
}
server {
listen 80;
server_name api.exemple.com;
location / {
proxy_pass http://backend_servers;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Health check
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
Optimisations avancées
Cache et performance
# Configuration du cache
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name cache.exemple.com;
location / {
proxy_cache my_cache;
proxy_cache_revalidate on;
proxy_cache_min_uses 3;
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
proxy_cache_background_update on;
proxy_cache_lock on;
proxy_pass http://backend;
add_header X-Cache-Status $upstream_cache_status;
}
}
Limitation du taux de requêtes
http {
# Zone de limitation
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/m;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/m;
server {
listen 80;
server_name api.exemple.com;
location /api/ {
limit_req zone=api burst=20 nodelay;
proxy_pass http://backend;
}
location /login {
limit_req zone=login burst=5;
proxy_pass http://backend;
}
}
}
Surveillance et maintenance
Monitoring avec stub_status
server {
listen 80;
server_name localhost;
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
allow 192.168.1.0/24;
deny all;
}
}
Rotation des logs
# Configuration logrotate pour NGINX
sudo tee /etc/logrotate.d/nginx > /dev/null <<EOF
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 \$(cat /var/run/nginx.pid)
fi
endscript
}
EOF
Commandes utiles
# Tester la configuration
sudo nginx -t
# Recharger la configuration
sudo systemctl reload nginx
# Redémarrer NGINX
sudo systemctl restart nginx
# Voir les logs en temps réel
sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
# Statistiques de connexion
sudo netstat -tulpn | grep nginx
# Processus NGINX
ps aux | grep nginx
N'oubliez pas de configurer un pare-feu (UFW, iptables) pour protéger votre serveur et de maintenir NGINX à jour régulièrement.
Dépannage courant
Problèmes fréquents
- Port déjà utilisé : Vérifiez avec
sudo netstat -tulpn | grep :80 - Permissions : Assurez-vous que www-data peut lire les fichiers
- Configuration invalide : Utilisez
nginx -tpour diagnostiquer - SSL : Vérifiez les chemins des certificats et les permissions
Commandes de diagnostic
# Vérifier la syntaxe
sudo nginx -t
# Mode debug
sudo nginx -t -c /etc/nginx/nginx.conf
# Tester une configuration spécifique
sudo nginx -t -c /etc/nginx/sites-available/monsite
# Voir la configuration compilée
nginx -T
Conclusion
NGINX est maintenant installé et configuré sur votre système. Vous maîtrisez :
- L'installation et la configuration de base de NGINX
- La création et gestion de sites virtuels
- La configuration SSL avec Let's Encrypt
- L'utilisation en reverse proxy et load balancer
- Les optimisations de performance et de sécurité
- La surveillance et la maintenance
NGINX est un serveur web extrêmement puissant et flexible, capable de gérer des charges importantes tout en maintenant d'excellentes performances. Sa configuration modulaire permet de l'adapter à tous types de besoins, du simple site statique aux architectures complexes de microservices.