使用 PM2 管理和部署 Node.js 应用程序

使用 PM2 管理和部署 Node.js 应用程序

引言

大家好,欢迎来到今天的讲座!今天我们要聊的是如何使用 PM2 来管理和部署 Node.js 应用程序。如果你是 Node.js 的开发者,或者正在考虑将你的应用程序部署到生产环境中,那么 PM2 绝对是你不能错过的一个工具。它不仅能够帮助你轻松管理多个 Node.js 进程,还能让你的应用程序在服务器上稳定运行,即使遇到意外情况也能自动重启。

在接下来的时间里,我会带你一步步了解 PM2 的强大功能,并通过实际的代码示例来展示它是如何工作的。我们还会探讨一些常见的问题和解决方案,帮助你在生产环境中更好地使用 PM2。准备好了吗?让我们开始吧!

什么是 PM2?

首先,我们来了解一下 PM2 到底是什么。PM2 是一个进程管理工具,专门用于 Node.js 应用程序的管理和部署。它可以帮助你:

  • 启动和停止应用程序:你可以使用 PM2 轻松启动、停止和重启你的 Node.js 应用程序。
  • 进程守护:PM2 会自动监控你的应用程序,并在它崩溃时自动重启,确保你的应用始终在线。
  • 负载均衡:PM2 可以自动为你的应用程序创建多个实例,并通过内置的负载均衡机制分发请求,提高性能。
  • 日志管理:PM2 会自动记录应用程序的日志,方便你查看和调试。
  • 集群模式:PM2 支持多核 CPU 的利用,可以在不同的核心上运行多个应用程序实例,最大化服务器的性能。
  • 监控和报警:PM2 提供了实时的监控功能,可以查看应用程序的内存使用、CPU 占用等信息,并且可以通过邮件或短信发送报警通知。

简单来说,PM2 就像是一个“保姆”,它会帮你照顾好你的 Node.js 应用程序,确保它在任何情况下都能正常运行。是不是听起来很厉害?别急,接下来我们会详细讲解如何使用 PM2。

安装 PM2

全局安装 PM2

要开始使用 PM2,首先需要安装它。PM2 是通过 npm(Node.js 的包管理工具)进行安装的,所以请确保你已经安装了 Node.js 和 npm。如果你还没有安装它们,建议先去安装一下。

安装 PM2 非常简单,只需要在终端中运行以下命令即可:

npm install -g pm2

这个命令会将 PM2 安装到全局环境中,这样你就可以在任何地方使用 pm2 命令了。安装完成后,你可以通过以下命令来验证 PM2 是否安装成功:

pm2 --version

如果一切顺利,你应该会看到 PM2 的版本号。恭喜你,PM2 已经成功安装啦!😊

本地安装 PM2

除了全局安装,你还可以选择将 PM2 作为项目的依赖项进行本地安装。这对于那些不想在全局环境中安装 PM2 的开发者来说是一个不错的选择。本地安装的好处是,每个项目都可以有自己的 PM2 版本,避免了不同项目之间的冲突。

要本地安装 PM2,只需进入你的项目目录,然后运行以下命令:

npm install pm2 --save-dev

这会将 PM2 安装到项目的 node_modules 文件夹中,并将其添加到 package.json 文件的 devDependencies 中。安装完成后,你可以通过以下命令来启动 PM2:

npx pm2 start app.js

npx 是 npm 5.2.0 之后引入的一个工具,它允许你在不全局安装的情况下运行本地安装的包。这样你就可以在项目的上下文中使用 PM2 了。

更新 PM2

如果你已经安装了 PM2,但想要更新到最新版本,可以使用以下命令:

npm install -g pm2@latest

这会将 PM2 更新到最新的稳定版本。如果你使用的是本地安装的 PM2,可以使用以下命令来更新:

npm update pm2

更新完成后,记得重新启动 PM2 以应用最新的更改:

pm2 update

启动和管理应用程序

启动应用程序

