Como executo um aplicativo Node.js. como seu próprio processo?


195

Qual é a melhor maneira de implantar o Node.js?

Eu tenho um VPS Dreamhost (é o que eles chamam de VM ) e pude instalar o Node.js e configurar um proxy. Isso funciona muito bem, desde que eu mantenha aberta a conexão SSH que iniciei o nó.


6
Hmm, parece-me estranho que você chame usando o Forever como "deploying node.js". Não é apenas uma ferramenta de monitoramento / supervisão de processos? Geralmente, a implantação na Web significa (pelo menos o que encontro nos artigos) várias atividades inter-relacionadas que disponibilizam um aplicativo da Web (essa ferramenta de processo faz parte dele). De qualquer forma, este ainda é um ótimo post aqui no StackOverflow, como aprendi com as respostas de todos.
— Mikong

Esta é apenas a implantação mais simples do node.js no Dreamhost. O objetivo era simplesmente fazer o nó funcionar de forma confiável como ponto de partida para a construção.
— RespectTheCode

Como você lidou com o encaminhamento do domínio para o nó da porta em execução?
— GRM


Estamos usando o Elastic Beanstalk agora e está funcionando muito bem.
— RespectTheCode #

Respostas:


107

Resposta de 2016 : quase toda distribuição Linux vem com systemd, o que significa que eternamente, monit, PM2 etc. não são mais necessários - o seu sistema operacional já lida com essas tarefas .

Crie um myapp.servicearquivo (substituindo 'myapp' pelo nome do seu aplicativo, obviamente):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nobody
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Observe se você é novo no Unix: /var/www/myapp/app.js deve ter #!/usr/bin/env nodena primeira linha.

Copie seu arquivo de serviço para a /etc/systemd/systempasta

Informe o systemd sobre o novo serviço com systemctl daemon-reload.

Comece com systemctl start myapp.

Habilite para rodar na inicialização com systemctl enable myapp.

Veja logs com journalctl -u myapp

Isso é retirado de Como implantamos aplicativos de nó no Linux, edição 2018 , que também inclui comandos para gerar um AWS / DigitalOcean / Azure CloudConfig para criar servidores Linux / nó (incluindo o .servicearquivo).


1
Alguma idéia de como lidar Failed to issue method call: Unit name ... is not valid.?
— Julien Genestoux

1
@JulienGenestoux o nome da 'unidade' é igual ao seu serviço. Parece que há uma discrepância lá. Depois de copiar o arquivo, /etc/systemd/systemvocê pode precisar executar systemctl daemon-reload(o systemd normalmente informa se isso é necessário). TBH, isso é melhor perguntado como uma pergunta separada.
— Mikemaccana

3
Em vez de copiar seu arquivo de serviço /etc/systemd/system, você pode simplesmente usar systemctl enable /full/path/to/myapp.service, o que cria um link simbólico /etc/systemd/systempara você.
— Arne

1
Como ele se compara ao pm2? Ele pode substituir o pm2 ou o pm2 oferece os recursos mais necessários?
— Sergei Basharov 30/10

1
@VinodSrivastav nodeé chamado por /var/www/myapp/app.jssi só. No Unix, se você tornar um arquivo executável, e a primeira linha começar com #!/some/fileo arquivo será interpretada com esse binário. Google 'intérprete Unix' para saber mais.
— Mikemaccana 5/01

101

Use para sempre . Ele executa os programas Node.js em processos separados e os reinicia, se houver algum.

Uso:

  • forever start example.js para iniciar um processo.
  • forever list para ver a lista de todos os processos iniciados por sempre
  • forever stop example.jspara interromper o processo ou forever stop 0para o processo com o índice 0 (como mostrado por forever list).

Isto está perto. Começa muito bem, mas não me deixa parar nada. Consegui fazer logoff e logon novamente e depois matar o processo do nó. Para sempre não o reiniciou. Então, eu estou pensando que algo sobre como ele funciona não é compatível com o DH.
— RespectTheCode

@ Kevin, você não pode matar o processo do nó porque o Forever em si é executado no nó! Adicionei algumas instruções de uso à minha resposta, incluindo como interromper um processo. Eu tenho usado isso no meu VPS e funcionou como um encanto.
— David Tang

