Eu nunca fiz isso, mas se eu alguma vez tentei, acho que usaria um firewall. Eu provavelmente precisaria fazer o script da solução, que seria assim:
- Diga ao firewall para permitir conexões existentes, mas para filtrar novas conexões na porta 80 (ou 443).
- Aguarde a conclusão das solicitações pendentes para o backend (mesmo se as conexões do nginx aos clientes ainda estiverem abertas).
- Atualize, reinicie, o que for.
- Diga ao firewall para permitir conexões novamente.
Se as etapas 2 + 3 não demorarem muito, os clientes tentarão novamente e, eventualmente, conseguirão se conectar na etapa 4. Se demorarem muito tempo, os clientes terão tempo limite, mas isso não é um problema, já que os usuários a paciência terá expirado mais cedo, não?
A solução tem algumas capturas. Um cliente pode conseguir obter a página principal e, em seguida, pode não conseguir prosseguir para obter os arquivos estáticos (considerando o que você tem em mente, poderia). Isso não será um problema, no entanto, se você servir seus arquivos estáticos de outra máquina ou CDN.
Além disso, acredito que alguém normalmente se preocuparia com o que você está preocupando somente depois que eles já tivessem configurado alguma solução de alta disponibilidade, por exemplo, dois servidores mais um endereço IP que pode ser movido de um servidor para outro. Quando você move o endereço IP de um servidor para o outro, os usuários que possuem uma conexão aberta são desconectados. Eu acho que isso é aceitável, porque esses usuários pegam algo parecido com uma página em branco no navegador, perguntam o que diabos aconteceu, clique em reload, dessa vez funciona, e eles não se incomodam mais; eles nem se lembram do incidente alguns minutos depois. Usar o truque do firewall para evitar essa desconexão criaria mais problemas do que soluciona, porque a etapa 2 precisaria ser modificada para esperar que o nginx terminasse de atender as solicitações aos clientes, e isso pode levar muito tempo se um usuário tiver uma conexão lenta. Em qualquer caso, acho que a alta disponibilidade tem tantos problemas que isso teria uma prioridade tão baixa que nunca seria feito (a menos que você seja o Google ou algo assim).