现在我们已经安装好了 PM2,接下来就是如何使用它来启动和管理 Node.js 应用程序了。假设你有一个简单的 Node.js 应用程序,文件名为 app.js,内容如下:

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('Hello, World!');
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

要使用 PM2 启动这个应用程序,只需在终端中运行以下命令:

pm2 start app.js

PM2 会启动你的应用程序,并将其添加到进程列表中。你可以通过以下命令查看当前正在运行的进程:

pm2 list

这会显示所有由 PM2 管理的进程,包括进程 ID、状态、名称等信息。你可以看到类似如下的输出:

┌─────┬──────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────────┬──────────┐
│ id  │ name     │ namespace   │ version │ mode    │ pid      │ uptime │ memory   │ watching │
├─────┼──────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────────┼──────────┤
│ 0   │ app      │ default     │ 1.0.0   │ fork    │ 12345    │ 0s     │ 20.5 MB  │ disabled │
└─────┴──────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────────┴──────────┘

停止和重启应用程序

如果你想停止某个应用程序,可以使用 pm2 stop 命令,后面跟上进程 ID 或者应用程序名称。例如:

pm2 stop app

这会停止名为 app 的应用程序。如果你想重启应用程序,可以使用 pm2 restart 命令:

pm2 restart app

PM2 会自动重启应用程序,并保持其在后台运行。你还可以使用 pm2 reload 命令来热重启应用程序,这意味着在重启过程中不会丢失任何连接或请求。

查看应用程序日志

PM2 会自动记录应用程序的标准输出和错误日志。你可以通过以下命令查看应用程序的日志:

pm2 logs

这会实时显示所有由 PM2 管理的应用程序的日志。如果你想查看特定应用程序的日志,可以加上进程 ID 或者应用程序名称:

pm2 logs app

如果你想清除日志文件,可以使用 pm2 flush 命令:

pm2 flush

这会清空所有应用程序的日志文件。如果你想只清除某个应用程序的日志,可以使用 pm2 flush <app-name>

设置应用程序自动重启

PM2 默认会在应用程序崩溃时自动重启它。如果你想进一步配置自动重启的行为,可以使用 --watch 选项。这个选项会让 PM2 监控应用程序的文件变化,并在文件发生变化时自动重启应用程序。

要启用文件监控,可以在启动应用程序时加上 --watch 选项:

pm2 start app.js --watch

PM2 会监控 app.js 文件及其所在目录中的所有文件。当这些文件发生变化时,PM2 会自动重启应用程序。你还可以通过 --ignore-watch 选项来指定忽略的文件或目录。例如:

pm2 start app.js --watch --ignore-watch="node_modules"

这会忽略 node_modules 目录中的文件变化,避免不必要的重启。

配置 PM2 以开机自启

为了让 PM2 在服务器重启后自动启动你管理的所有应用程序,你需要配置 PM2 以开机自启。PM2 提供了一个简单的命令来完成这项工作:

pm2 startup

这个命令会生成一个启动脚本,并提示你运行一条命令来将其安装到系统中。根据你的操作系统,这条命令可能会有所不同。例如,在 Ubuntu 上,你会看到类似如下的输出:

