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

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

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

2016答 :几乎所有的Linux发行版都带有systemd,这意味着永远不会再需要监听等等 – 您的操作系统已经可以处理这些任务了

创build一个myapp.service文件(显然,用您的应用程序的名称replace“myapp”):

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

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

通过systemctl daemon-reload告诉systemd新的服务。

systemctl start myapp

启用它与systemctl enable myapp启动运行。

journalctl -u myapp查看日志

更多详情请见: 我们如何在Linux上部署节点应用程序,2016版

永远使用。 它在不同的进程中运行Node.js程序,并在有死亡的情况下重新启动它们。

用法:

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

我在这里写了关于我的部署方法: 部署node.js应用程序

简而言之:

  • 使用git post-receive钩子
  • 杰克的构build工具
  • Upstart作为节点的服务包装
  • Monit监视并重新启动他们closures的应用程序
  • nginx将请求路由到同一台服务器上的不同应用程序

pm2做的伎俩。

其特点是:监控,热代码重新加载,内置负载平衡器,自动启动脚本和复活/转储过程。

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

您可以使用Varnish或HAProxy来代替Nginx(Nginx已知不能使用websockets)。

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

我做了一个当前用于我的应用程序的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中创build一个文件并粘贴到那里。

然后你可以:

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

以下是有关使用systemd解决此问题的较长文章: http : //savanne.be/articles/deploying-node-js-with-systemd/

有些事情要记住:

  • 谁将开始您的stream程监控? 永远是一个伟大的工具,但它需要一个监视工具来保持自己的运行。 这有点傻,为什么不使用你的init系统呢?
  • 你能充分监控你的stream程吗?
  • 你是否运行多个后端? 如果是这样的话,你有没有条款来防止他们在资源使用方面把他人贬低?
  • 服务是否需要所有的时间? 如果没有,请考虑套接字激活(请参阅文章)。

所有这些事情都可以用systemd轻松完成。

如果你有root权限,你最好设置一个守护进程,使其在后台运行安全可靠。 您可以阅读如何在Debian和Ubuntu的博客文章中运行Node.js作为Ubuntu服务

我已经写了一个非常全面的指南来部署Node.js和示例文件:

教程:如何使用示例部署Node.js应用程序

它涵盖了诸如http-proxy, SSL和Socket.IO之类的东西 。

永远会做的伎俩。

@凯文:你应该可以杀死stream程。 我会仔细检查一下文档。 如果你能重现这个错误,那么把它作为一个问题发布到GitHub上将是非常好的。

试试这个: 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应用的详细指南

正如Box9所说, Forever是生产编码的好select。 但即使从客户端closures了SSH连接,也可以保持一个进程。

虽然不一定是生产的好主意,但在长时间debugging会话期间,或在遵循长时间进程的控制台输出时,或在何时有用于断开SSH连接,但在服务器中保持活动状态稍后重新连接(如在家中启动Node.js应用程序,稍后在工作中重新连接到控制台以检查事情进展情况)。

假设你的服务器是一个* nix框,你可以使用shell的屏幕命令来保持进程的运行,即使客户端的SSHclosures了。 如果尚未安装,可以从网上下载/安装屏幕(如果是Linux,请查找您的发行包;如果是OS X,请使用MacPorts )。

它的工作原理如下:

  1. 当你第一次打开SSH连接时,input'screen' – 这将开始你的屏幕会话。
  2. 开始正常工作(即启动您的Node.js应用程序)
  3. 当你完成后,closures你的terminal。 您的服务器进程将继续运行。
  4. 重新连接到您的控制台,ssh回到服务器,login,然后input'screen -r'重新连接。 旧的控制台上下文将popup,准备继续使用它。
  5. 要退出屏幕,在连接到服务器的同时,在控制台提示符处input“exit”,这将使您进入常规shell。

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

永远是保持应用程序运行的一个很好的select(它是npm安装作为一个很好的模块)。

但是对于更加严重的“部署” – 例如远程pipe理部署,重新启动,运行命令等 – 我将使用带有节点扩展的capistrano。

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

https://paastor.com是一个相对较新的服务,可以为您部署VPS或其他服务器。; 有一个CLI来推送代码。 Paastor有一个免费的阶层,至less在发布这个时候做了。

在你的情况下,你可以使用新贵的守护进程。 对于完整的部署解决scheme,我可能会build议capistrano 。 两个有用的指南是如何设置Node.js env如何部署通过capistrano +暴发户

尝试节点部署服务器 。 这是一个将应用程序部署到私有服务器上的复杂工具集。 它是用Node.js编写的,使用npm进行安装。