我如何运行一个Node.js应用程序作为它自己的进程?

部署Node.js的最佳方式是什么?

我有一个Dreamhost VPS(这就是他们所说的虚拟机),我已经能够安装Node.js并设置代理。只要我保持我开始节点时打开的SSH连接,这就工作得很好。

102693 次浏览

如果你有root权限,你最好设置一个守护进程,让它在后台安全运行。你可以在博客文章在Ubuntu上运行Node.js as a Service .js中阅读如何为DebianUbuntu这样做。

使用永远。它在单独的进程中运行Node.js程序,如果有任何死机,就重新启动它们。

用法:

  • forever start example.js开始一个进程。
  • forever list查看由forever启动的所有进程的列表
  • forever stop example.js停止进程,或forever stop 0停止索引为0的进程(如forever list所示)。

永远将做到这一点。

@Kevin:你应该可以很好地杀死进程。我会再检查一下文件。如果你可以重现错误,这将是伟大的张贴它作为一个问题在GitHub上。

在你的情况下,你可以使用自命不凡的人守护进程。对于一个完整的部署解决方案,我建议使用capistrano。两个有用的指南是如何设置Node.js env .js env如何通过capistrano + upstart部署

我已经在这里写了我的部署方法:部署node.js应用

简而言之:

  • 使用git post-receive hook
  • 杰克用于构建工具
  • Upstart作为节点的服务包装器
  • 监视并重新启动应用程序,如果他们去
  • nginx将请求路由到同一服务器上的不同应用程序

你可以使用monitforeverupstartsystemd来启动你的服务器。

你可以使用Varnish或HAProxy来代替Nginx (Nginx不支持websockets)。

作为一个快速而肮脏的解决方案,你可以使用nohup node your_app.js &来防止你的应用程序终止于你的服务器,但forevermonit和其他建议的解决方案更好。

我已经写了一个相当全面的部署Node.js的指南,并提供了示例文件:

< a href = " http://gun。 . io/blog/ Tutorial - Deploy -node-js-server- With -example/" rel="nofollow noreferrer">教程:如何部署Node.js应用程序,带示例

它涵盖了http-proxy, SSL套接字。IO

正如Box9所说,永远是生产代码的一个很好的选择。但是,即使客户端关闭了SSH连接,也可以让进程继续运行。

虽然对于生产环境来说不一定是一个好主意,但当处于长时间调试会话中间,或者遵循长时间进程的控制台输出,或者当断开SSH连接有用时,这非常方便,但要保持服务器中的终端处于活动状态,以便稍后重新连接(例如在家中启动Node.js应用程序,然后在工作时重新连接到控制台,以检查事情的进展)。

假设你的服务器是一个*nix盒子,你可以从shell中使用屏幕命令来保持进程运行,即使客户端SSH关闭。如果尚未安装,您可以从web上下载/安装屏幕(如果是Linux,请为您的发行版寻找软件包,如果是OS X,则使用MacPorts)。

其工作原理如下:

  1. 当您第一次打开SSH连接时,键入'screen' -这将启动您的屏幕会话。
  2. 正常工作(即启动你的Node.js应用程序)
  3. 完成后,关闭终端。您的服务器进程将继续运行。
  4. 要重新连接到控制台,请ssh回服务器,登录并输入'screen -r'重新连接。旧的控制台上下文将弹出回来,以便您继续使用它。
  5. 要退出屏幕,在连接到服务器时,在控制台提示符上键入'exit' -这将使您进入常规shell。

如果需要,可以像这样同时运行多个屏幕会话,并且可以从任何客户机连接到其中任何一个。请在线阅读文档以获得所有选项。

下面是一篇关于用systemd: http://savanne.be/articles/deploying-node-js-with-systemd/解决这个问题的较长文章

请记住以下几点:

  • 谁将开始您的过程监视?Forever是一个很棒的工具,但它需要一个监控工具来保持自身的运行。这有点傻,为什么不直接用init系统?
  • 你能充分监控你的过程吗?
  • 您是否运行多个后端?如果是,您是否有适当的规定来防止其中任何一个在资源使用方面影响其他的?
  • 服务会一直被需要吗?如果不是,请考虑套接字激活(请参阅文章)。

有了系统,所有这些事情都很容易完成。

Forever是保持应用程序运行的一个好选择(而且它是npm可安装的模块,这很好)。

但对于更严肃的“部署”——比如远程管理部署、重新启动、运行命令等——我会使用capistrano和节点扩展。

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

我做了一个Upstart脚本,目前用于我的应用程序:

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

自定义#########之前的所有内容,在/etc/init/your-service.conf中创建一个文件并粘贴到那里。

然后你可以:

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

pm2做的技巧。

特性包括:监控、热代码重载、内置负载均衡器、自动启动脚本和恢复/转储进程。

试试这个:http://www.technology-ebay.de/the-teams/mobile-de/blog/deploying-node-applications-with-capistrano-github-nginx-and-upstart.html

关于使用Capistrano, Upstart和Nginx部署Node.js应用程序的一个伟大而详细的指南

node-deploy-server试试。它是一个复杂的工具集,用于将应用程序部署到您的私有服务器上。它是用Node.js编写的,并使用npm进行安装。

https://paastor.com是一个相对较新的服务,它为你部署到VPS或其他服务器。有一个CLI来推送代码。牧师有一个免费层,至少在发布这篇文章的时候。

2016的答案:几乎每个Linux发行版都带有systemd,这意味着永远,monit, PM2等不再需要-你的操作系统已经处理这些任务

创建一个myapp.service文件(显然,将'myapp'替换为应用程序的名称):

[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=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp


[Install]
WantedBy=multi-user.target

如果你是Unix新手,请注意: /var/www/myapp/app.js应该在第一行有#!/usr/bin/env node,并将可执行模式打开为chmod +x myapp.js

将服务文件复制到/etc/systemd/system文件夹中。

systemctl daemon-reload告诉systemd新服务。

systemctl start myapp开始。

使用systemctl enable myapp使其在引导时运行。

查看带有journalctl -u myapp的日志

这来自我们如何在Linux上部署节点应用程序,2018版,其中还包括生成AWS/DigitalOcean/Azure CloudConfig以构建Linux/node服务器的命令(包括.service文件)。