如何使用PM2在生产中运行NodeJS应用程序

时间:2020-01-09 10:39:39  来源:igfitidea点击:

在本教程中,将学习如何使用名为PM2的流程管理器运行Node应用程序。

Node有一个内置服务器,用于托管基于它的JavaScript应用程序,例如Angular,React和Vue。但是,它不是流程管理器。这意味着当我们直接使用NPM或者Node运行应用程序时,遇到问题时该应用程序将不会重新启动。

而是,该过程将终止,直到手动重新启动为止。显然,这种行为在任何生产环境中都是不希望的。
如何在生产服务器上有效且安全地运行Node应用程序?

要在生产中成功运行基于节点的应用程序(例如Express RESTful API),我们将需要使用所谓的流程管理器。最受欢迎的Node应用程序管理器是PM2,它也是负载平衡器的两倍。

开始

PM2是为NodeJS编写的公开可用服务。与大多数JavaScript应用程序一样,可以通过NPM安装它。为此,我们必须在安装PM2之前安装NodeJS和NPM。

安装NodeJS

安装PM2

如上所述,PM2作为NPM模块安装。安装需要全局完成,以允许任何Node应用程序管理。确保对npm使用-g标志来指示它执行PM2的全局安装。

sudo npm install -g pm2

为PM2创建系统帐户

像在生产服务器上运行的任何服务一样,PM2应该在其自己的用户上下文中运行。通过这样做,我们消除了一个较大的安全漏洞,并最大程度地减少了黑客通过PM2中的漏洞可能造成的损害。

当以root用户身份运行的服务受到威胁时,黑客将拥有对该服务器的完全访问权限。他们获得了允许执行任何操作的根级特权。

另一方面,通过使用没有特权的用户帐户运行服务,我们可以大大减少我们的安全足迹和可造成的损害。

以下命令创建一个名为pm2的服务帐户。 -r标志用于将帐户设置为系统帐户,从而提供了额外的安全性,例如不允许登录。

useradd -r -c "pm2 service account" pm2

服务帐户不得用于创建服务的帐户以外的任何用途。它仅存在于运行过程中,仅此而已。通过使用-f标志,我们删除了以服务帐户远程登录的功能,从而删除了可能的攻击媒介。

在启动时自动启动PM2

在系统启动后,运行以下命令以自动启动PM2. 该命令不仅会指示systemd在启动时运行PM2,还将在pm2帐户的主目录中我们先前生成的pm2系统帐户的上下文中运行它。

sudo env PATH=%PATH/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u pm2 -hp /home/pm2

从PM2运行应用

安装了PM2之后,我们现在可以运行我们的应用了。为此,针对javascript文件使用了start命令,该文件应该是应用程序的输入脚本。

pm2 start server.js

要查看与PM2一起运行的应用程序的状态,请使用l命令。输出的表将为我们提供在后台运行的NodeJS应用程序及其运行状况的快照。

pm2 l
┌──────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬──────┬───────────┬─────────┬──────────┐
 │ App name │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu  │ mem       │ user    │ watching │
 ├──────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼──────┼───────────┼─────────┼──────────┤
 │ index    │ 1  │ 1.0.0   │ fork │ 23010 │ online │ 17      │ 4D     │ 0.2% │ 48.5 MB   │ vagrant │ disabled │
 │ server   │ 0  │ 1.0.0   │ fork │ 27127 │ online │ 16      │ 2D     │ 0.2% │ 61.0 MB   │ vagrant │ disabled │
 └──────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴──────┴───────────┴─────────┴──────────┘

应用程序名称源自与pm2 start命令一起使用的nodejs应用程序的文件。如果我们所有的应用程序都以index.js或者server.js开头,这不是很有用。

要在启动时设置应用程序名称,请在pm2中使用名称标志。例如,以下将以名称auth-api启动index.js。

pm2 start index.js --name=auth-api

现在列出正在运行的应用程序时,输出中将显示一个更具描述性的名称。

┌──────────┬────┬─────────┬──────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬─────────┬──────────┐
 │ App name │ id │ version │ mode │ pid   │ status  │ restart │ uptime │ cpu │ mem       │ user    │ watching │
 ├──────────┼────┼─────────┼──────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼─────────┼──────────┤
 │ auth-api │ 2  │ 1.0.0   │ fork │ 28998 │ online  │ 0       │ 0s     │ 0%  │ 20.9 MB   │ vagrant │ disabled │
 └──────────┴────┴─────────┴──────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴─────────┴──────────┘

停止应用

当需要停止应用程序时(可能出于维护目的),stop命令与PM2一起使用。这样做时必须引用应用程序名称。

pm2 stop auth-api

完成后,我们可以通过运行pm2 list命令来验证应用程序状态。

┌──────────┬────┬─────────┬──────┬───────┬─────────┬─────────┬────────┬─────┬───────────┬─────────┬──────────┐
 │ App name │ id │ version │ mode │ pid   │ status  │ restart │ uptime │ cpu │ mem       │ user    │ watching │
 ├──────────┼────┼─────────┼──────┼───────┼─────────┼─────────┼────────┼─────┼───────────┼─────────┼──────────┤
 │ auth-api   │ 0  │ 1.0.0   │ fork │ 0     │ stopped │ 16      │ 0      │ 0%  │ 0 B       │ vagrant │ disabled │
 └──────────┴────┴─────────┴──────┴───────┴─────────┴─────────┴────────┴─────┴───────────┴─────────┴──────────┘

显示有关运行应用程序的信息

pm2 list命令仅显示了解应用程序状态所需的最基本信息。该信息在大多数情况下是有用的,但是,我们可能需要更详细的数据才能了解正在运行的应用程序的运行状况。

要输出详细信息,请使用" pm2 show"命令。

pm2 show auth-api

输出将查看以下屏幕快照中显示的内容。如我们所见,它提供了有关项目的信息,以及一些有助于故障排除的基本指标。

pm2的输出show auth-api

主动监视正在运行的应用程序

尽管pm2 show命令很有用,但有时我们需要更深入地了解应用程序的行为。 pm2 monit命令允许我们实时监视NodeJS应用程序。

pm2 monit