如何将node.js服务器作为守护进程启动?

99
在Python Twisted中,您可以使用twistd命令来帮助您处理与运行应用程序相关的多个问题(例如将其守护化)。
如何使node.js服务器守护运行,以便即使在当前会话关闭后也能继续运行?

2
请参见https://dev59.com/r2865IYBdhLWcg3wCqBA。 - Maxime Pacary
9个回答

99

Forever 是你问题的答案。

安装

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

用法

从命令行使用 Forever

$ forever start server.js

使用 Node.js 中 Forever 的实例

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', {
    max: 3,
    silent: true,
    args: []
  });

  child.on('exit', this.callback);
  child.start();

7
安装时应使用-g选项进行全局安装。可能需要权限才能这样做。 - refaelio
1
重启时会发生什么? - user471679
1
@AlexBrown - 如果你想让server.js在重启后继续运行,你需要将forever start server.js添加到启动脚本中(例如rc.local)。 - UpTheCreek
3
最终我决定使用monit来启动和停止forever进程。 - user471679
14
永远已经过时了,pm2是新的王者。请不要浪费时间在永远上。我刚刚转换过来,感到非常惊艳。pm2可以通过简单的命令将您的应用程序负载均衡在所有核心上,例如 pm2 start app.js -i 0 --name "myapp" 。尝试一下,您将不再回头。请查看 @Gary Bernitz 的答案。 - danday74

48
如果您需要将进程变成守护进程,而不是依赖于 forever,您可以使用 daemonize 模块。

翻译后:如果你需要让进程自我守护化,而不是依赖于 forever,你可以使用 daemonize 模块。

$ npm install daemonize2

那么就按照示例编写您的服务器文件:

var daemon = require("daemonize2").setup({
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
});

switch (process.argv[2]) {

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");
}

注意,这是一种相当低级的方法。


3
你需要在app.js文件中放置什么内容?因为我只是立刻退出了。 - chovy
2
重启时会发生什么? - mixdev
daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;``` - davidhq

41

要启动一个systemd服务管理器守护进程,需要编写一个服务文件。例如,创建一个名为/etc/systemd/system/myservice.service的文件。

如果你的server.js脚本在第一行使用了shebang(#!/usr/bin/env node),并且系统可以在路径中找到node,那么这样就可以工作:

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

或者,如果您没有在文件中添加shebang,请考虑将要使用的node可执行文件的绝对路径添加到服务文件的ExecStart=属性之前。

...
ExecStart=/root/.nvm/versions/node/v16.15.1/bin/node ...
...

每次更改myservice.service文件后,记得更新服务管理器守护进程。

$ systemctl daemon-reload

然后启动服务并启用服务在开机时自动启动。

$ systemctl start myservice
$ systemctl enable myservice

1
在这种情况下,您要将服务器.js的附加参数放在哪里? - Nikita Fuchs

24

更新:我更新了内容,包括最新的pm2信息:

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

https://github.com/unitech/pm2

http://pm2.io

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

4
永远已经死了,pm2 是新王!我一直使用forever,但刚刚转换到pm2。哇!哇!哇! forever 只能在一个核心上运行你的应用程序,而pm2可以在所有可用的核心上负载平衡你的应用程序。哇!不需要@reboot cron jobs,只需执行 pm2 startup (将 pm2 启动为 systemd 或操作系统等效服务),然后执行 pm2 save。现在重新启动,你的应用程序仍在运行。你可以使用 pm2 show 获取正在运行的应用程序的状态。watch 功能也是随时可用的。哇!难以置信的哇! - danday74
1
在 OpenShift 中为非 root 用户设置 pm2 太痛苦了。 - karthik101

18

最简单的方法就是将命令发送到后台。

$ node server.js &

然后你可以在以后的某个时间杀死该进程。我通常做以下操作:

$ killall node

注意:我正在运行OS X操作系统。


57
请注意,如果您退出终端/ssh会话,则此方法无效。针对此问题的完整解决方案是使用以下命令:nohup node server.js >/dev/null 2>&1 & (该命令将在后台运行服务器并防止其停止) - Michael Dillon
1
@MichaelDillon为什么你认为将输出重定向到/dev/null应该包含在完整解决方案中? - nurettin

11

你可以尝试:

$ nohup node server.js &

在我的 Mac 和 Linux 上可以工作。

输出将会在 ./nohup.out 文件中。

但我仍然建议您使用 pm2 或者 forever,因为它们可以轻松地用于重启、停止和记录日志。


3

还有一些更高级的通用运行程序,例如 monitrunit


1

2022 - PM2

有一个更好的、最受欢迎的解决方案,它被称为pm2npm包链接)。

要运行一个或多个Node.js服务器,您需要安装它:npm install pm2 -g

运行:pm2 start app.js

停止:pm2 stop nameOfAppFromList


您也可以列出正在运行的应用程序 pm2 list

要检查特定应用程序的日志,请运行pm2 logs nameOfAppFromList


0

如果想了解在 POSIX 系统上守护进程的正常方法,可以搜索 C 方法。

我还没有看到足够的 node.js API 方法可以手动完成 C 方法。但是,当使用 child_process 时,你可以让 node.js 为你完成:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

我认为这可能是浪费时间,因为你的系统很有可能提供相同的功能。

例如:

http://libslack.org/daemon/manpages/daemon.1.html

如果你想要一些可移植的东西(跨平台),其他帖子提供的解决方案可能已经足够了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接