ti-enxame.com

Implantando um servidor Node.js de produção

Eu escrevi um aplicativo Node.js. Estou procurando executá-lo em uma de nossas máquinas de produção. Parece uma solicitação bastante comum, mas não consigo encontrar uma solução adequada. Não há soluções estabelecidas para implantar aplicativos Node.js. de produção?

O aplicativo é simples (<100 LOC), mas precisa ser muito eficiente, confiável e pode ser executado continuamente por anos sem reiniciar. Ele será executado em um site grande, com dezenas de conexões/segundo. (o aplicativo não é usado como servidor da Web, ele possui apenas uma API JSON)

Aqui estão as abordagens que eu considerei, mas ainda não tenho certeza:

sando uma estrutura (por exemplo, Express)

Como o aplicativo precisa ter alto desempenho e ser muito simples, adicionar inchaço na forma de uma estrutura é algo que eu quero evitar.

Iniciando o servidor com Nohup

O principal problema aqui é com o tratamento de exceções, (obviamente) não queremos que todo o servidor falhe por causa de uma exceção. Pelo que entendi, agrupar o aplicativo inteiro em um loop try {} catch {} não ajudará porque o intérprete Javascript é deixado em um estado imprevisível após uma exceção. Isso está correto?

sando algo como Forever

Instalei o Forever em uma máquina FreeBSD nossa e foi muito complicado. Acabou gerando infinitos processos que não poderiam ser mortos pela Forever. Eu tive que executar kill -9 para recuperar minha máquina e não me sinto muito confiante em executar um aplicativo de produção no Forever. Parece também que o Upstart (ferramenta semelhante, mas mais genérica) não será executado no FreeBSD.

Soluções hospedadas (por exemplo: Heroku, Rackspace, Amazon EC2, etc.)

Essa é provavelmente a solução mais simples, mas já temos um hardware sério para o restante de nossos servidores da web. Por considerações financeiras, isso não faz sentido.

Certamente deve haver alguma solução estabelecida para isso? Estou esquecendo de algo?

75
David Chouinard
  • Você realmente deve usar uma estrutura (eu recomendo algo como o Express, pois foi testado em batalha), a menos que queira lidar com sessões, cookies, middleware etc. Express é realmente leve.
  • Iniciando o servidor com Nohup: você não deve fazer isso, basta iniciá-lo com o comando "node" comum. O Express também agrupa as rotas em um try-catch, para que o servidor não trava em uma rota. No entanto, se o seu servidor tiver um problema sério, não se preocupe em reiniciá-lo (além disso, se você tiver 2-3 processos pelo menos, apenas um morrerá, então haverá pelo menos um a dois e o usuário vencerá ' não sinto nada).
  • Para o monitoramento, eu pessoalmente prefiro algo mais no nível do sistema operacional, como pstart e Monit .
  • Solução de hospedagem: como você já possui seu próprio hardware sério, não há necessidade de investir dinheiro em outra coisa. Basta usar um balanceador de carga (talvez nginx ou node-http-proxy) para fazer o proxy.
40
alessioalex

Consulte Hospedando Node Aplicativos .

Este tutorial orienta você na configuração de um servidor que pode hospedar aplicativos node.js para aplicativos JavaScript do lado do servidor. No momento, as opções de hospedagem node.j se resumem a processos daemon do nó em execução que conversam com um servidor da web. A maioria dos servidores da Web pode conectar conexões de proxy a uma porta diferente, para que você possa usar o Apache ou o nginx para fazer isso.

15
helpermethod

Existem três perguntas aqui, eu acho.

Pergunta 0: "Devo usar uma estrutura para meu aplicativo de nó?"

Pergunta 1: "Como executo servidores de nó em máquinas de produção?"

Pergunta 2: "Como implanto aplicativos de nó na produção".

Para Questão 1 , eu realmente gosto de Cluster (embora a última versão Node _ tenha algo parecido com o criado para que você possa conferir). Tive um bom sucesso com algo como o Monit/Upstart para monitorar eventos no nível do sistema operacional e garantir que seus servidores estejam em boas condições. (Isso estava monitorando N clusters de Ruby servidores thin, mas a mesma coisa).

Dependendo do tráfego, convém executar o cluster em várias máquinas e, em seguida, colocar um balanceador de carga na frente. Isso depende do seu tráfego, quanto tempo as solicitações demoram para ser concluídas/quanto tempo você bloqueia o loop de eventos e quantas instâncias de processadores/nós são iniciadas por máquina.

Uma estrutura fornece um melhor tratamento de erros e captura erros que sairiam dos aplicativos node.js. normais. Se você fizer isso sem uma estrutura, leia sobre o tratamento de erros no node.js.

Para Questão 2 , não acho que a comunidade de nós ainda tenha um bom padrão de implementação. Você pode tentar usar a ferramenta Capistrano do Ruby (e aqui está ma entrada de blog falando sobre a implantação de cluster com o Capinstrano ).

O lado ruim do Capistrano é que ele faz algumas suposições que podem não ser verdadeiras (ou seja, que você está implantando um projeto Rails]), então você pode acabar brigando bastante com o framework.

Minha solução de implantação Goto em geral é a ferramenta Fabric do Python, que fornece ferramentas de implantação e permite que você faça o que precisa.

Outra opção de implantação é "a nuvem", com coisas como Nodester : deixe-os cuidar disso.

5
RyanWilcox

Tente usar o pm2, é uma CLI simples e intuitiva, instalável via NPM. Basta iniciar seu aplicativo com o PM2 e ele estará pronto para lidar com uma tonelada de tráfego

Link oficial do PM2

Como configurar um aplicativo js do nó para produção usando pm2

5
Sunil Hirole

Você pode obter respostas melhores no ServerFault, mas há uma descrição de a experiência de um usuário aqui usando supervisord . Você precisará usar algum tipo de observador de processo para manter vivo o processo node, e outra recomendação comum parece ser a reversão de conexões de proxy com o processo node de alguma forma. Provavelmente, eu votaria em nginx (dessa maneira, você pode fazer com que nginx lide com o log, autenticação ou qualquer outro recurso HTTP de nível superior necessário, em vez de de alguma forma inseri-los no nó), mas o artigo mencionado acima menciona haproxy nos comentários aqui e aí pode ser mais leve. Sua escolha do proxy reverso provavelmente dependerá em grande parte da necessidade ou não do suporte ao WebSocket.

Não tenho certeza de que exista ainda mais fluxo de trabalho "padrão" para o nó; não é tão maduro quanto algo como Rails que tem inúmeras maneiras de manter um aplicativo da web em execução.

2
Wyatt Anderson

O pessoal da Cloudkick escreveu uma excelente solução para isso. É chamado Cast, http://cast-project.org/ .

Instale o elenco no servidor e na estação de trabalho. Você inicia o agente de conversão no servidor e faz com que sua estação de trabalho assine com a instância de conversão de servidores. Você pode criar "pacotes", enviá-los para o servidor, criar/atualizar/destruir a partir deles, bem como iniciar/parar suas instâncias. O Google Cast reiniciará seus serviços automaticamente quando eles falharem. Você também pode ajustar o stdout/strerr remotamente, além de obter uma lista de instâncias em execução e PID # s e gerenciar suas instâncias/servidores na sua estação de trabalho (não é necessário SSHing). Os documentos estão um pouco desatualizados, mas os resultados valem um pouco de trabalho extra. Todas as interações/comandos são sobre HTTPS e uma API RESTful.

Antes disso, eu fazia todas as atualizações manualmente com o SCP/SSH. Temos supervise mantendo as coisas. Nós não olhamos para trás.

0
Ryan Olds