【问题标题】:How do I run a node.js app as a background service?如何将 node.js 应用程序作为后台服务运行?
【发布时间】:2011-04-30 09:49:53
【问题描述】:

由于这篇文章多年来受到了很多关注,我在这篇文章的底部列出了每个平台的最佳解决方案。


原帖

我希望我的 node.js 服务器在后台运行,即:当我关闭终端时,我希望我的服务器继续运行。我用谷歌搜索了这个并想出了这个tutorial,但是它没有按预期工作。因此,我没有使用该守护程序脚本,而是认为我只是使用了输出重定向(2>&1 >> file 部分),但这也不会退出 - 我的终端中出现一个空白行,就像它正在等待输出/错误一样。

我也尝试过将进程置于后台,但一旦我关闭终端,进程也会被终止。

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


最佳解决方案

【问题讨论】:

  • 我认为他的意思是关闭他的本地系统
  • 他的意思是关闭 ssh 会话会终止任务
  • github.com/Unitech/pm2 是一个高度维护和非常稳定的进程管理器,试试吧!
  • 你可以使用屏幕(aperiodic.net/screen/quick_reference
  • 可以用nohup,用google搜一下这个怎么用。

标签: node.js process background server daemon


【解决方案1】:

How do I run a Node.js application as its own process?复制我自己的答案

2015 年回答:几乎每个 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 start myapp 开头。

使用systemctl enable myapp 启用它以在启动时运行。

使用journalctl -u myapp查看日志

这取自 How we deploy node apps on Linux, 2018 edition,其中还包括生成 AWS/DigitalOcean/Azure CloudConfig 以构建 Linux/节点服务器的命令(包括 .service 文件)。

【讨论】:

  • Upstart ,如果可用也是一个很好的解决方案。无论哪种方式,您都不应该依赖 nodejs 进程来保持 nodejs 守护程序运行。这只是操作系统的一项任务。 killall nodejs 永远消失了....
  • 请注意,也可以以用户身份运行 systemd 服务。参见例如this tutorial。你可以把你的服务文件放在~/.config/systemd/user,用systemctl --user start myapp启动它,用systemctl --user enable myapp启用它。
  • 感谢您的回答。这就是我想要的纯净和清晰
  • 我接受了这个答案而不是“永远”的答案,因为我也认为这是最好的方法。 Mac 和 Windows 也有类似的答案,但我猜大多数人正在寻找 Linux 解决方案。
  • 在 EC2 AMI 路径 /etc/systemd/system 中不存在。您能否指出 AWS EC2 Linux AMI 中的正确路径是什么?
【解决方案2】:

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

【讨论】:

  • 对于最新的节点,我无法让它通过脚本名称(错误)停止应用程序 - 而且 - 通常行为不端(在 OS-X 上) - 奇怪的是,所有这些都是从源代码构建的。让事情处于糟糕的状态,并没有让我充满信心。
  • 虽然 nohup 可以解决问题,但 forever 是一个更好的解决方案,因为它会守护进程。很棒的工具!
  • 顺便说一下,这里有一个更简单的教程:Keep a node.js server up with Forever
  • 我确实使用了 Forever 一段时间,一开始一切似乎都很好,但后来灾难发生了。 Forever 无法再管理这些流程,任由它们乱跑。仍在努力寻找更好的解决方案。我会尝试使用 nohup
  • Geoffrey- 不,您需要在服务器启动脚本中执行 forever start /path/to/yourApp.js
【解决方案3】:

更新 - 正如以下答案之一所述,PM2 有一些非常好的功能永远丢失了。考虑使用它。

原答案

使用nohup:

nohup node server.js &

编辑我想补充一点,接受的答案确实是要走的路。我永远在需要熬夜的实例上使用。我喜欢做npm install -g forever,所以它在节点路径中,然后就做forever start server.js

【讨论】:

  • 很酷的部分要知道:nohup 代表 no hangup,它来自过去,您希望在“挂断”调制解调器时保持进程处于活动状态。
  • 现在它是进程收到的信号 1 的名称,用于警告用户关闭了 shell(或者丢失了调制解调器连接,当然:P)
  • 这不是最好的解决方案,因为如果应用程序遇到未捕获的错误,节点进程将退出并且不会重新启动。尽管如此,它仍然是一个合理的开发选择。
  • 如何添加环境变量?例如:PORT=80 节点 server.js
  • 查看来自 SO - stackoverflow.com/questions/8825460/…的答案
【解决方案4】:

这可能不是被接受的方式,但我用屏幕来做,特别是在开发过程中,因为我可以把它恢复过来并在必要时愚弄它。

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

屏幕将分离并在您注销后继续存在。然后您可以通过 screen -r 将其取回。点击屏幕手册了解更多详情。您可以根据需要命名屏幕等等。

【讨论】:

  • 另外,tmux 也不错。像屏幕一样工作(CTRL-B 是默认的,而不是 CTRL-A,但可配置)。 Tmux 有面板(分屏)。
  • 我在几周前就开始使用这个流星应用程序了。有时可能需要用于分离和重新连接的“$screen -dr”。
  • 对我来说是完成工作的最简单方法。但我同意,不是最好的解决方案
  • 此解决方案在系统重启后不存在
【解决方案5】:

2016 年更新: node-windows/mac/linux 系列使用跨所有操作系统的通用 API,因此绝对是一个相关的解决方案。然而; node-linux 生成 systemv 初始化文件。随着 systemd 继续流行,它实际上是 Linux 上的更好选择。如果有人想向 node-linux 添加 systemd 支持,欢迎 PR :-)

