Que tal isso:
1 public facing load balancer (e.g. HAproxy)
Two backend webservers.
- Remova um servidor da web do pool (com o Haproxy isso é feito via soquete de administrador. Consulte esta questão )
- Aguarde até que as sessões terminem nesse servidor.
- Envie, descompacte e implante arquivos de projeto para o servidor desativado.
- Teste sem passar pelo balanceador de carga. (isto é, localhost)
- Ativar novamente o servidor.
- Repita a partir do passo 1 com o segundo servidor.
"Desativando" o servidor coloca o servidor no modo de manutenção, depois de esperar que todas as conexões atuais expirem. Claro que uma conexão não é necessariamente igual a uma "sessão". Portanto, dependendo de como você lida com as sessões, pode ser necessário que haja alguma replicação de sessão entre os dois servidores ou um DB de sessão separado (um novo SPOF ) em que ambos os servidores confiam.
Dessa forma, seus usuários não terão nenhum tempo de inatividade. Além disso, você obtém o benefício adicional de algum balanceamento de carga.
Infelizmente, configurar o HAproxy dessa maneira pode ser uma dor.