Infrastructure web critique simulée en conditions réelles.
Multi-layer · Résilience prouvée · Incidents P1 résolus.
De la requête visiteur au backend applicatif — chaque couche est sécurisée, monitorée et redondée.
Vue temps réel de l'infrastructure simulée — 18 services actifs, surveillance automatique quotidienne.
Diagnostic → root cause → fix → vérification → post-mortem → prévention. Chaque ticket documenté.
dig drupal-client9.webinfra-lab.com +short
# → IP du serveur attendueserver { listen 80; server_name drupal-client9.webinfra-lab.com; location /.well-known/acme-challenge/ { root /var/www/html; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } location ~* \.(git|htaccess|yml|sql)$ { deny all; } location ~* \.(js|css|png|svg|woff2)$ { expires max; access_log off; } }
sudo ln -s /etc/nginx/sites-available/drupal-client9.webinfra-lab.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx # toujours nginx -t avant reload sudo certbot --nginx -d drupal-client9.webinfra-lab.com # rewrite le vhost SSL auto sudo nginx -t && sudo systemctl reload nginx sudo certbot renew --dry-run # vérifier auto-renouvellement curl -I https://drupal-client9.webinfra-lab.com # → HTTP/2 200 ✅
sudo tail -50 /var/log/nginx/error.log # → connect() failed (111: Connection refused) upstream: http://127.0.0.1:8084 sudo ss -tlnp | grep 8084 # → rien — port fermé
systemctl list-units | grep drupal # → drupal-client4: FAILED sudo journalctl -u drupal-client4.service -n 50 # → ModuleNotFoundError: No module named 'flask' # Dépendance Python manquante dans le venv
cd /var/www/drupal-client4 && source venv/bin/activate pip install -r requirements.txt sudo systemctl restart drupal-client4.service sudo systemctl reload nginx curl -I http://127.0.0.1:8084 # → HTTP 200 ✅ curl -I https://drupal-client4.webinfra-lab.com # → HTTP/2 200 ✅
sudo tail -100 /var/log/nginx/error.log | grep "client-portal"
# → upstream timed out (110) upstream: http://127.0.0.1:8082
# Port écoute → backend vivant mais ne répond pas → bloqué, pas crashécurl -v --max-time 5 http://127.0.0.1:8082
# → Connected (port écoute) MAIS Operation timed out after 5001ms
# Le process est vivant → on ne fait pas kill -9 → on cherche pourquoitop -bn1 | head -10
# → www-data python3 app.py : 99.3% CPU, 45.2% RAM
# → www-data python3 app.py : 98.7% CPU, 44.8% RAM
# → www-data python3 app.py : 97.9% CPU, 44.5% RAM
# Boucle bloquante → Gunicorn workers saturés → Nginx timeout → 504sudo systemctl restart client-portal.service # workers bloqués tués + recréés proprement curl -I http://127.0.0.1:8082 # → HTTP 200 ✅ curl -I https://client-portal.webinfra-lab.com # → HTTP/2 200 ✅ sudo journalctl -u client-portal.service -n 50 # analyse post-fix
Les mécanismes qui font tourner l'infra sans supervision — ce qui sépare un système fragile d'un système production-grade.