forever stop 0cometeu um erro e as coisas meio que desmoronaram a partir daí. Eu tenho tentado fazer isso sem root em seu próprio usuário, para que eu possa limpar facilmente quando encontrar a solução certa. Esse pode ser o meu problema. Vou investigar um pouco mais.
— respectTheCode

Eu tinha algo errado com o npm que estava causando problemas. Com o npm e o nó instalado corretamente, sempre funciona muito bem. O que acabei fazendo foi adicionar os comandos de início permanente a um cronjob definido para execução na reinicialização. Agora estou trabalhando em um pequeno aplicativo de nó que me permitirá iniciar e parar os procs para sempre.
— RespectTheCode

Há uma alternativa para sempre que utiliza a API do nó nativa cluster: github.com/superjoe30/naught
— andrewrk

41

Eu escrevi sobre o meu método de implantação aqui: Implantando aplicativos node.js.

Em resumo:

  • Use o gancho pós-recebimento git
  • Jake para a ferramenta de construção
  • Iniciante como um wrapper de serviço para o nó
  • Monit para monitorar e reiniciar aplicativos que eles vão para baixo
  • nginx para rotear solicitações para aplicativos diferentes no mesmo servidor

2
Se eu sempre tiver um único site de Nó no meu servidor, posso abandonar o Nginx com segurança?
— Dor

3
O link parece estar quebrado
— verybadalloc

@Dor eu sei que esta é uma resposta tardia, mas não o faria. Além de coisas como terminação SSL e cache, um proxy reverso nginx na frente do host permite uma maior flexibilidade de infraestrutura do que executar o nó diretamente na porta 80. Isso também significa que você não precisa executar o nó como raiz, o que eu acho que é um argumento bastante pesado a favor da configuração do nginx.
— 31815 Chris Browne

16

pm2 faz os truques.

Os recursos são: Monitoramento, recarga de código ativo, balanceador de carga interno, script de inicialização automática e processos de ressurreição / despejo.


É compatível com serviços como o Heroku?
— FRD

@FRD Eu não acho que trabalha com heroku, verifique este artigo
— nickleefly

9

Você pode usar monit, forever, upstartou systemdpara iniciar o seu servidor.

Você pode usar o verniz ou o HAProxy em vez do Nginx (sabe-se que o Nginx não funciona com websockets).

Como uma solução rápida e suja que você pode usar nohup node your_app.js &para impedir que seu aplicativo terminar com o seu servidor, mas forever, monite outras soluções propostas são melhores.


2
Um usuário "Sergey Yarotskiy" tentou editar sua postagem dizendo que o Nginx agora suporta WebSockets (desde a versão 1.3). Rejeitei a edição, pois acho que deveria ser postada como um comentário. (Caso contrário, você teria duas sentenças contraditórias no mesmo lugar, o que é confuso.)
— Backlin

7

Criei um script Upstart usado atualmente para meus aplicativos:

description "YOUR APP NAME"
author "Capy - http://ecapy.com"

env LOG_FILE=/var/log/node/miapp.log
env APP_DIR=/var/node/miapp
env APP=app.js
env PID_NAME=miapp.pid
env USER=www-data
env GROUP=www-data
env POST_START_MESSAGE_TO_LOG="miapp HAS BEEN STARTED."
env NODE_BIN=/usr/local/bin/node
env PID_PATH=/var/opt/node/run
env SERVER_ENV="production"

######################################################

start on runlevel [2345]
stop on runlevel [016]

respawn
respawn limit 99 5

pre-start script
    mkdir -p $PID_PATH
    mkdir -p /var/log/node
end script

script
    export NODE_ENV=$SERVER_ENV
    exec start-stop-daemon --start --chuid $USER:$GROUP --make-pidfile --pidfile $PID_PATH/$PID_NAME --chdir $APP_DIR --exec $NODE_BIN -- $APP >> $LOG_FILE 2>&1
end script

post-start script
    echo $POST_START_MESSAGE_TO_LOG >> $LOG_FILE
end script

Personalize tudo antes de #########, crie um arquivo em /etc/init/your-service.conf e cole-o lá.