原帖:

现在这是一个相当古老的线程,但node-windows 提供了另一种在 Windows 上创建后台服务的方法。它松散地基于nssm 概念,即在您的节点脚本周围使用exe 包装器。然而;它使用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 或 node-gyp magic 来安装它。此外,它是 MIT 和 BSD 许可的。

完全公开,我是这个模块的作者。它旨在减轻 OP 所经历的确切痛苦,但更紧密地集成到操作系统已经提供的功能中。我希望未来有同样问题的观众会发现它很有用。

【讨论】:

  • 我现在把它移植到node-mac,在 OSX 上提供相同的功能。
  • 我已经开始计划几个 Node 程序,并在决定选择 Node-windows、Forever 或 Kue 之前做出决定。我倾向于使用 node-windows,但想了解为什么不使用 Forever 或 Kue 来调度和监控十几个 node 程序。有的永远奔跑。也需要监控。
  • Node-windows 使用本机操作系统来管理后台服务,并使用本机事件日志进行日志记录。 Forever 拥有自己的自定义监控和日志记录。我在medium.com/p/2a602ea657a2 写了一篇关于此的文章,听起来您需要安排脚本,而不是一直将它们作为后台服务运行。 Kue 和 Agenda 等项目就是为此而设计的。 Node-windows 和 Forever 有不同的用途。
  • @Corey,我如何运行 node-mac 中包含的示例?,从终端,我尝试了 node install.js,但它似乎没有拾取 helloworld.js
  • @Edwin - 最好打开一个新问题,提供有关问题的更多详细信息,包括您正在使用的代码。
【解决方案6】:

如果您只是想不间断地运行脚本直到它完成,您可以使用nohup,正如此处的答案中已经提到的那样。但是,没有一个答案提供一个完整的命令,该命令还记录 stdinstdout

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

如果你想运行一个节点服务器(或者当服务器重启时应该启动的东西)你应该使用systemd / systemctl

【讨论】:

  • 最佳答案 m8.
  • 解释得很好
【解决方案7】:

更新:我已更新以包含来自 pm2 的最新内容:

对于许多用例,使用 systemd 服务是管理节点进程的最简单和最合适的方式。对于那些在单一环境中运行大量节点进程或独立运行节点微服务的人来说,pm2 是一个功能更全的工具。

https://github.com/unitech/pm2

http://pm2.io

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

