如何运行node.js应用程序作为后台服务?

由于这篇文章多年来引起了很多关注,我已经在这篇文章的底部列出了每个平台的顶级解决方案。


原文

我想让我的node.js服务器在后台运行,即:当我关闭我的终端时,我希望我的服务器继续运行。 我GOOGLE了这个,并提出了本教程 ,但它不能按预期工作。 所以,而不是使用该守护进程脚本,我以为我只是使用输出重定向( 2>&1 >> file一部分),但这也不会退出 – 我在我的终端空白行,像它正在等待输出/错误。

我也试图把这个过程放在后台,但是一旦我关闭了终端,这个过程也会被终止。

那么当我关闭本地计算机时,如何让它继续运行?


顶级解决方案

  • Systemd (Linux)
  • 启动 (Mac)
  • 节点窗口 (Windows)
  • PM2 (Node.js)

从我如何运行Node.js应用程序作为自己的过程复制我自己的答案?

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

创建一个myapp.service文件(显然,用您的应用程序的名称替换“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 start myapp

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

journalctl -u myapp查看日志

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

您可以使用Forever,一个简单的CLI工具来确保给定的节点脚本连续运行(即永远): https : //www.npmjs.org/package/forever

更新 – 正如在下面的答案之一所述, PM2有一些非常好的功能,永远缺失。 考虑使用它。

原始答复

使用nohup :

 nohup node server.js & 

编辑我想补充说,接受的答案是真的要走的路。 我永远使用需要保持的实例。 我喜欢npm install -g forevernpm install -g forever所以它在节点路径中,然后forever start server.js

2016更新: node-windows / mac / linux系列在所有操作系统中都使用了一个通用的API,所以它绝对是一个相关的解决方案。 然而; node-linux生成systemv init文件。 随着systemd越来越流行,在Linux上它实际上是更好的选择。 公关的欢迎,如果有人想添加systemd支持节点的Linux 🙂

原始主题:

现在这是一个相当古老的线程,但node-windows提供了另一种在Windows上创建后台服务的方法。 它松散地基于在节点脚本周围使用exe包装的nssm概念。 然而; 它使用winsw.exe来代替,并提供一个可配置的节点包装器,以便更细粒度地控制进程如何启动/停止失败。 这些过程与其他服务一样可用:

在这里输入图像描述

该模块还烘烤了一些事件记录:

在这里输入图像描述

守护你的脚本是通过代码完成的。 例如:

 var Service = require('node-windows').Service; // Create a new service object var svc = new Service({ name:'Hello World', description: 'The nodejs.org example web server.', script: 'C:\\path\\to\\my\\node\\script.js' }); // Listen for the "install" event, which indicates the // process is available as a service. svc.on('install',function(){ svc.start(); }); // Listen for the "start" event and let us know when the // process has actually started working. svc.on('start',function(){ console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.'); }); // Install the script as a service. svc.install(); 

该模块支持像上限重启(所以糟糕的脚本不会软管你的服务器)和增加重启之间的时间间隔。

由于node-windows服务像任何其他服务一样运行,所以可以使用您已经使用的任何软件来管理/监视服务。

最后,没有make依赖关系。 换句话说,一个简单的npm install -g node-windows将起作用。 您不需要Visual Studio,.NET或节点gyp魔术来安装它。 此外,它是麻省理工学院和BSD许可。

在完全披露,我是这个模块的作者。 它旨在减轻OP经历的痛苦,但是更紧密地集成到操作系统已经提供的功能中。 我希望未来的观众也能找到这个相同的问题。

这可能不是我们所接受的方式,但我是用屏幕来做的,特别是在开发过程中,因为如果有必要的话,我可以把它拿回来,用它来骗人。

 screen node myserver.js >>CTRL-A then hit D 

屏幕将分离,并保持您注销。 然后你可以回到屏幕-r。 点击屏幕手册了解更多详情。 你可以命名屏幕,如果你喜欢的话。

更新 :我更新,包括最新从pm2:

对于许多使用情况,使用systemd服务是管理节点进程的最简单和最合适的方式。 对于在单一环境中运行多个节点进程或独立运行的节点微服务的用户,pm2是一个功能更为全面的工具。

https://github.com/unitech/pm2

http://pm2.io

  • 它有一个非常有用的监视功能 – >漂亮的'gui'命令行监视多个进程与pm2 monit或进程列表与pm2 list
  • 有组织的日志管理 – > pm2 logs
  • 其他的东西:
    • 行为配置
    • 源地图支持
    • PaaS兼容
    • 观看和重新加载
    • 模块系统
    • 最大内存重新加载
    • 集群模式
    • 热重新加载
    • 开发工作流程
    • 启动脚本
    • 自动完成
    • 部署工作流程
    • Keymetrics监测
    • API

我只是使用守护进程 npm模块:

 var daemon = require('daemon'); daemon.daemonize({ stdout: './log.log' , stderr: './log.error.log' } , './node.pid' , function (err, pid) { if (err) { console.log('Error starting daemon: \n', err); return process.exit(-1); } console.log('Daemonized successfully with pid: ' + pid); // Your Application Code goes here }); 

最近我还使用TJ Holowaychuk的 mon(1)来启动和管理简单的节点应用程序。

我使用Supervisor进行开发。 它只是工作。 当您对.js文件进行更改时,Supervisor会自动重新启动您的应用程序并加载这些更改。

这是一个链接到它的Github页面

安装:

sudo npm安装主管-g

您可以轻松地使用-e来观看其他分机。 我经常使用的另一个命令是-i忽略某些文件夹。

即使在注销后,您也可以使用nohup和supervisor使您的节点应用程序在后台运行。

sudo nohup主管myapp.js&

如果您正在运行OSX,那么生成真正系统进程的最简单方法是使用launchd启动它。

像这样构建一个plist,并把它放在/ Library / LaunchDaemons中,名字是top-level-domain.your-domain.application.plist (放置时你需要是root):

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>top-level-domain.your-domain.application</string> <key>WorkingDirectory</key> <string>/your/preferred/workingdirectory</string> <key>ProgramArguments</key> <array> <string>/usr/local/bin/node</string> <string>your-script-file</string> </array> <key>RunAtLoad</key> <true/> <key>KeepAlive</key> <true/> </dict> </plist> 

完成后,发出这个(作为根):

 launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist launchctl start top-level-domain.your-domain.application 

你正在跑步。

而且重启后你仍然会运行。

对于plist中的其他选项,请看这里的手册页: https : //developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

Node.js作为WINDOWS XP中的后台服务

  • 荣誉去Hacksparrow在: http : //www.hacksparrow.com/install-node-js-and-npm-on-windows.html教程安装Node.js + NPM的Windows。
  • 荣誉去Tatham Oddie: http ://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/为nnsm.exe实现。

安装:

  1. 通过安装程序可执行文件安装WGET http://gnuwin32.sourceforge.net/packages/wget.htm
  2. 通过安装程序可执行文件安装GIT http://code.google.com/p/msysgit/downloads/list
  3. 通过将nnsm.exe复制到%windir%/ system32文件夹中安装NSSM http://nssm.cc/download/?page=download
  4. 创建c:\ node \ helloworld.js

     // http://howtonode.org/hello-node var http = require('http'); var server = http.createServer(function (request, response) { response.writeHead(200, {"Content-Type": "text/plain"}); response.end("Hello World\n"); }); server.listen(8000); console.log("Server running at http://127.0.0.1:8000/"); 
  5. 打开命令控制台并键入以下命令

     C:\node> set path=%PATH%;%CD% C:\node> setx path "%PATH%" C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules" C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt C:\node> git clone --recursive git://github.com/isaacs/npm.git C:\node> cd npm C:\node\npm> node cli.js install npm -gf C:\node> cd .. C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js C:\node> net start node-helloworld 
  6. 一个漂亮的批次好东西是创建c:\ node \ ServiceMe.cmd

     @echo off nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1 net start node-%~n1 pause 

服务管理:

  • 现在可以通过“开始 – >运行 – > services.msc”或“开始 – >运行 – > MSCONFIG->服务”(并选中“隐藏所有Microsoft服务”)来访问服务。
  • 该脚本会将通过批处理脚本创建的每个节点添加为“node-”。
  • 同样,他们可以在注册表中找到:“ HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx

被接受的答案可能是最好的生产答案,但是对于做一个快速的开发工作,我发现这个:

nodejs scriptname.js &没有工作,因为nodejs似乎狼吞虎咽的&,所以事情没有让我继续使用终端没有scriptname.js死亡。

但是我把nodejs scriptname.js放在.sh文件中,而nohup sh startscriptname.sh &

绝对不是生产的东西,但它解决了“我需要继续使用我的终端,不想启动5个不同的终端”的问题。

如果你在linux服务器上运行nodejs,我认为这是最好的方法。

创建一个服务脚本并复制到/etc/init/nodejs.conf

启动服务:sudo服务nodejs启动

停止服务:sudo服务nodejs停止

服务脚本

 description "DManager node.js server - Last Update: 2012-08-06" author "Pedro Muniz - pedro.muniz@geeklab.com.br" env USER="nodejs" #you have to create this user env APPNAME="nodejs" #you can change the service name env WORKDIR="/home/<project-home-dir>" #set your project home folder here env COMMAND="/usr/bin/node <server name>" #app.js ? # used to be: start on startup # until we found some mounts weren't ready yet while booting: start on started mountall stop on shutdown # Automatically Respawn: respawn respawn limit 99 5 pre-start script sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log end script script # Not sure why $HOME is needed, but we found that it is: export HOME="<project-home-dir>" #set your project home folder here export NODE_PATH="<project node_path>" #log file, grant permission to nodejs user exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1 end script post-start script # Optionally put a script here that will notifiy you node has (re)started # /root/bin/hoptoad.sh "node.js has started!" end script pre-stop script sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log end script 

为了完善所提出的各种选项,这里还有一个:GNU / Linux中的daemon命令,你可以在这里阅读: http : //libslack.org/daemon/manpages/daemon.1.html 。 (道歉,如果这已经在上面的意见之一提到)。

尝试运行这个命令,如果你正在使用nohup –

 nohup npm start 2>/dev/null 1>/dev/null& 

你也可以永远使用启动服务器

 forever start -c "npm start" ./ 

检查神游! 除了发射很多工作人员,你也可以妖魔化你的节点过程!

http://github.com/pgte/fugue

使用nssm是windows的最佳解决方案,只需下载nssm ,打开cmd到nssm目录并键入

 nssm install <service name> <node path> <app.js path> eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

这将安装一个新的Windows服务,这将列在services.msc从那里你可以启动或停止服务,这个服务将自动启动,你可以配置重新启动,如果失败。

PM2是具有内置负载平衡器的Node.js应用程序的生产过程管理器。 它使您可以永久保持应用程序的活动状态,无需停机即可重新加载应用程序,并且可以方便常见的系统管理任务 https://github.com/Unitech/pm2

我很惊讶没有人提到Guvnor

我已经永远试过,pm2等。但是,当涉及到坚实的控制和基于Web的性能指标时,我发现Guvnor是迄今为止最好的。 另外,它也是完全开源的。

在这里输入图像描述

编辑:但是,我不知道它是否在Windows上工作。 我只使用它在Linux上。

有没有人注意到“2>&1”的错误?

 2>&1 >> file 

应该

 >> file 2>&1 

我在远程主机上使用tmux作为多窗口/窗格开发环境。 分离并保持进程在后台运行非常简单。 看看tmux

2017年6月更新:
Linux解决方案:(红帽子)。 以前的评论不适合我。 这对我在亚马逊网络服务 – 红帽7.我希望这适用于那里的人。

 A. Create the service file sudo vi /etc/systemd/system/myapp.service [Unit] Description=Your app After=network.target [Service] ExecStart=/home/ec2-user/meantodos/start.sh WorkingDirectory=/home/ec2-user/meantodos/ [Install] WantedBy=multi-user.target 

 B. Create a shell file /home/ec2-root/meantodos/start.sh #!/bin/sh - sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080 npm start then: chmod +rx /home/ec2-root/meantodos/start.sh (to make this file executable) 

 C. Execute the Following sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl status myapp (If there are no errors, execute below. Autorun after server restarted.) chkconfig myapp -add 

这个答案相当晚,但我发现最好的解决方案是编写一个使用screen -dmSnohup命令的shell脚本。

 screen -dmS newScreenName nohup node myserver.js >> logfile.log 

我还在末尾添加了>> logfile位,以便我可以轻松地保存节点console.log()语句。

为什么我使用shell脚本? 那么我也添加了一个if语句,检查是否node myserver.js进程已经在运行。

这样我就可以创建一个命令行选项,既可以让服务器继续运行,也可以在进行更改时重新启动服务器,这对开发很有帮助。

它非常简单。

  1. 在你的项目中添加package.json
  2. 在您的Package.JSON Start中添加脚本文件名或路径
  3. 然后,简单地转到您的控制台打开您的项目目录通过CD路径/到/目录/
  4. 写nohup npm开始

以下是任何人都可以使用的Package.JSON示例。 {“name”:“Project”,

  "version": "1.0.0", "main": "httpsserver.js", "scripts": { "start": "node httpsserver.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": {}, "devDependencies": {}, "description": "" } 

如果你只是想不间断地运行脚本,直到它完成,你可以使用nohop ,在这里的答案已经提到。 但是,没有一个答案提供了一个完整的命令,也记录了stdinstdout

 nohup node index.js >> app.log 2>&1 & 
  • >>表示附加到app.log
  • 2>&1确保错误也发送到stdout并添加到app.log
  • 结束并确保您的当前终端与命令断开连接,以便继续工作。

如果你想运行一个节点服务器(或者在服务器重新启动的时候应该开始备份),你应该使用systemd / systemctl 。