Então você pode:

start your-service
stop your-service
restart your-service
status your-service

Obrigado, exatamente o que eu precisava.
— Nilson Morais


5

Aqui está um artigo mais longo sobre como resolver esse problema com o systemd: http://savanne.be/articles/deploying-node-js-with-systemd/

Algumas coisas a ter em mente:

  • Quem iniciará seu monitoramento de processos? O Forever é uma ótima ferramenta, mas precisa de uma ferramenta de monitoramento para se manter em funcionamento. Isso é um pouco bobo, por que não usar seu sistema init?
  • Você pode monitorar adequadamente seus processos?
  • Você está executando vários back-ends? Em caso afirmativo, você possui disposições em vigor para impedir que algum deles derrube os outros em termos de uso de recursos?
  • O serviço será necessário o tempo todo? Caso contrário, considere a ativação do soquete (consulte o artigo).

Todas essas coisas são feitas facilmente com o systemd.



3

Para sempre fará o truque.

@ Kevin: Você deve ser capaz de matar processos bem. Eu verificaria a documentação um pouco. Se você puder reproduzir o erro, seria ótimo publicá-lo como um problema no GitHub.


Quem é Kevin? O OP?
— Peter Mortensen


2

Como Box9 disse, Forever é uma boa escolha para código de produção. Mas também é possível manter um processo em andamento, mesmo que a conexão SSH seja fechada a partir do cliente.

Embora não seja necessariamente uma boa ideia para a produção, isso é muito útil quando no meio de longas sessões de depuração, ou após a saída do console de processos demorados, ou sempre que é útil desconectar sua conexão SSH, mas mantenha o terminal ativo no servidor para se reconectar mais tarde (como iniciar o aplicativo Node.js. em casa e reconectar-se ao console mais tarde no trabalho para verificar como estão as coisas).

Supondo que seu servidor seja uma caixa * nix, você pode usar o comando screen do shell para manter o processo em execução, mesmo se o SSH do cliente estiver fechado. Você pode fazer o download / instalar a tela da Web, se ainda não estiver instalada (procure um pacote para sua distribuição, se Linux, ou use MacPorts, se OS X).

Funciona da seguinte forma:

  1. Quando você abrir a conexão SSH pela primeira vez, digite 'screen' - isso iniciará sua sessão de tela.
  2. Comece a trabalhar normalmente (ou seja, inicie o aplicativo Node.js.)
  3. Quando terminar, feche o seu terminal. O (s) processo (s) do servidor continuarão em execução.
  4. Para reconectar-se ao seu console, ssh de volta ao servidor, efetue login e digite 'screen -r' para reconectar. Seu antigo contexto de console voltará pronto para você continuar a usá-lo.
  5. Para sair da tela, enquanto estiver conectado ao servidor, digite 'exit' no prompt do console - isso o levará ao shell comum.

Você pode ter várias sessões de tela em execução simultaneamente, se necessário, e pode se conectar a qualquer uma delas a partir de qualquer cliente. Leia a documentação online para todas as opções.


Boa informação para ter. Concordo que não funcionaria para produção, mas poderia ser muito útil ao depurar em um servidor remoto.
— respectTheCode

por que não usar nohup nó myapp.js & 2> /var/log/myapp.log 1> / dev / null
— markus_p

Eu encontrei este útil youtube.com/watch?v=P4mT5Tbx_KE explicando nohupeforever
— Vinod Srivastav

1

Forever é uma boa opção para manter os aplicativos em execução (e é o npm instalável como um módulo, o que é bom).

Mas, para uma "implantação" mais séria - como gerenciamento remoto de implantação, reinicialização, execução de comandos etc. - eu usaria o capistrano com a extensão do nó.

https://github.com/loopj/capistrano-node-deploy


1

https://paastor.com é um serviço relativamente novo que faz a implantação para você, em um VPS ou outro servidor. Há uma CLI para enviar código. O Paastor possui um nível gratuito, pelo menos no momento da publicação.



1

Tente node-deploy-server . É um conjunto de ferramentas complexo para implantar um aplicativo em seus servidores privados. Está escrito em Node.js e usa o npm para instalação.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.