如何使用 PM2 在 Ubuntu VPS 上设置 Node.js 生产环境如何使用 PM2 在 Ubuntu VPS 上设置 Node.js 生产环境如何使用 PM2 在 Ubuntu VPS 上设置 Node.js 生产环境如何使用 PM2 在 Ubuntu VPS 上设置 Node.js 生产环境
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

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

介绍

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

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

这些说明假定读者仅具有 Linux 的基本知识。您可以跳过不需要的信息,但严格按照这些步骤操作可能会带来一些好处。

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

当您第一次设置 DigitalOcean Droplet 时,您会收到使用根帐户登录的说明。说明看起来像这样:

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

ssh root@192.241.xxx.xxx

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

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

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

  • 使用 /home/safeuser/ 中的文件夹创建用户:

useradd -s /bin/bash -m -d /home/safeuser -c "safe user" safeuser

  • 为 safeuser 创建密码 - 输入以下命令后,系统会要求您输入密码两次:

passwd safeuser

  • 授予安全用户使用根级别命令的权限:

usermod -aG sudo username

以安全用户身份登录

按 ctrl-D 注销您的 DigitalOcean root 会话。

请注意,以安全用户身份登录的命令与您之前使用的命令相同,但用户名已更改。一旦您以安全用户身份登录,每次您想要运行具有 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 地址,但您的目标应该是使用域名。稍后查看这些说明:How To Set Up a Host Name with 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 崩溃了,它会自动重启你的应用程序。 <李> 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

关于节点还有很多东西需要学习,但本教程将使您走上正确的道路。要了解有关 pm2 的更多信息,请访问 pm2 存储库

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

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

吉姆·卡西迪

©2015-2025 艾丽卡 support@alaica.com