Existem algumas postagens no blog e perguntas sobre isso, mas são em sua maioria de 2010 ou 2011, e eu esperava por uma resposta mais atualizada (na época de 2014).
Eu tenho um aplicativo Node.JS bastante padrão executando Express, Socket.IO, Passenger, etc. Meu servidor de produção está executando o Ubuntu Server 12.04 LTS. Em um nível alto, meu fluxo de trabalho de implantação é aproximadamente:
forever restart
O aplicativo Node.JS está sendo executado na porta 8080 e eu tenho iptables configurado para encaminhar o tráfego da porta 80 para o aplicativo Node.
Existem alguns problemas com esta configuração. O mais significativo é a interrupção do serviço. Como meu aplicativo está usando WebSockets, sempre que forever reinicia o servidor, todos os usuários conectados perdem sua sessão de WebSockets. O Socket.IO reconecta automaticamente os usuários, mas as informações da sessão dos usuários não são transferidas para a nova instância do servidor. Outro problema é com o tratamento de erros. Se o servidor Node.JS encontrar uma exceção não manipulada (o que é uma realidade infeliz), o forever mata e reinicia o servidor, fazendo com que todos os usuários percam a sessão do WebSockets.
Servidores implantados com tecnologias mais tradicionais, como PHP e Apache, não têm esse problema porque (se eu entendi corretamente) cada conexão é executada em seu próprio encadeamento, portanto, uma nova implementação não afeta os usuários ativos no momento e exceção no PHP interrompe apenas uma sessão do usuário, em vez de matar o servidor para todos.
Então, como implantar o Node.JS sem interromper o serviço para preservar a sessão por usuário?
Tags socket node.js deployment