pm2是一个超级有用的Linux进程管理工具。
我已经在我的几个项目中使用了它,在这里我也想告诉你如何使用它
特别是,我将用它在DigitalOcean VPS上运行一个Node.js应用程序,我将对它进行设置,以便每当我们向该应用程序的GitHub仓库推送更新时,服务器上的pm2将被ping,该应用程序将从GitHub更新并重新启动。
听起来不错吧?让我们开始吧!
首先,注册到DigitalOcean,并按照我的教程在DigitalOcean上创建一个VPS。
重要的是:使用DigitalOcean上的
NodeJS镜像,它已经设置了pm2和node,并且除了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 。

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