如何使用pm2为Node.js应用提供服务

140 阅读5分钟

pm2是一个超级有用的Linux进程管理工具。

我已经在我的几个项目中使用了它,在这里我也想告诉你如何使用它

特别是,我将用它在DigitalOcean VPS上运行一个Node.js应用程序,我将对它进行设置,以便每当我们向该应用程序的GitHub仓库推送更新时,服务器上的pm2将被ping,该应用程序将从GitHub更新并重新启动。

听起来不错吧?让我们开始吧!

首先,注册到DigitalOcean,并按照我的教程在DigitalOcean上创建一个VPS

重要的是:使用DigitalOcean上的NodeJS 镜像,它已经设置了pm2node ,并且除了root ,还有一个nodejs 用户。

一旦你启动并运行,我们就可以开始了。

确保你以nodejs 用户的身份ssh。当你以root身份登录时,你可以直接运行su nodejs 来使用该用户。

你在VPS中运行的Node.js应用样本在/var/www/html/ ,它是由hello.js 文件组成。

应用程序的部署/运行已经通过pm2程序进行管理,这是一个守护进程管理器。

你可以使用pm2 list 来查看现在运行的所有应用程序。

如果你现在对应用程序做任何改变,这些改变将不会被应用,直到你重新启动正在运行的应用程序。

pm2 restart hello

你可以停止运行中的应用程序

pm2 stop hello

如果你试图重新加载页面,这将在浏览器中给你一个错误。

你可以运行。

pm2 start hello

来重新启动应用程序。

pm2的好处是,当系统被重新启动时,它将负责再次运行应用程序(s)。

现在你已经看到了内置的hello world是如何工作的,让我们来部署另一个应用程序。

让我们停止当前的示例应用程序。

pm2 stop hello

并在/var/www/html 中创建一个test 文件夹。

mkdir test

进入该文件夹

cd test

并运行

npm init -y

然后安装Express。

npm install express

现在运行nano app.js ,并添加这段代码。

const express = require("express")
const app = express()

app.get("/", (*req*, *res*) => res.send("Hello World!"))
app.listen(3000, () => console.log("Server ready"))

运行

pm2 start app.js --name app

你应该看到应用程序正在运行!

我们使用了3000端口,这也是hello 应用程序使用的端口,所以我们不需要配置其他东西。

否则,我们就需要修改/etc/nginx/sites-available/default ,并添加一个新的URL来映射到我们的应用程序。

现在我们部署了一个样本应用,让我们看看如何从GitHub部署一个应用。

首先,让我们停止我们在上一课中刚刚建立的应用程序。

pm2 stop app

并制作一个GitHub应用的样本。它不会很复杂,与我们在上一课中构建的应用非常相似,但它会说Hello World, deployed from GitHub! ,而不是只说Hello World!

在你的本地创建一个文件夹,并在其中运行

npm init -y

然后安装Express。

npm install express

现在运行nano app.js ,并添加这段代码。

const express = require("express")
const app = express()

app.get("/", (*req*, *res*) => res.send("Hello World, deployed from GitHub!"))
app.listen(3000, () => console.log("Server ready"))

现在是时候把应用推送到GitHub了。我使用GitHub Desktop,它是GitHub的官方应用程序,所以我把文件夹拖到应用程序中,它让我创建一个新的Git repo和一个GitHub仓库。

我用标准的 Node.js.gitignore 文件来初始化 repo,其中忽略了node_modules 这个文件夹。我们将看到如何在部署过程中初始化npm模块。

现在我们必须在DigitalOcean的机器上创建一个SSH密钥,并将其添加到GitHub。否则我们将无法访问我们刚刚创建的私有仓库。

仔细检查你用来连接GitHub的电子邮件地址,因为它很重要。你可以在 GitHub 的设置中,在电子邮件面板中找到它。然后运行。

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

现在打开 GitHub 上的 "SSH 和 GPG 密钥 "面板。

并点击 "New SSH key"。输入 "DigitalOcean "作为标题,这样你就知道这个密钥是用来做什么的。

现在输入

less /home/nodejs/.ssh/id_rsa.pub

在你的DigitalOcean液滴上,得到公钥

把它复制到你的设置中,然后保存。你应该在SSH密钥列表中看到它。

现在我们应该能够克隆服务器上的私有资源库了。

/var/www/html 文件夹中,运行

git clone git@github.com:<yourname>/<reponame>.git

在我的例子中,它是。

git clone git@github.com:flaviocopes/testdo.git

并成功下载了该应用程序。

现在输入cd testdo ,运行npm install

该应用程序现在可以运行了,所以输入

pm2 stop test

来停止前一个应用程序,并

pm2 start app.js --name testdo

来启动新的应用程序。

使用这个命令安装名为pm2-githook github.com/vmarchaud/p…的pm2模块。

pm2 install pm2-githook

为了配置应用程序,我们需要使用这个命令,它需要正确地转义双引号。

pm2 set pm2-githook:apps "{\"testdo\":{\"secret\":\"test123\",\"prehook\":\"npm install --production\",\"posthook\":\"echo done\"}}"

在这个例子中,我使用了secret 的值test123 ,但要改成不那么容易猜到的值。

默认情况下,该模块对来自GitHub的Webhooks进行监听,端口为8888。

这个端口现在是关闭的,用

sudo ufw allow 8888

现在打开 GitHub 的仓库设置,在 Webhooks 部分点击Add Webhook

粘贴你的域名的 URL,端口为 8888。

在这个例子中,我使用了secret 的值test123

现在,如果你尝试对你的代码做一个改动,它应该会自动被部署