Ma première idée est:
# deploy into public_html_new, and then:
rsync -vaH --delete public_html_new/ public_html/
Une bonne solution consistait à utiliser rsync. Il n'a changé que les fichiers vraiment modifiés. Attention, les barres obliques à la fin des chemins sont ici importantes.
Normalement, apache n'a pas besoin d'un redémarrage, ce n'est pas le monde java. Il vérifie la modification de chaque fichier php sur demande et relit (et re-tokenise) automatiquement la modification.
Git pull était similaire et efficace, bien qu'il soit un peu plus difficile à écrire. Bien sûr, il a permis un large éventail de différentes possibilités de détection de fusion / changement.
Cette solution ne fonctionnera de manière transparente que s'il n'y a pas de changements vraiment majeurs - s'il y a de grands changements dans le déploiement, un peu de danger ne peut pas être fermé, car il y a un intervalle de temps non négligeable, lorsque le code sera partiellement modifié et surtout pas.
S'il y a de gros changements, ma suggestion était votre solution initiale (deux renommer).
Voici une solution un peu hardcore, mais 100% atomique:
(1) faire un montage alternatif de certains de votre système de fichiers, où votre magento a lieu:
mount /dev/sdXY /mnt/tmp
(2) faites un --bind
montage de votre public_html_new sur public_html:
mount --bind /path/to/public_html_new /path/to/public_html
À partir de ce moment, l'apache verra votre nouveau déploiement. Tout changement de 404 est impossible.
(3) faire la synhcronistation avec rsync, mais sur le point de montage alternatif):
rsync -vaH --delete /mnt/tmp/path/to/public_html_new/ /mnt/tmp/path/to/public_html/
(4) Retirez le support de fixation
umount /path/to/public_html