如何使用PM2在UbuntuVPS上设置Node.js生产环境

来自菜鸟教程
跳转至:导航、​搜索

介绍


本教程旨在帮助您设置 Ubuntu 服务器以运行 Node.js 应用程序,包括基于 Express、Geddy 或 Sails 的应用程序。 这些说明将帮助您避免一些安全错误,并提供一些令人惊讶的好处,例如:

  • 您不会以 root 身份运行您的应用程序; 因此,您的应用程序将更加安全。
  • 您将使用端口 80 来运行您的应用程序,通常只能由 root 用户访问。 (您将能够使用自定义 URL 运行您的应用程序,例如 http://mysite.com - 但您不必指定端口。)
  • 如果您的应用程序崩溃,它将重新启动,并且它将保留未处理异常的日志。
  • 当服务器启动时,您的应用程序将重新启动 - 即 它将作为服务运行。

这些说明假定读者只有 Linux 的基本知识。 您可以跳过不需要的信息,但密切遵循这些步骤可能会带来一些好处。

创建一个安全帐户来运行您的代码


首次设置 DigitalOcean droplet 时,您会收到使用 root 帐户登录的说明。 说明看起来像这样:

要登录到您的 Droplet,您需要打开一个终端窗口并复制并粘贴以下字符串:

ssh root@192.241.xxx.xxx

请注意,“192.241.xxx.xxx”对您来说会有所不同。 只需按照您在设置虚拟服务器时从 DigitalOcean 收到的说明进行操作,然后使用 ssh 登录。

正如我们大多数人所理解的那样,如果您使用 root 帐户运行您的代码,并且如果敌对方破坏了代码,则该方可以完全控制您的 VPS。

为了避免这种情况,让我们设置一个安全帐户,如果我们提供适当的密码,它仍然可以执行 root 操作。 出于本教程的目的,我们称我们的安全用户为“safeuser”——您可以随意命名。 现在,以 root 用户身份登录并按照以下步骤操作:

  • 使用 /home/safeuser/ 中的文件夹创建用户:
useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser
  • safeuser 创建一个密码 - 输入以下命令后,系统会要求您输入两次:
passwd safeuser
  • 授予安全用户使用 root 级别命令的权限:
usermod -aG sudo username

以安全用户身份登录


按 ctrl-D 退出 DigitalOcean 根会话。

请注意,以安全用户身份登录的命令与您之前使用的命令相同,但用户名已更改。 以安全用户身份登录后,每次要运行具有 root 权限的命令时,都必须使用单词 sudo 继续执行该命令。 从您自己机器上的命令行,使用下面显示的命令登录。

ssh safeuser@192.241.xxx.xxx

安装 GIT


您已经登录,安装 GIT(我们将使用 GIT 来安装 Node.js。)。 如果出于任何原因,您对 GIT 不熟悉,那么它是一个美丽的工具,将成为您生活的重要组成部分。 如果您想了解更多信息,请阅读 GIT 书籍。 在 Ubuntu 上安装它很容易:

sudo apt-get install git

单词 sudo 表示您想以 root 身份运行此命令。 系统将提示您输入密码 - 即 安全的用户密码。 当您提供密码时,该命令将运行。

安装最新的 Node.JS


请注意,在撰写本文时,v0.10.24 是 Node 的最新版本。 如果有更新的版本,请改用该版本号。

键入以下命令,一次一行,并在您的 droplet 下载、编译和安装 Node.js 时观察魔术:

sudo apt-get install build-essential
sudo apt-get install curl openssl libssl-dev
git clone https://github.com/joyent/node.git
cd node
git checkout v0.10.24
./configure
make
sudo make install

当您键入 sudo make 时,会发生很多事情。 耐心点。

当 make install 过程结束时,输入以下命令确保一切顺利:

node -v

如果一切顺利,您应该会看到:v0.10.24.

授予安全用户使用端口 80 的权限


请记住,我们不想以 root 用户身份运行您的应用程序,但有一个问题:您的安全用户没有使用默认 HTTP 端口 (80) 的权限。 您的目标是能够通过导航到易于使用的 URL(如 http://mysite.com)来发布访问者可以使用的网站。

不幸的是,除非您以 root 身份登录,否则您通常必须使用 http://mysite.com:3000 之类的 URL - 注意端口号。

很多人被困在这里,但解决方案很简单。 有几个选择,但这是我喜欢的一个。 键入以下命令:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

现在,当您告诉 Node 应用程序您希望它在端口 80 上运行时,它不会抱怨。

使用 NPM 安装一个名为 PM2 的包。


NPM 是一个包管理器,您将使用它来安装框架和库以与您的 Node.js 应用程序一起使用。 NPM 与 Node.js 一起安装。 PM2 是一个可爱的小工具,它将为您解决两个问题:

  1. 如果应用程序崩溃,它将通过重新启动应用程序来保持您的站点正常运行。 这些崩溃不应该发生,但很高兴知道 PM2 支持您。 (有些人可能知道 Forever.js,另一个用于保持基于节点的站点运行的工具——我想你会发现 PM2 有很多东西可以提供。)
  2. 每次重新启动服务器时,它都会通过将节点应用程序作为服务重新启动来帮助您。 一些用户知道其他方法可以做到这一点,但是 pm2 使它更容易,并且它具有一些额外的灵活性.

通过在命令行输入以下命令来安装 PM2:

sudo npm install pm2 -g

创建一个简单的节点应用程序


在这里您可以测试您的环境,以确保一切正常。 在本例中,我将使用 IP 地址,但您的目标应该是使用域名。 稍后查看这些说明:如何使用 DigitalOcean 设置主机名

首先,创建一个仅用于测试的简单节点应用程序。 在命令行类型:

nano app.js

然后在 nano 编辑器中输入以下代码行:

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(80);
console.log("Server running at http://127.0.0.1:80/");

ctrl-X 退出 - 当 nano 询问您是否要保存时,回答是。

现在您有一个名为 app.js 的基于节点的应用程序,您可以使用它来测试您的环境。

您可以通过键入以下命令在命令行运行 app.js:node app.js

这样做,您应该能够通过使用浏览器并输入您的 IP 地址作为 URL 来查看您的 hello world 文本。 您可以通过按 crtl-C 来中断执行。 这不是我们想要运行我们的应用程序的方式。 有一个更好的方法。 我们将使用 PM2 来运行它,而不是直接使用 Node。

使用 PM2 运行您的应用程序,并确保您的 node.js 应用程序在您的服务器重新启动时自动启动


如果您使用 pm2 运行您的应用程序,您将获得一些巨大的好处。 不要像上面那样运行您的应用程序,而是使用以下命令运行它:pm2 start app.js

你应该看到这个报告:

以这种方式运行您的应用程序有什么好处?

  • 如果 PM2 崩溃,它将自动重新启动您的应用程序。
  • PM2 将记录您未处理的异常 - 在这种情况下,在 /home/safeuser/.pm2/logs/app-err.log 的文件中。
  • 通过一个命令,PM2 可以确保它管理的任何应用程序在服务器重新启动时重新启动。 基本上,您的节点应用程序将作为服务启动。

通过键入以下命令运行此命令以将您的应用程序作为服务运行:

sudo env PATH=$PATH:/usr/local/bin pm2 startup -u safeuser

请注意,您可能没有使用 safeuser 作为用户名 - 请使用与您的设置相对应的名称。 您应该看到以下报告:

Adding system startup for /etc/init.d/pm2-init.sh ...
   /etc/rc0.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc1.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc6.d/K20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc2.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc3.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc4.d/S20pm2-init.sh -> ../init.d/pm2-init.sh
   /etc/rc5.d/S20pm2-init.sh -> ../init.d/pm2-init.sh

现在我们的既定目标已经实现!

  • 您没有以 root 身份运行; 因此,您的应用程序更安全。
  • 您正在使用端口 80,通常只能由 root 用户使用。
  • 如果您的应用程序崩溃,它将重新启动,并且它将记录未处理的异常。
  • 当服务器启动时,您的应用程序将重新启动。

玩得开心! 这是一个相当强大的设置。

    • 经过深思熟虑:** 您可能会注意到 safeuser 目录中有一个名为 node 的文件夹。 它在安装过程中使用过,但您不再需要它。 您可以通过键入以下内容将其删除:
rm -rf /home/safuser/node

关于 node 的知识还有很多,但是本教程会让你走上正确的道路。 要了解有关 pm2 的更多信息,请访问 pm2 存储库

重要说明:有一个启动脚本可以启动您的 Node 应用程序,但是如果您了解它的工作原理,您将避免很多混乱。 该脚本称为“pm2-init.sh”。 它位于“etc/init.d/”目录中,但不会启动 app.js。 相反,它会启动上次服务器关闭时在 PM2 下运行的程序。

这个很重要。 如果当您键入 pm2 list, 时您的节点应用程序未显示在列表中,那么当服务器重新启动时您的应用程序将不会重新启动。 按照正确的说明使用 pm2 启动您的应用程序,以确保它们将重新启动:pm2 start app.js

吉姆·卡西迪