[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin pm2 startup systemd -u your-username --hp /home/your-username

按照提示运行这条命令,PM2 就会在系统启动时自动启动你管理的所有应用程序。

为了确保 PM2 在系统启动时正确启动所有应用程序,你还需要保存当前的进程列表:

pm2 save

这会将当前正在运行的进程列表保存到 PM2 的配置文件中。下次系统启动时,PM2 会自动恢复这些进程。

高级功能

集群模式

PM2 的一个非常强大的功能是它的集群模式。在集群模式下,PM2 会自动为你创建多个应用程序实例,并通过内置的负载均衡机制分发请求。这对于多核 CPU 的服务器来说非常有用,因为它可以充分利用服务器的计算资源,提升应用程序的性能。

要启用集群模式,只需在启动应用程序时加上 -i 选项,后面跟上你想要创建的实例数量。例如:

pm2 start app.js -i max

这里的 max 表示 PM2 会根据服务器的 CPU 核心数自动创建相应数量的实例。如果你知道具体的实例数量,也可以直接指定数字,例如:

pm2 start app.js -i 4

这会创建 4 个应用程序实例。PM2 会自动将请求分发到这些实例中,确保每个实例都能处理一部分流量。

日志轮转

随着应用程序的运行时间越来越长,日志文件可能会变得非常大,甚至占用大量的磁盘空间。为了避免这种情况,PM2 提供了日志轮转功能。日志轮转是指当日志文件达到一定大小时,PM2 会自动将旧的日志文件归档,并创建一个新的日志文件继续记录新的日志。

要启用日志轮转,可以在启动应用程序时加上 --log-date-format--merge-logs 选项。例如:

pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm:ss" --merge-logs

--log-date-format 选项指定了日志的时间格式,--merge-logs 选项表示将标准输出和错误日志合并到同一个文件中。

你还可以通过 pm2-logrotate 模块来更细粒度地控制日志轮转行为。首先,安装 pm2-logrotate 模块:

pm2 install pm2-logrotate

安装完成后,你可以通过以下命令来查看和修改日志轮转的配置:

pm2 set pm2-logrotate:max_size 10M
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true

这些命令分别设置了日志文件的最大大小为 10MB,保留 7 天的日志文件,并启用了日志压缩功能。

实时监控

PM2 提供了一个内置的监控面板,可以实时查看应用程序的性能指标,如内存使用、CPU 占用、响应时间等。要启动监控面板,只需运行以下命令:

pm2 monit

这会打开一个基于 Web 的监控界面,显示所有由 PM2 管理的应用程序的实时数据。你可以通过这个界面查看每个应用程序的运行状态、内存和 CPU 使用情况,以及请求的响应时间。

如果你想要更详细的监控数据,还可以使用 PM2 的 keymetrics 服务。keymetrics 是一个第三方监控平台,可以与 PM2 集成,提供更多的监控功能和报警机制。不过,今天我们主要关注 PM2 内置的监控功能,keymetrics 我们以后再详细介绍。

报警通知

PM2 还支持通过电子邮件或短信发送报警通知。你可以配置 PM2 在应用程序出现异常时自动发送通知,以便及时发现问题并采取措施。

要启用报警通知,首先需要安装 pm2-mailer 模块:

pm2 install pm2-mailer

安装完成后,你可以通过以下命令来配置报警通知:

pm2 set pm2-mailer:email your-email@example.com
pm2 set pm2-mailer:smtp_host smtp.example.com
pm2 set pm2-mailer:smtp_port 587
pm2 set pm2-mailer:smtp_user your-smtp-user
pm2 set pm2-mailer:smtp_pass your-smtp-password

这些命令分别设置了接收报警通知的电子邮件地址、SMTP 服务器的主机名、端口号、用户名和密码。

你还可以通过 pm2 set pm2-mailer:threshold 命令来设置报警的阈值。例如,当应用程序的内存使用超过 80% 时发送报警通知:

pm2 set pm2-mailer:threshold 80

这样,当应用程序的内存使用超过 80% 时,PM2 会自动发送一封报警邮件到你指定的邮箱。

生产环境最佳实践

使用 PM2 配置文件

在生产环境中,手动输入命令来启动和管理应用程序并不是一个好主意。更好的做法是使用 PM2 的配置文件来定义应用程序的启动参数和行为。PM2 支持多种格式的配置文件,包括 JSON、YAML 和 JavaScript。

下面是一个简单的 JSON 配置文件示例:

{
  "apps": [
    {
      "name": "my-app",
      "script": "app.js",
      "instances": "max",
      "exec_mode": "cluster",
      "watch": true,
      "env": {
        "NODE_ENV": "production"
      },
      "log_date_format": "YYYY-MM-DD HH:mm:ss",
      "merge_logs": true
    }
  ]
}

这个配置文件定义了一个名为 my-app 的应用程序,使用 app.js 作为入口文件,启用了集群模式和文件监控,并设置了环境变量 NODE_ENVproduction。你还可以通过 env 字段定义其他环境变量,例如数据库连接字符串、API 密钥等。

要使用这个配置文件启动应用程序,只需运行以下命令:

pm2 start ecosystem.config.json

PM2 会读取配置文件中的参数,并根据这些参数启动应用程序。你还可以通过 pm2 startOrRestart 命令来启动或重启应用程序,具体取决于应用程序是否已经在运行。

使用 PM2 与 Nginx 配合

在生产环境中,通常会使用 Nginx 作为反向代理服务器,将请求转发给后端的 Node.js 应用程序。PM2 可以与 Nginx 配合使用,确保应用程序的高可用性和性能。

首先,确保 Nginx 已经安装并配置好。然后,在 Nginx 的配置文件中添加以下内容:

server {
  listen 80;
  server_name your-domain.com;

  location / {
    proxy_pass http://localhost:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

这段配置告诉 Nginx 监听 80 端口,并将所有请求转发给运行在 localhost:3000 的 Node.js 应用程序。proxy_set_header 指令用于传递客户端的 IP 地址和其他相关信息,确保应用程序能够正确处理请求。

使用 PM2 与 Docker 配合

如果你使用 Docker 来部署应用程序,PM2 也可以很好地与 Docker 配合使用。你可以在 Docker 容器中安装 PM2,并使用 PM2 来管理容器中的 Node.js 应用程序。

首先,创建一个 Dockerfile,内容如下:

FROM node:14

WORKDIR /app

COPY package*.json ./
RUN npm install

COPY . .

RUN npm install -g pm2

EXPOSE 3000

CMD ["pm2-runtime", "start", "app.js"]

这个 Dockerfile 使用 Node.js 14 作为基础镜像,安装了 PM2,并将应用程序的代码复制到容器中。最后,使用 pm2-runtime 命令启动应用程序。pm2-runtime 是 PM2 提供的一个特殊命令,专为 Docker 环境设计,它可以确保应用程序在容器中正确启动,并且不会因为 PM2 退出而导致容器停止。

构建并运行 Docker 容器:

docker build -t my-app .
docker run -d -p 3000:3000 my-app

这样,你的应用程序就会在 Docker 容器中运行,并且由 PM2 管理。你可以通过 docker logs 命令查看应用程序的日志,或者通过 docker exec 命令进入容器并使用 PM2 的命令行工具来管理应用程序。

总结

好了,今天的讲座就到这里啦!我们详细介绍了如何使用 PM2 来管理和部署 Node.js 应用程序,从安装 PM2 到启动和管理应用程序,再到高级功能和生产环境的最佳实践。希望这些内容对你有所帮助,让你能够在生产环境中更加轻松地管理你的 Node.js 应用程序。

如果你还有任何问题,或者想了解更多关于 PM2 的内容,欢迎随时提问。感谢大家的参与,我们下次再见!👋


附录:常用 PM2 命令

命令 描述
pm2 start <script> 启动应用程序
pm2 stop <id|name> 停止应用程序
pm2 restart <id|name> 重启应用程序
pm2 reload <id|name> 热重启应用程序
pm2 list 查看所有正在运行的进程
pm2 show <id|name> 查看某个进程的详细信息
pm2 logs 查看应用程序日志
pm2 flush 清空所有日志文件
pm2 delete <id|name> 删除某个进程
pm2 save 保存当前进程列表
pm2 startup 配置 PM2 开机自启
pm2 monit 打开实时监控面板
pm2 start <config-file> 使用配置文件启动应用程序
pm2 startOrRestart <config> 启动或重启应用程序
pm2 install <module> 安装 PM2 模块
pm2 uninstall <module> 卸载 PM2 模块

希望这篇文章对你有所帮助,祝你在 Node.js 开发的道路上越走越顺!🌟

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注