使用自己的服务器将Node.js应用程序作为服务化

这篇文章的内容

    • Nodejsアプリをどうデプロイしようか

 

    • pm2というマネージャ

 

    サービス化

如何将服务带入呢?

基于Node.js的Web应用程序由于其广泛的覆盖范围,可以直接接收应用程序的请求。而Java和.NET需要应用服务器(如Glassfish和IIS)来接收来自客户端的响应,然后将该响应传递给应用程序。而Node.js Web应用程序则可以直接接收来自客户端的请求并进行处理。

在Java和.NET中,存在应用服务器层次结构,它会为我们处理启动等服务方面的事情。
然而,在Node.js中呢?
是因为我们在Heroku或OpenShift等云平台上部署所以不用考虑吗?
通过shell脚本执行cd ${applicationRoot}; node ./bin/app.js吗?这样不够高效。

为实现服务化的选择

试图将Nodejs应用程序在自己的服务器上进行服务化有几种方法。

    • winser

windows上でサービス化するためのライブラリ

forever

linux/macOS上でのサービス化するためのデーモンマネージャ

pm2

Advanced, production process manager for Node.js

一说出口就能马上找得到的地方。

如果使用Linux的话,可以考虑使用PM2。

在Windows操作系统上,如果要进行服务化,winser是唯一的选择。但是在Linux/UNIX系统中,有forever和pm2两个选项。
forever是最早的产品,而pm2是后来推出的。
由于后来的产品,pm2的功能相当丰富。

    1. 通过自带负载均衡器,可以实现集群化。

 

    1. 因为pm2本身可以作为负载均衡器运行,所以可以轻松实现应用程序的集群化。

 

    1. 也就是说,不需要在应用程序中实现集群化!

分布式日志的聚合查看。
当应用程序进行集群化时,日志会按节点输出,追踪并观察时间序列变得困难。
但是pm2可以将这些日志整合在一起,以便一次性查看。

通过配置文件轻松启动。
将要部署的服务配置在配置文件(js/json/yml)中,并在启动时加载,就可以带着各种设置启动。

带有环境切换功能。
通过在服务配置文件中设置不同环境的环境变量,可以在启动时切换使用哪个环境。

带有部署功能。
具有利用Git仓库进行远程服务器部署的功能。

虽然功能多样且涵盖所有可能会很困难,但我想使用pm2来将Nodejs应用程序进行服务化处理。

将pm2服务化

在这里,我将解释使用转译文件并在我们自己的服务器上而不是Heroku等服务上运行服务的步骤。
这一部分的目标是在以下的服务器和所有者上执行。

假定

    バージョン
mw / libversionnodev9.0.0pm22.7.2
    サービス化環境
keyvalueサーバsampleServデプロイ先/opt/NodeApps/sample実行ユーザsample:sample。 sudoコマンド実行可能

在 /opt/NodeApps/sample 目录下已经发布了应用程序,并且已经完成了 npm install 的操作。本来想使用 pm2 的部署功能,但因为服务化的工作已经忙碌不堪了。

服务化流程

首先,如果没有安装pm2就毫无意义,因此我们要安装它。

# npm install -g pm2

这次切换到执行用户,然后移动到Nodejs应用程序的根目录。由于执行pm2命令的用户将成为应用程序的执行用户,因此应用程序及其以下所有文件都必须属于执行用户。

让我们使用pm2启动吧!但请稍等一下。
让我们创建一个配置文件。

{
    "apps": [
        {
            "name"        : "sample",
            "script"      : "./bin/application.js",
            "instances"  : 0,
            "watch"     : true,
            "exec_mode"  : "cluster",
            "source_map_support": true,
            "env": {
                "PORT": 8000,
                "NODE_ENV": "development"
            },
            "env_production" : {
                "NODE_ENV": "production"
            }
        }
    ]
}

pm2的设置文件以apps属性的数组形式定义。这表明可以使用相同的配置调用多个Node.js应用程序。

每个参数都应该参考pm2的参考文档,并且需要特别注意的是exec_mode和instances。
如果设置exec_mode为”cluster”,那么就会使用集群模式设置,如果设置instances为0,则会展开与服务器的CPU核心数相同数量的节点(可以设置大于1的值来设置使用的核心数=节点数)。

只有在设置文件编写完毕后才能启动。

# cd /opt/NodeApps/sample
# pm2 start ./pm2-service.json --env production

如果使用sudo以root权限执行pm2命令,则执行用户将变为root;如果不使用sudo执行,则执行用户将为当前用户。另外,–env选项是用于切换环境的。在pm2-service.json文件中,env.env_production被设置为环境变量并进行执行。env.env是默认设置,而带有env_*的设置将在–env选项中指定*的值。

如果使用 –env staging,将会加载 env.env_staging 的配置。

启动并认为一切正常是不可行的。要在pm2中实现服务的持久化启动,需要让其“记住当前状态”。

下午2点

    构建最终应该存在的服务状态,并记录并持久化这个状态。

按这个方向进行服务化。

# sudo pm2 startup [platform] -u sample
# pm2 save

[平台]的变化取决于执行服务器上的init系统。

    • systemd

 

    • upstart

 

    • launchd

 

    rcd

如果将执行用户设置为root以外的情况,不要忘记使用”-u”选项。如果忘记了这一点,即使在预期的执行用户下进行操作,当重新启动服务器时,应用程序将以root身份运行。

文献资料

PM2是一款高级的Node.js进程管理器。
foerver
winser