【讨论】:

    【解决方案8】:

    如果您正在使用 nohup,请尝试运行此命令 -

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

    你也可以用forever来启动服务器

    forever start -c "npm start" ./ 
    

    PM2 也支持npm start

    pm2 start npm -- start
    

    【讨论】:

    • thnx,这非常有效。 pm2 start npm -- start
    • 谢谢,我正在使用 NestJS,所以我尝试运行:[forever start -c "npm run start" ./] 效果非常好!
    【解决方案9】:

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

    像这样构建一个plist,并将其放入名称为top-level-domain.your-domain.application.plist的/Library/LaunchDaemons(放置时需要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>
    

    完成后,发出这个(以 root 身份):

    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

    【讨论】:

    • 这将以什么用户身份运行服务?有没有办法设置用户?
    【解决方案10】:

    我只是在使用 daemon 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) 来启动和管理简单的节点应用程序。

    【讨论】:

      【解决方案11】:

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

      Here's a link to its Github page

      安装:

      sudo npm install supervisor -g

      您可以使用 -e 轻松让它监视其他扩展。我经常使用的另一个命令是 -i 来忽略某些文件夹。

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

      sudo nohup 主管 myapp.js &

      【讨论】:

      • 我认为在实践中,supervisor 是比大多数守护程序模块更好的选择,特别是与 webhook 结合使用以检查更新。
      • 我支持这个。如果您更改 PHP 文件,您会重新启动 Apache 或 Nginx 服务器吗?当然不。那为什么还要费心重新启动整个 Node.js 服务器,甚至只是更改一行代码呢?虽然这可能不是最好的解决方案,但至少在使用 Supervisor 时,您无需担心重启过程(实际上重启仍然会发生)。
      【解决方案12】:

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

      安装:

      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
        

      服务管理:

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

      【讨论】:

        【解决方案13】:

        接受的答案可能是最好的生产答案,但是为了快速进行开发工作,我发现了这个:

        nodejs scriptname.js &amp; 不起作用,因为 nodejs 似乎吞噬了 &,所以这件事并没有让我在没有 scriptname.js 死亡的情况下继续使用终端。

        但我将nodejs scriptname.js 放在一个 .sh 文件中,然后 nohup sh startscriptname.sh &amp; 工作。

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

        【讨论】:

          【解决方案14】:

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

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

          启动服务:sudo service nodejs start

          停止服务:sudo service nodejs stop

          服务脚本

          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
          

          【讨论】:

            【解决方案15】:

            2017 年 6 月更新:
            Linux 解决方案:(红帽)。以前的 cmets 对我不起作用。 这适用于我在 Amazon Web Service - Red Hat 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
            

            【讨论】:

            • 非常有趣,我只是好奇 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080 它的作用。你能给我更多的细节吗?我不确定,但我认为它将流量从 80 重定向到 8080 哪个节点服务器监听,对吧?
            【解决方案16】:

            使用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 中,您可以从那里启动或停止该服务,该服务将自动启动,您可以配置在失败时重新启动。

            【讨论】:

              【解决方案17】:

              为了完善建议的各种选项,这里还有一个:GNU/Linux 中的daemon 命令,您可以在此处阅读:http://libslack.org/daemon/manpages/daemon.1.html。 (如果上述 cmets 之一已经提到这一点,我们深表歉意)。

              【讨论】:

                【解决方案18】:

                看看赋格!除了启动许多worker之外,你还可以妖魔化你的节点进程!

                http://github.com/pgte/fugue

                【讨论】:

                  【解决方案19】:

                  PM2 是用于 Node.js 应用程序的生产流程管理器,具有内置负载平衡器。它允许您使应用程序永远保持活动状态,在不停机的情况下重新加载它们,并促进常见的系统管理任务。 https://github.com/Unitech/pm2

                  【讨论】:

                  • 严重的内存消耗问题!去 phusion+ nginx
                  【解决方案20】:

                  我很惊讶没有人提到Guvnor

                  我一直在尝试,pm2 等。但是,当谈到可靠的控制和基于 Web 的性能指标时,我发现 Guvnor 是迄今为止最好的。另外,它也是完全开源的。

                  编辑:但是,我不确定它是否适用于 Windows。我只在linux上用过。

                  【讨论】:

                  • 截至 2017 年似乎已经过时。构建失败。去年没有代码推送。有问题。
                  【解决方案21】:

                  有没有人注意到“2>&1”位置的一个小错误?

                  2>&1 >> file
                  

                  应该是

                  >> file 2>&1
                  

                  【讨论】:

                    【解决方案22】:

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

                    【讨论】:

                      【解决方案23】:

                      对于使用较新版本的 daemon npm 模块的人 - 您需要传递文件描述符而不是字符串:

                      var fs = require('fs');
                      var stdoutFd = fs.openSync('output.log', 'a');
                      var stderrFd = fs.openSync('errors.log', 'a');
                      require('daemon')({
                          stdout: stdoutFd, 
                          stderr: stderrFd
                      });
                      

                      【讨论】:

                        【解决方案24】:

                        如果您使用的是 pm2,则可以将autorestart 设置为false

                        $ pm2 生态系统

                        这将生成一个样本ecosystem.config.js

                        module.exports = {
                          apps: [
                            {
                              script: './scripts/companies.js',
                              autorestart: false,
                            },
                            {
                              script: './scripts/domains.js',
                              autorestart: false,
                            },
                            {
                              script: './scripts/technologies.js',
                              autorestart: false,
                            },
                          ],
                        }
                        

                        $ pm2 启动生态系统.config.js

                        【讨论】:

                          【解决方案25】:

                          在 RHEL 8 AWS EC2 实例上使用 @mikemaccana 接受的答案时收到以下错误:(code=exited, status=216/GROUP)

                          这是由于将用户/组设置为:'nobody'。

                          在谷歌上搜索时,似乎使用用户/组作为 'nobody'/'nogroup' 对于守护进程来说是不好的做法,正如在 unix 堆栈交换中回答 here 一样。

                          在我将用户/组设置为我的实际用户和组后效果很好。

                          您可以输入 whomaigroups 来查看您可以解决此问题的选项。

                          我的 mongodb 全栈节点应用服务文件:

                          [Unit]
                          Description=myapp
                          After=mongod.service
                          
                          [Service]
                          ExecStart=/home/myusername/apps/myapp/root/build/server/index.js
                          Restart=always
                          RestartSec=30
                          User=myusername
                          Group=myusername
                          Environment=PATH=/usr/bin:/usr/local/bin
                          Environment=NODE_ENV=production
                          WorkingDirectory=/home/myusername/apps/myapp
                          
                          [Install]
                          WantedBy=multi-user.target
                          

                          【讨论】:

                            【解决方案26】:

                            使用 pm2 模块。 pm2 nodejs module

                            【讨论】:

                              【解决方案27】:

                              由于我在提供的答案列表中缺少此选项,因此我想在 2020 年添加一个符合条件的选项:docker 或任何 equivalent container 平台。除了确保您的应用程序在稳定的环境中运行之外,还有其他安全优势以及改进的可移植性。

                              Docker 支持 Windows、macOS 和大多数/主要 Linux 发行版。 Installing docker on a supported platform 相当直接且有据可查。设置 Node.js 应用程序就像将其放入容器中并运行该容器一样简单,同时确保它在关闭后重新启动。

                              创建容器镜像

                              假设您的应用程序在该服务器上的 /home/me/my-app 中可用,请在文件夹 /home/me 中创建一个包含内容的文本文件 Dockerfile类似于这个:

                              FROM node:lts-alpine
                              COPY /my-app/ /app/
                              RUN cd /app && npm ci
                              CMD ["/app/server.js"]
                              

                              它正在为在 Alpine Linux 下运行 LTS 版本的 Node.js 创建一个映像,将应用程序的文件复制到该映像中并运行 npm ci 以确保依赖项与该运行时上下文匹配。

                              在同一个文件夹中创建另一个文件 .dockerignore 与内容

                              **/node_modules
                              

                              这将防止您的主机系统的现有依赖项被注入到容器中,因为它们可能无法在那里工作。 Dockerfile 中提供的RUN 命令将解决这个问题。

                              使用如下命令创建图像:

                              docker build -t myapp-as-a-service /home/me
                              

                              -t 选项用于选择已构建容器映像的“名称”。这用于下面运行的容器。

                              注意: 最后一个参数是选择包含该 Dockerfile 的文件夹,而不是 Dockerfile 本身。您可以使用选项-f 选择不同的。

                              启动容器

                              使用此命令启动容器:

                              docker run -d --restart always -p 80:3000 myapp-as-a-service
                              

                              此命令假设您的应用正在侦听端口 3000,并且您希望它在主机的端口 80 上公开。

                              这当然是一个非常有限的例子,但它是一个很好的起点。

                              【讨论】:

                                【解决方案28】:

                                这个答案对聚会来说已经很晚了,但我发现最好的解决方案是编写一个同时使用 screen -dmSnohup 命令的 shell 脚本。

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

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

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

                                这样我就能够创建一个命令行选项,既可以让我保持服务器运行,也可以在我进行更改时重新启动它,这对开发非常有帮助。

                                【讨论】:

                                • 我遇到了这个问题,对 Linux 还是很陌生。如果没有 screen 或 nohup,你会怎么做?
                                猜你喜欢
                                • 2019-01-03
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多