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 "Bienvenue sur mon site NGINX
" | 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 <
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.
Commentaires