Quand une seconde d'arrêt coûte des millions
\n\nImaginez : vous mettez à jour votre boutique en ligne PHP, vous téléchargez une nouvelle version via FTP, et soudain le site plante pendant 5 minutes. Cinq minutes, c'est 300 secondes. Pendant ce temps, 100 clients potentiels filent chez vos concurrents, et vous perdez non seulement de l'argent, mais aussi votre réputation. Ça vous parle ?
\n\nDans le monde moderne, où les utilisateurs ne pardonnent pas les erreurs, le déploiement zero-downtime de services PHP n'est plus un luxe, mais une nécessité. Mais comment réaliser un déploiement sans couture quand votre stack est PHP, Nginx et plusieurs serveurs ? Voyons cela avec des exemples concrets.
\n\nPourquoi PHP est-il plus complexe qu'il n'y paraît ?
\n\nContrairement à Node.js ou Python, PHP ne supporte pas le multithreading au sens classique. Chaque requête est traitée par un processus PHP-FPM distinct. Cela impose des contraintes : vous ne pouvez pas simplement « recharger » le code sans perdre les sessions en cours. Cependant, cette même particularité nous donne un super-pouvoir : la possibilité de basculer progressivement le trafic entre les versions.
\n\nLes principaux problèmes lors du déploiement PHP :
\n- \n
- Coupures de connexion — l'utilisateur perd les données d'un formulaire ou sa session \n
- Cache obsolète — l'ancien code renvoie des données d'un cache périmé \n
- Migrations cassées — la nouvelle version de la BDD n'est pas compatible avec l'ancien code \n
Pour éviter ces pièges, utilisons des stratégies éprouvées. Et oui, le déploiement zero-downtime n'est pas de la magie, mais un plan bien défini.
\n\nStratégie n°1 : Blue-Green Deployment
\n\nLa méthode la plus fiable consiste à maintenir deux copies complètes de l'application : la « bleue » (actuelle) et la « verte » (nouvelle). Nginx agit comme répartiteur de charge.
\n\nComment ça se passe concrètement
\nSupposons que vous ayez deux serveurs : app1.example.com (blue) et app2.example.com (green). Les deux exécutent PHP-FPM. Actuellement, blue est actif. Vous déployez la nouvelle version sur green, vous la testez, puis vous basculez Nginx sur green.
Exemple de configuration Nginx pour le basculement :
\n\n# nginx.conf\nupstream php_backend {\n # D'abord blue actif\n server app1.example.com:9000 weight=1; # blue\n server app2.example.com:9000 weight=0; # green (désactivé)\n}\n\nserver {\n listen 80;\n server_name maboutique.com;\n\n location ~ \\.php$ {\n fastcgi_pass php_backend;\n include fastcgi_params;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n }\n}\n\n\nAprès le déploiement sur green, on modifie les poids :
\n\n# Après déploiement — basculement du trafic\nupstream php_backend {\n server app1.example.com:9000 weight=0; # blue (désactivé)\n server app2.example.com:9000 weight=1; # green (actif)\n}\n\n\nOn recharge Nginx sans interruption : nginx -s reload. Toutes les connexions en cours se terminent proprement, et les nouvelles vont vers green. Déploiement zero-downtime PHP assuré !
Avantages et inconvénients
\nAvantages : haute disponibilité totale, possibilité de revenir en arrière rapidement (il suffit de rétablir les poids).
\nInconvénients : nécessite deux fois plus de ressources (serveurs ou conteneurs).
Stratégie n°2 : Rolling Update (mise à jour progressive)
\n\nSi votre budget est limité, utilisez le rolling update. L'idée : mettre à jour les serveurs PHP un par un, sans désactiver les autres. Les utilisateurs ne remarquent aucune interruption, car Nginx redirige les requêtes vers les serveurs actifs.
\n\nImplémentation avec PHP-FPM
\nSupposons que vous ayez 3 serveurs avec PHP-FPM. On les retire un à un de la rotation, on met à jour le code, puis on les réintègre.
\n\nÉtape 1 : Retirer le serveur du répartiteur de charge (graceful shutdown) :
\n\n# Sur le serveur à mettre à jour\nsudo systemctl stop php8.1-fpm\n# Nginx arrêtera automatiquement d'envoyer des requêtes à ce serveur, car il est indisponible\n\n\nÉtape 2 : Mettre à jour le code (via git pull, rsync ou Docker).
\n\nÉtape 3 : Redémarrer PHP-FPM :
\n\nsudo