Estou usando o módulo forever do nó para manter meu servidor de nós em execução. Para sempre, porém, termina quando há uma reinicialização do sistema. Existe alguma maneira de iniciar automaticamente o servidor do nó (com uma eternidade) quando o sistema reiniciar?
190
Respostas:
Eu sugeriria o uso do crontab. É fácil de usar.
Como
Para iniciar a edição, execute o seguinte substituindo o "testuser" pelo usuário de tempo de execução desejado para o processo do nó. Se você escolher um usuário diferente de você, será necessário executá-lo com o sudo.
Se você nunca fez isso antes, ele perguntará com qual editor você deseja editar. Eu gosto do vim, mas recomendarei o nano para facilitar o uso.
Uma vez no editor, adicione a seguinte linha:
Salve o arquivo. Você deve receber algum feedback de que o cron foi instalado.
Para confirmação adicional da instalação do cron, execute o seguinte (substituindo novamente "testuser" pelo nome de usuário de destino) para listar os crons atualmente instalados:
Observe que, na minha opinião, você sempre deve usar caminhos completos ao executar binários no cron. Além disso, se o caminho para o script forever não estiver correto, execute
which forever
para obter o caminho completo.Dadas as
forever
chamadasnode
, você também pode fornecer o caminho completo paranode
:Leitura adicional
fonte
@reboot
cron é executado no inicio do cron deamon. Para adicionar, nunca me deparei com uma situação que sugerisse que meus cron's configurados em@reboot
não sejam executados na inicialização do sistema. A maneira como você o encerra é irrelevante para isso./home
ainda não está montado, portanto, isso não funcionará se o seu código residir/home
.@reboot varname=value ...
Você pode usar o serviço permanente para fazer isso.
Isso fornecerá o app.js no diretório atual como um serviço para sempre. O serviço será reiniciado automaticamente sempre que o sistema for reiniciado. Além disso, quando parado, tentará uma parada suave. Esse script também fornece o script logrotate.
URL do Github: https://github.com/zapty/forever-service
NOTA: Sou o autor do serviço permanente.
fonte
forever-service install test
,test
será o nome do serviço , mas não o nome do arquivo .js do programa / nó real a ser executado. Por padrão, ele assume o nome do programa éapp.js
, mas você pode substituí-lo com a--script
bandeira, como segue:forever-service install test --script main.js
. (Não testado, então por favor me corrigir se há alguma sintaxe detalhe errado.)Este caso é válido para o Debian.
Adicione o seguinte a
/etc/rc.local
/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}
{{user}}
substitui seu nome de usuário.{{app path}}
substitui o caminho do seu aplicativo. Por exemplo,/var/www/test/app.js
fonte
/etc/rc.local
, não/etc/init.d/rc.local
app.js
para garantir que os arquivos relativos sejam carregados corretamente -process.chdir('/your/path/to/your/app');
Node.js. ref docs here/etc/rc.local
fazer o truque para mim:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
Instale o PM2 globalmente usando o NPM
npm install pm2 -g
Comece seu script com pm2
pm2 start app.js
gerar um script de inicialização ativo
pm2 startup
NOTA: a inicialização do pm2 é para iniciar o PM2 quando o sistema é reiniciado. O PM2, uma vez iniciado, reinicia todos os processos que estava gerenciando antes da queda do sistema.
Caso deseje desativar a inicialização automática, basta usar o pm2 unstartup
Se você deseja que o script de inicialização seja executado em outro usuário, use a
-u <username>
opção e o--hp <user_home>:
fonte
Um método alternativo de crontab inspirado nesta resposta e nesta postagem do blog.
1. Crie um arquivo de script bash (altere bob para o usuário desejado).
2. Copie e cole isso dentro do arquivo que você acabou de criar.
Certifique-se de editar os caminhos acima de acordo com sua configuração!
3. Verifique se o script bash pode ser executado.
4. Teste o script bash.
5. Substitua "bob" pelo usuário de tempo de execução para o nó.
6. Copie e cole (altere bob para o usuário desejado).
Salve o crontab.
Você chegou ao fim, seu prêmio é uma reinicialização (para testar) :)
fonte
Resposta copiada da pergunta em anexo .
Você pode usar o PM2 , é um gerenciador de processos de produção para aplicativos Node.js. com um balanceador de carga interno.
Instale o PM2
Iniciar uma aplicação
Se você estiver usando o express, poderá iniciar seu aplicativo como
Listando todos os processos em execução:
Ele listará todo o processo. Em seguida, você pode parar / reiniciar o serviço usando o ID ou o nome do aplicativo com o seguinte comando.
Para exibir logs
fonte
$pm2 startup
Depois disso, você verá o pm2 pedindo para executar manualmente um comando, copie e execute.$pm2 save
Agora , agora o seu app.js sobreviverá à reinicialização do sistemaVocê precisa criar um script de shell na pasta /etc/init.d para isso. É meio complicado se você nunca fez isso, mas há muita informação na web sobre scripts init.d.
Aqui está uma amostra de um script que eu criei para executar um site CoffeeScript para sempre:
Eu tinha que ter certeza de que a pasta e os PATHs estavam explicitamente definidos ou disponíveis para o usuário raiz, pois os scripts init.d são executados como raiz.
fonte
Use o PM2
Qual é a melhor opção para executar o servidor de produção do servidor
Quais são as vantagens de executar seu aplicativo dessa maneira?
O PM2 reiniciará seu aplicativo automaticamente se ele falhar.
O PM2 manterá um registro de suas exceções não tratadas - nesse caso, em um arquivo em /home/safeuser/.pm2/logs/app-err.log.
Com um comando, o PM2 pode garantir que todos os aplicativos gerenciados sejam reiniciados quando o servidor for reiniciado. Basicamente, o aplicativo do nó será iniciado como um serviço.
ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
fonte
O Forever não foi criado para fazer com que os aplicativos de nó funcionassem como serviços. A abordagem correta é criar uma entrada / etc / inittab (sistemas linux antigos) ou um upstart (sistemas linux mais recentes).
Aqui está uma documentação sobre como configurá-lo como um iniciante: https://github.com/cvee/node-upstart
fonte
crontab
não funciona para mim no CentOS x86 6.5. O @reboot parece não estar funcionando.Finalmente, consegui esta solução:
Editar:
/etc/rc.local
Adicione esta linha ao final do arquivo. Mude
USER_NAME
ePATH_TO_PROJECT
para o seu próprio país.NODE_ENV=production
significa que o aplicativo é executado no modo de produção. Você pode adicionar mais linhas se precisar executar mais de um aplicativo node.js.Não defina
NODE_ENV
em uma linha separada, seu aplicativo continuará sendo executado no modo de desenvolvimento, porque sempre não é possívelNODE_ENV
.Salve e saia do vi (pressione
ESC : w q return
). Você pode tentar reiniciar o servidor. Após a reinicialização do servidor, o aplicativo node.js. deve ser executado automaticamente, mesmo se você não fizer login em nenhuma conta remotamente via ssh.É melhor definir o
NODE_ENV
ambiente em seu shell.NODE_ENV
será definido automaticamente quando sua contaUSER_NAME
fizer login.Assim, você pode executar comandos como parar / iniciar para sempre
/PATH_TO_PROJECT/app.js
via ssh sem configurarNODE_ENV
novamente.fonte
Eu escrevi um script que faz exatamente isso:
https://github.com/chovy/node-startup
Eu não tentei com uma eternidade, mas você pode personalizar o comando que ele executa, por isso deve ser direto:
fonte
Eu tentei muitas das respostas acima. Nenhum deles funcionou para mim. Meu aplicativo está instalado no
/home
e como usuário, não como root. Isso provavelmente significa que, quando os scripts de inicialização mencionados acima são executados,/home
ainda não está montado, portanto o aplicativo não é iniciado.Então eu encontrei estas instruções da Digital Ocean:
https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps
Usar o PM2 como explicado foi muito simples e funciona perfeitamente: Meus servidores virtuais tiveram duas falhas físicas desde - o tempo de inatividade foi de apenas um minuto.
fonte
O problema com o rc.local é que os comandos são acessados como raiz, o que é diferente de fazer logon como usuário e usar o sudo.
Resolvi esse problema adicionando um script .sh com os comandos de inicialização que desejo etc / profile.d. Qualquer arquivo .sh em profile.d será carregado automaticamente e qualquer comando será tratado como se você usasse o sudo comum.
A única desvantagem disso é que o usuário especificado precisa fazer logon para iniciar o processo, o que na minha situação sempre foi o caso.
fonte
exemplo completo crontab (localizado em / etc / crontab) ..
fonte
Você pode usar o seguinte comando no seu shell para iniciar seu nó para sempre:
Você deve ter em mente que o servidor no qual seu aplicativo está sendo executado deve sempre ser mantido.
fonte