Un laboratoire Nginx local vous offre un moyen sûr et rapide d'apprendre, de tester des modifications et de déboguer avant de toucher aux environnements partagés. En quelques minutes, vous pouvez déployer une instance Nginx isolée sous votre répertoire personnel, la faire tourner sur des ports non privilégiés et itérer sans risquer de corrompre la configuration système. Ce guide suit une approche pratique : inventorier l'existant, configurer un préfixe Nginx non privilégié, et implémenter trois petits exemples observables avec curl et les journaux : un site statique, un proxy inverse vers une application locale, et du HTTPS avec un certificat auto-signé. Vous verrez les résultats attendus, les pièges courants et un plan de retour arrière. Le résultat final est un flux de travail reproductible que vous pourrez recréer sur n'importe quelle station de travail. ## Inventaire des Versions et de l'Environnement Définissez votre périmètre et validez vos outils pour que le laboratoire se comporte de façon prévisible. Gardez le projet pilote étroit et mesurable : un seul hôte, des ports non privilégiés, et un unique répertoire appartenant à votre utilisateur. Prérequis : - Système d'exploitation : Linux ou macOS. Windows fonctionne via le zip officiel Nginx ou WSL ; les commandes ici supposent un shell de type Unix. - Outils installés : binaire nginx, curl, openssl, python3. - Ports locaux libres : 8080 pour HTTP, 8443 pour HTTPS, 3000 pour une application backend locale. - Accès au système de fichiers sous votre répertoire personnel. Confirmez les versions (sortie d'exemple) : nginx -v # nginx version: nginx/1.24.0 curl --version # curl 8.4.0 openssl version # OpenSSL 3.0.10 python3 --version # Python 3.11.x Installation (choisissez une méthode) : # Linux (Debian/Ubuntu) sudo apt-get update && sudo apt-get install -y nginx curl openssl python3 # Linux (RHEL/Fedora) sudo dnf install -y nginx curl openssl python3 # macOS (Homebrew) brew install nginx curl openssl python Si Nginx est déjà installé, vous pouvez réutiliser le binaire en toute sécurité tout en gardant votre laboratoire isolé en le pointant vers votre propre préfixe et vos propres fichiers de configuration. ## Chemin de Configuration Sûr Faites tourner Nginx sous votre utilisateur, liez-le à des ports élevés, et conservez tous les fichiers sous un unique répertoire de laboratoire. Cela évite de modifier /etc/nginx au niveau système et empêche les opérations privilégiées. Créez la structure du répertoire de laboratoire : export LAB="$HOME/nginx-lab" mkdir -p "$LAB/{conf,conf/sites,html,logs,certs} Créez une page d'index simple : cat > "$LAB/html/index.html" <<'EOF'
It works.
EOF Écrivez la configuration de base Nginx à $LAB/conf/nginx.conf : worker_processes 1; error_log logs/error.log info; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent"'; access_log logs/access.log main; sendfile on; keepalive_timeout 65; include conf/sites/*.conf; } Cette configuration utilise $LAB/logs pour les journaux et inclut les configurations par site depuis $LAB/conf/sites . Elle ne touche jamais à /etc/nginx . Comment démarrer, arrêter et tester en utilisant votre préfixe : # Tester la syntaxe de la configuration nginx -p "$LAB" -t -c conf/nginx.conf # Démarrer nginx -p "$LAB" -c conf/nginx.conf # Recharger après modifications nginx -p "$LAB" -s reload # Arrêter nginx -p "$LAB" -s stop Astuce : Testez toujours ( -t ) avant de recharger. Nginx refuse de recharger une configuration invalide, ce qui constitue une garde-fou de sécurité dans votre laboratoire également. ## Exemples Pratiques Vous allez implémenter trois petits scénarios observables : un site statique, un proxy inverse basé sur le chemin vers une application locale, et du HTTPS sur un port élevé avec un certificat auto-signé. ## 1) Site Statique sur le Port 8080 Créez la configuration du site à $LAB/conf/sites/static.conf : server { listen 8080; server_name localhost; root html; index index.html; location /healthz { return 200 'ok\n'; add_header Content-Type text/plain; } location / { try_files $uri $uri/ =404; } error_page 404 /404.html; location = /404.html { internal; return 404 'not found\n'; add_header Content-Type text/plain; } } Comportement attendu : - http://127.0.0.1:8080/ sert votre index.html . - http://127.0.0.1:8080/healthz retourne le texte brut ok . ## 2) Proxy Inverse de /app/ vers un Backend Local sur le Port 3000 Démarrez un backend simple (dans un terminal séparé) : python3 -m http.server 3000 --bind 127.0.0.1 Créez la configuration du proxy à $LAB/conf/sites/reverse-proxy.conf : server { listen 8080; server_name localhost; # Limite de débit : 5 requêtes/seconde par IP client, rafale de 10 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s; location /app/ { limit_req zone=api_limit burst=10 nodelay; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $remote_addr; proxy_http_version 1.1; proxy_pass http://127.0.0.1:3000/; } } Notes : - Le slash final dans location /app/ combiné avec proxy_pass .../3000/ mappe /app/foo vers /foo sur le backend. - La directive limit_req simule une limitation de débit style production dans le laboratoire. ## 3) HTTPS sur le Port 8443 avec un Certificat Auto-Signé Générez un certificat auto-signé : openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout "$LAB/certs/selfsigned.key" \ -out "$LAB/certs/selfsigned.crt" \ -subj /C=US/ST=NA/L=Local/O=Lab/OU=Dev/CN=localhost Créez la configuration du serveur TLS à $LAB/conf/sites/tls.conf : server { listen 8443 ssl; server_name localhost; ssl_certificate certs/selfsigned.crt; ssl_certificate_key certs/selfsigned.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; root html; index index.html; location / { try_files $uri $uri/ =404; } } Appliquez et testez l'ensemble : nginx -p "$LAB" -t -c conf/nginx.conf nginx -p "$LAB" -s reload À ce stade, vous avez : - Site statique HTTP sur 127.0.0.1:8080 - Proxy inverse basé sur le chemin sur 127.0.0.1:8080/app/ - Site statique HTTPS sur 127.0.0.1:8443 Inventaire du laboratoire :| Composant | Port | Chemin ou Notes |
|---|---|---|
| Préfixe Nginx | n/a | $HOME/nginx-lab |
| Site statique HTTP | 8080 | $LAB/conf/sites/static.conf, $LAB/html |
| Proxy inverse | 8080 (/app/) | $LAB/conf/sites/reverse-proxy.conf → 127.0.0.1:3000 |
| Site statique HTTPS | 8443 | $LAB/conf/sites/tls.conf, $LAB/certs |
| Application backend | 3000 | python3 -m http.server |
| Symptôme | Cause Probable | Correctif Rapide |
|---|---|---|
nginx -t échoue avec ligne:col | Erreur de syntaxe (point-virgule manquant, directive invalide) | Ouvrez le fichier signalé par nginx -t, corrigez la ligne, testez à nouveau |
curl vers :8080 donne connection refused | Nginx non démarré ou écoute sur une autre IP | Vérifiez ss/lsof, démarrez avec nginx -p "$LAB" -c conf/nginx.conf |
curl vers :8080/app/ retourne 404 | Mismatch de chemin du proxy | Assurez-vous que location /app/ et proxy_pass http://127.0.0.1:3000/ (notez le slash final) |
| 502 Bad Gateway sur /app/ | Backend non démarré | Lancez python3 -m http.server 3000 et réessayez |
| 403 Forbidden sur fichiers statiques | Mauvais root ou permissions fichiers | root html; assurez-vous que les fichiers existent et sont lisibles par votre utilisateur |
| Échec handshake TLS ou avertissement navigateur | Certificat auto-signé non approuvé | Utilisez curl -k pour les tests ; pour navigateurs, importez ou acceptez pour le labo uniquement |
| Port déjà utilisé | Un autre processus a lié 8080/8443 | Changez les ports d'écoute ou arrêtez l'autre processus |