Introduction
Automatiser les déploiements de Nginx avec l'intégration et le déploiement continus (CI/CD) réduit les erreurs manuelles, accélère les mises en production et rend les retours arrière plus sûrs. Cependant, une automatisation sans vérification n'est qu'une rupture rapide. Ce guide présente un flux de travail pratique pour gérer Nginx dans un pipeline CI/CD, depuis l'inspection de l'environnement actuel jusqu'à la récupération après un déploiement échoué.
Nous nous concentrons sur Nginx fonctionnant sous Linux, mais les principes s'appliquent également à Nginx conteneurisé et aux contrôleurs Ingress Kubernetes. Chaque étape comprend des commandes en lecture seule pour observer l'état actuel, des commandes pour effectuer un changement limité et des contrôles pour confirmer que le changement a fonctionné. Nous évitons les identifiants réels et utilisons des espaces réservés.
À la fin, vous disposerez d'un processus reproductible pour le CI/CD de Nginx, adapté au développement, à la préproduction et à la production.
Inventaire de la version et de l'environnement
Avant d'automatiser quoi que ce soit, vous devez savoir exactement avec quoi vous travaillez. Exécutez ces commandes sur un serveur ou un conteneur cible pour recueillir la version de Nginx, les processus en cours, la disposition de la configuration et les fichiers de configuration actifs actuels.
Vérifier la version installée de Nginx
Le numéro de version détermine les fonctionnalités et les directives disponibles. Utilisez l'option -v pour afficher la version sans démarrer Nginx.
nginx -v
Sortie attendue (exemple pour une version stable courante) :
nginx version: nginx/1.24.0
Vérifiez également les modules compilés et le chemin de configuration :
nginx -V
Cela affiche les arguments de configuration, y compris --prefix, --conf-path et --modules-path. Par exemple :
configure arguments: --prefix=/etc/nginx --conf-path=/etc/nginx/nginx.conf --modules-path=/usr/lib/nginx/modules ...
Enregistrez la version et les chemins dans les variables de votre pipeline ou dans un système de gestion de configuration, afin que chaque tâche s'exécute dans un environnement connu.
Identifier la topologie de déploiement
Nginx s'exécute-t-il directement sur une machine virtuelle, dans un conteneur Docker ou comme contrôleur Ingress Kubernetes ? Chaque cas a des commandes différentes.
Sur une machine virtuelle (systemd) :
systemctl status nginx --no-pager
Recherchez Active: active (running) et l'identifiant du processus. Par exemple :
Active: active (running) since Mon 2025-03-10 08:00:00 UTC; 2h ago
Main PID: 1234 (nginx)
Dans Docker :
docker ps --filter name=nginx
Dans Kubernetes :
kubectl get pods -n ingress-nginx
Notez le nombre de réplicas et la version du contrôleur.
Localiser les fichiers de configuration
Trouvez le fichier de configuration principal et les fichiers inclus.
nginx -t 2>&1 | grep 'configuration file'
Pour une installation Debian/Ubuntu par défaut, cela renvoie quelque chose comme :
nginx: configuration file /etc/nginx/nginx.conf test is successful
Listez tous les fichiers de configuration inclus :
grep -R 'include' /etc/nginx/nginx.conf
Sortie typique :
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
Documentez les chemins des fichiers et leur utilité. Cet inventaire devient la base de référence pour votre pipeline.
Commandes d'observation en lecture seule
Commencez toujours par des contrôles en lecture seule. Ces commandes ne modifient pas l'état :
nginx -t- tester la syntaxe de la configuration.nginx -T- afficher la configuration complète, y compris toutes les inclusions, sur la sortie standard.curl -I http://localhost- vérifier les en-têtes de réponse d'un Nginx local.tail -n 50 /var/log/nginx/error.log- voir les erreurs récentes.
Utilisez-les pour établir une base saine avant l'automatisation.
Chemin de configuration sûr
Modifier la configuration de Nginx dans un pipeline CI/CD doit être fait avec précaution. Une mauvaise configuration peut entraîner une interruption du service. Suivez un chemin sûr : tester, mettre en scène, déployer, vérifier.
Étape 1 : Sauvegarder la configuration actuelle
Avant d'exécuter un changement automatisé, sauvegardez les fichiers de configuration existants.
tar -czf /backup/nginx-config-$(date +%Y%m%d-%H%M%S).tar.gz /etc/nginx/
Cela crée une archive tar horodatée. Vous pouvez la restaurer avec :
tar -xzf /backup/nginx-config-<timestamp>.tar.gz -C /
Stockez les sauvegardes dans un emplacement séparé, comme un compartiment S3 ou un dépôt d'artefacts.
Étape 2 : Tester les modifications de configuration
Avant d'appliquer, validez la syntaxe des nouveaux fichiers de configuration. Utilisez l'option -t avec -c pour tester un fichier spécifique.
nginx -t -c /etc/nginx/nginx.conf
Si le test réussit, vous voyez :
nginx: configuration file /etc/nginx/nginx.conf test is successful
S'il échoue, la sortie indique le fichier et le numéro de ligne de l'erreur.
Étape 3 : Recharger sans interrompre les connexions
Au lieu de redémarrer Nginx, utilisez un rechargement gracieux. Cela indique au processus maître de démarrer de nouveaux processus worker et d'arrêter progressivement les anciens, évitant ainsi les temps d'arrêt.
nginx -s reload
Ou avec systemd :
systemctl reload nginx
Après le rechargement, vérifiez que les workers ont été remplacés. L'identifiant du processus maître reste le même, mais les PID des workers changent. Vérifiez avec :
ps aux | grep 'nginx: worker'
Consultez également le journal des erreurs pour tout problème de rechargement :
tail -n 20 /var/log/nginx/error.log
S'il y a des avertissements, ils peuvent indiquer des directives de configuration obsolètes ou ignorées.
Étape 4 : Déploiement automatisé en CI/CD
Dans un pipeline CI/CD typique (par exemple, GitLab CI, GitHub Actions, Jenkins), l'étape de déploiement peut ressembler à ceci :
Exemple GitLab CI (.gitlab-ci.yml) :
stages:
- test
- deploy
test_configuration:
stage: test
script:
- nginx -t -c /etc/nginx/nginx.conf
deploy_production:
stage: deploy
script:
- scp nginx.conf user@server:/etc/nginx/nginx.conf
- ssh user@server 'sudo nginx -t && sudo systemctl reload nginx'
environment:
name: production
Cela garantit que la configuration est testée sur la cible avant le rechargement.
Utiliser des espaces réservés pour les secrets :
Ne codez jamais en dur les identifiants. Utilisez des variables d'environnement et une gestion des secrets.
script:
- ssh $DEPLOY_USER@$DEPLOY_HOST 'sudo nginx -t && sudo systemctl reload nginx'
Définissez $DEPLOY_USER et $DEPLOY_HOST comme variables CI/CD protégées.
Rayon d'impact et récupération
Un rechargement affecte tous les blocs de serveur, pas seulement celui que vous avez modifié. Pour limiter le rayon d'impact, utilisez les fonctionnalités de configuration dynamique de Nginx, telles que :
- Clients répartis pour un déploiement progressif : directive
split_clients. - Groupes amont avec
zonepour une modification à l'exécution (nécessite Nginx Plus ou OpenResty). - Déploiement bleu-vert en exécutant deux instances Nginx sur des ports différents et en basculant un équilibreur de charge.
Pour les configurations de base, la méthode la plus sûre consiste à déployer d'abord dans un environnement de préproduction, à exécuter des tests automatisés, puis à promouvoir en production.
Vérification et diagnostics
Après un déploiement, vérifiez que Nginx fonctionne correctement. Des contrôles automatisés détectent rapidement les problèmes.
Points de terminaison de contrôle de santé
Créez un point de terminaison de contrôle de santé dans votre configuration Nginx :
location /healthz {
access_log off;
return 200 'healthy\n';
add_header Content-Type text/plain;
}
Utilisez ensuite curl pour le vérifier :
curl -f http://localhost/healthz
L'option -f fait que curl renvoie un code de sortie non nul en cas d'erreur HTTP. Dans un script :
if curl -f http://localhost/healthz; then
echo "Contrôle de santé réussi"
else
echo "Contrôle de santé échoué"
exit 1
fi
Vérifier les connexions actives et les requêtes
En utilisant le module stub status, vous pouvez exposer des métriques de base. Ajoutez ceci à votre configuration :
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
Interrogez-le ensuite :
curl http://localhost/nginx_status
Exemple de sortie :
Active connections: 3
server accepts handled requests
12345 12345 67890
Reading: 0 Writing: 1 Waiting: 2
Surveillez ces métriques dans le temps pour détecter les anomalies.
Analyse des journaux
Utilisez le journal des erreurs pour trouver les problèmes. Par exemple, pour voir les 10 dernières lignes d'erreur :
tail -n 10 /var/log/nginx/error.log
Erreurs courantes :
[emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)- un autre processus utilise le port 80.[error] upstream timed out (110: Connection timed out)- le serveur amont est lent ou hors service.[warn] conflicting server name "example.com" on 0.0.0.0:80, ignored- noms de serveur en double.
Configurez l'envoi des journaux vers un système central pour une analyse à long terme.
Diagnostics automatisés dans le pipeline
Dans votre pipeline CI/CD, après le déploiement, exécutez une suite de diagnostics :
verify_deployment:
stage: verify
script:
- curl -f http://$DEPLOY_HOST/healthz
- ssh $DEPLOY_USER@$DEPLOY_HOST 'nginx -t'
- ssh $DEPLOY_USER@$DEPLOY_HOST 'systemctl is-active nginx'
- ssh $DEPLOY_USER@$DEPLOY_HOST 'tail -n 20 /var/log/nginx/error.log'
Si une commande échoue, le pipeline échoue et alerte l'équipe.
Modes de défaillance et récupération
Malgré une automatisation soignée, des problèmes surviennent. Connaître les modes de défaillance courants et disposer d'un plan de récupération est essentiel.
Erreur de syntaxe de configuration
Symptôme : nginx -t échoue, ou le rechargement échoue avec une erreur.
Exemple : Vous avez accidentellement supprimé un point-virgule :
nginx: [emerg] unexpected end of file, expecting ";" or "}" in /etc/nginx/conf.d/default.conf:12
Récupération :
- Vérifiez le message d'erreur pour le fichier et le numéro de ligne.
- Corrigez l'erreur de syntaxe dans le fichier de configuration.
- Testez à nouveau avec
nginx -t. - Rechargez si réussi.
Échec du rechargement en raison d'une directive inconnue
Symptôme : nginx -s reload échoue avec unknown directive.
Exemple :
nginx: [emerg] unknown directive "proxy_cache_bypass" in /etc/nginx/conf.d/mysite.conf:5
Cela peut se produire si un module n'est pas installé ou si une directive est mal orthographiée.
Récupération :
- Vérifiez le nom de la directive.
- Assurez-vous que le module requis est compilé (
nginx -V). - Corrigez la faute de frappe ou installez le module.
- Testez et rechargez.
Port déjà utilisé
Symptôme : Nginx ne démarre pas avec bind() failed.
Exemple :
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Récupération :
- Trouvez ce qui utilise le port :
sudo lsof -i :80. - Arrêtez le processus en conflit ou modifiez le port d'écoute Nginx.
- Testez et redémarrez/rechargez.
Serveur amont hors service
Symptôme : Nginx renvoie 502 Bad Gateway.
Exemple : Dans le journal des erreurs :
[error] 1234#1234: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 1.2.3.4, server: example.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/", host: "example.com"
Récupération :
- Vérifiez si le service amont est en cours d'exécution :
systemctl status myapp. - Si non, démarrez-le ou corrigez l'application.
- Vérifiez l'adresse et le port amont dans la configuration Nginx.
- Rechargez Nginx si la configuration a changé.
Stratégie de retour arrière
Si un déploiement cause des problèmes et que vous ne pouvez pas les corriger rapidement, revenez à la configuration précédente.
Étapes du retour arrière :
- Restaurez l'archive de sauvegarde :
tar -xzf /backup/nginx-config-<previous-timestamp>.tar.gz -C /
- Testez la configuration restaurée :
nginx -t
- Rechargez Nginx :
systemctl reload nginx
- Vérifiez le point de terminaison de contrôle de santé.
Automatisez le retour arrière dans votre pipeline. Par exemple, utilisez un pipeline qui conserve le dernier artefact connu comme bon et peut le redéployer.
Liste de contrôle opérationnelle
Utilisez cette liste de contrôle avant et après chaque déploiement Nginx.
Liste de contrôle pré-déploiement
- [ ] Enregistrer la version actuelle de Nginx et le hachage de configuration. Utilisez
nginx -vetsha256sum /etc/nginx/nginx.conf. - [ ] Sauvegarder les fichiers de configuration actuels. Créez une archive tar et stockez-la hors du serveur.
- [ ] Tester la nouvelle configuration localement. Exécutez
nginx -t -c <new-config>. - [ ] Réviser les modifications avec un collègue (si nécessaire). Pour la production, exigez une approbation.
- [ ] Définir les variables de pipeline pour les secrets. Ne codez jamais en dur les identifiants.
- [ ] Définir le déclencheur de retour arrière. À quel moment abandonnez-vous le déploiement ? (par exemple, échec du contrôle de santé 3 fois).
Vérification post-déploiement
- [ ] Le rechargement a réussi sans erreur. Vérifiez les journaux du pipeline.
- [ ] Le contrôle de santé renvoie 200.
curl -f http://host/healthz. - [ ] Les connexions actives et les métriques de requêtes semblent normales. Interrogez le stub status.
- [ ] Le journal des erreurs ne contient pas de nouvelles entrées critiques. Suivez la sortie de
tail. - [ ] Les pages destinées aux utilisateurs se chargent correctement. Exécutez un script de test de fumée.
Responsable et fréquence de révision
Attribuez un responsable pour le processus de déploiement Nginx. Par exemple, Priya Shah, responsable de l'ingénierie, est propriétaire de la configuration du pipeline et révise le processus de déploiement chaque semaine. Les changements majeurs (par exemple, nouveaux modules, changements architecturaux) nécessitent une révision trimestrielle de la sécurité et des performances.
Pièges courants et comment les éviter
1. Ne pas tester la configuration avant de déployer
Pourquoi cela arrive : Les développeurs supposent que la configuration est correcte parce qu'elle a fonctionné dans un environnement précédent.
Comment l'éviter : Exécutez toujours nginx -t dans le pipeline avant de déployer. Ajoutez un crochet de pré-commit pour exécuter les contrôles de syntaxe.
Récupération : Si une mauvaise configuration est déployée, Nginx refusera de recharger, laissant l'ancienne configuration active. Corrigez la syntaxe et réessayez.
2. Utiliser le redémarrage au lieu du rechargement
Pourquoi cela arrive : Les équipes utilisent systemctl restart nginx parce que c'est simple.
Comment l'éviter : Utilisez nginx -s reload ou systemctl reload nginx pour éviter de couper les connexions. Formez l'équipe au rechargement gracieux.
Récupération : Si un redémarrage a causé un temps d'arrêt, examinez la surveillance pour mesurer l'impact et ajustez la procédure de déploiement.
3. Coder en dur les secrets dans la configuration
Pourquoi cela arrive : Commodité pendant le développement ; les développeurs oublient de supprimer les secrets.
Comment l'éviter : Utilisez des variables d'environnement ou des modèles de gestion de configuration. Analysez les secrets dans le pipeline CI (par exemple, gitleaks).
Récupération : Si des secrets sont exposés, faites-les pivoter immédiatement et mettez à jour la configuration pour utiliser des espaces réservés.
4. Ignorer les messages d'avertissement
Pourquoi cela arrive : Le rechargement réussit mais les journaux montrent des avertissements comme the "ssl" directive is deprecated.
Comment l'éviter : Traitez les avertissements comme des erreurs. Ajoutez une étape de pipeline pour vérifier les avertissements dans le journal des erreurs après le rechargement.
Récupération : Corrigez la dépréciation en mettant à jour la configuration et en testant à nouveau.
5. Pas de plan de retour arrière
Pourquoi cela arrive : Excès de confiance dans les tests.
Comment l'éviter : Ayez toujours une procédure de retour arrière testée. Pratiquez le retour arrière dans un environnement de préproduction.
Récupération : Si un retour arrière échoue, restaurez à partir de la sauvegarde la plus récente et vérifiez manuellement.
6. Manque de surveillance et d'alertes
Pourquoi cela arrive : Nginx est stable, donc les équipes négligent la surveillance.
Comment l'éviter : Configurez la collecte de métriques (par exemple, exportateur Prometheus) et des alertes sur les taux d'erreur, les temps de réponse et les codes de statut 5xx.
Récupération : Après un incident, ajoutez des alertes pour le signal manqué.
Conclusion
L'automatisation CI/CD de Nginx ne se limite pas à pousser des changements de configuration. C'est une discipline d'observation, de test, de déploiement, de vérification et de récupération. En suivant les pratiques de ce guide, vous pouvez réduire les temps d'arrêt et accroître la confiance dans vos déploiements Nginx.
Commencez par un changement à faible risque : automatisez l'étape d'inventaire. Exécutez nginx -v, nginx -T et les contrôles de santé dans une tâche planifiée. Ajoutez ensuite progressivement des étapes de test de configuration et de déploiement. Documentez votre pipeline et révisez-le régulièrement.
Un flux de travail fiable rend les défaillances visibles, protège les valeurs sensibles, limite le rayon d'impact et définit la récupération avant d'en avoir besoin.