引言: 本文集成了我们团队使用PM2的全面经验,涵盖了PM2的所有操作方式,堪称一份实用的API操作手册。虽然内容丰富,可能会显得有些枯燥,但绝对值得您收藏起来,细细品读。
🧐🧐🧐 前言
在Node.js
的世界里,应用程序的效率和稳定性至关重要。Node.js
本身是单线程的,但它的非阻塞 I/O 模型使得其非常适合处理高并发的网络请求。然而,如何有效地利用服务器的多核CPU
,以及在应用程序出现问题时快速恢复服务,始终是开发者的一大挑战。PM2应运而生,它不仅可以帮助我们管理多个Node.js
应用实例,还提供了负载均衡、自动重启、日志管理等功能,极大地提高了应用的可靠性和服务的可用性。
在本文中,我将详细介绍如何使用PM2
来管理和部署Node.js
应用程序,并通过实用的代码示例和配置方法,帮助你充分利用这一强大工具。
为什么使用PM2?🔥🔥
在正式介绍PM2之前,让我们先来看看它的一些关键优势:
- 自动负载均衡:PM2通过内置的Cluster模式,允许在所有CPU核心上运行多个Node.js实例,自动进行负载均衡。
- 无停机重启:支持热更新和无停机重启功能,对于生产环境中的应用更新和维护至关重要。
- 进程守护:当Node.js应用因错误停止时,PM2会自动重启应用,确保服务的最高可用性。
- 状态监控与日志管理:提供实时的应用性能监控界面,并支持日志文件的自动分割和管理。
- 开机自启动:PM2能够生成系统特定的启动脚本,使得应用随系统启动而自动运行。
安装与配置
❤️ 安装 PM2
使用npm或yarn进行全局安装:
// npm
npm install pm2 -g
// yarn
yarn global add pm2
❤️ 更新升级
pm2 update
注意:升级 pm2 时需要注意 Node.js 版本是否兼容。如果之前设置了 pm2 的自启动(startup)功能,在升级后需要重新执行自启动命令。
❤️ 应用程序配置方式
使用PM2管理应用程序有两种方式:命令行方式和配置文件方式。
命令行方式
pm2 start [name|node|config|command|sh] -i 4
- name:应用程序名字;
- node:入口文件(如app.js);
- command:应用程序命令("npm run start");
- config:配置文件(ecosystem.config.js);
- sh:配置脚本。
可以使用不同的参数来配置应用程序的启动方式。下面是一些常用的参数:
-i 4 # cluster mode 模式启动4个app.js的应用实例。4个应用程序会自动进行负载均衡
--name="app" # 启动应用程序并命名为 "app"
--watch # 当文件变化时自动重启应用
--env # 环境
--attach # 实时日志流
--arg1 --arg2 # 传递参数到应用程序
--max-memory-restart 300M # 最大内存自动重启(间隔30s)
--restart-delay=3000 # 自动重启延时时间
--no-autorestart # 禁止自动重启
常见操作命令:
// Start启动
pm2 start app.js
// Stop停止
pm2 stop app.js
// Restart重启
pm2 restart app.js
// Delete删除
pm2 delete app.js
配置文件方式
pm2 支持配置 js、yml、json 文件格式。尤其 pm2 在管理多个应用程序的时候,使用配置文件管理更方便。
ecosystem.config.js
pm2 init simple # 初始化生成一个ecosystem.config.js
module.exports = {
apps : [{
name : "app",
script : "./app.js"
}, {
name : "worker",
script : "./worker.js"
}]
}
pm2 start ecosystem.config.js # 通过设置js配置文件来启动应用程序
name: "app" # 名字
script:"./app.js" # 路径
watch:[boolean|array] # 文件变化时自动重启应用[所有文件true|指定文件夹如['doc']]
watch_delay: 1000 # 更新间隔
ignore_watch : ["node_modules"] # 忽略的文件夹
max_memory_restart: "300M" # 设置最大内存重启(间隔30s)
restart_delay: 3000 # 自动重启延时时间
autorestart: false # 禁止自动重启
通过设置 配置文件 可以操作应用程序(如:start/stop/restart/delete )。
# Start
pm2 start ecosystem.config.js
# Stop
pm2 stop ecosystem.config.js
# Restart
pm2 restart ecosystem.config.js
# Delete
pm2 delete ecosystem.config.js
以上执行 配置文件 ,那么配置文件中的所有应用程序都会发生相应变化。
pm2提供了对配置文件中某个应用单独处理 -only。
pm2 start ecosystem.config.js --only app
也可以同时处理多个应用。
pm2 start ecosystem.config.js --only "app,worker"
⏰ 开机自启动 ⏰
pm2可以通过设置开机自启动,来保证当出现服务/宿主机出现重启时,可以及时启动pm2管理的应用程序。
pm2 startup
生成自启动脚本后,复制粘贴执行脚本 sudo env......
注意:如果要保证开启自启动pm2应用程序,需要保存pm2应用程序列表。
pm2 save
删除自启动应用程序
pm2 unstartup
日志管理 ✍️✍️✍️
pm2-logrotate
pm2本身可以实现日志输出,但是pm2的日志文件不能自动分割,会导致文件越来越大,查看日志也麻烦。
为了防止日志文件过大,我们可以使用pm2-logrotate
进行日志文件的自动分割。(切记是pm2 install,而不是npm)
pm2 install pm2-logrotate
配置pm2-logrotate
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:[option][value]
Options:
max_size 当一个文件的大小超过这个值时,它将会对其进行分割(默认10M)。
retain 保留日志文件数量(默认为30个文件日志)。
compress 是否启用压缩处理所有的旋转日志(默认false)。
dateFormat 日志文件名称格式(默认格式YYYY-MM-DD_HH-mm-ss)。
rotateModule 像其他应用程序一样旋转pm2模块的日志(默认true)。
workerInterval 检查日志大小的时间间隔(默认30秒)。
rotateInterval 定时执行旋转(默认每天午夜0 0 * * *)。
TZ 偏移保存日志文件的标准tz数据库时区(默认系统时间)
配置完成 pm2-logrotate,需要 restart
应用程序。
执行完install后,会生成4个文件。
/Users/tal/.pm2/logs/app1-out.log # 文件记录的就是`console.log`输出
/Users/tal/.pm2/logs/app1-error.log # 记录的是错误输出
/Users/tal/.pm2/logs/pm2-logrotate-error.log # 记录的是分割的异常日志文件
/Users/tal/.pm2/logs/pm2-logrotate-out.log # 记录的是分割的日志文件
分割的日志文件
1|pm2-logr | "/Users/tal/.pm2/logs/pm2-logrotate-error__2022-04-28_00-02-54.log" has been created
1|pm2-logr | "/Users/tal/.pm2/logs/app1-out__2022-04-28_00-02-54.log" has been created
1|pm2-logr | "/Users/tal/.pm2/logs/app1-error__2022-04-28_00-02-54.log" has been created
pm2 logs
pm2 logs --lines 200
pm2 logs \[options] \[id|name|namespace]
Options:
--raw out与err日志分类输出
--err 显示错误日志
--out 显示console日志
--lines <n> 显示最新的共n条日志
-h, --help
终端的仪表板:
若是想看 pm2 在终端的整体情况,执行终端的仪表板操作。
pm2 monit
Cluster Mode 🔥🔥
Cluster Mode
集群模式将在所有可用CPU
上扩展,自动进行负载均衡,将很大程度上提高应用程序的性能和可靠性。
命令行方式:
pm2 start app.js -i [max|number]
- -i 开启指开启集群模式。
- max|number 值代表PM2将自动检测可用CPU的数量,并运行尽可能多的进程。
配置文件方式:
在配置文件中通过exec_mode、instances设置.
module.exports = {
apps : [{
script : "api.js",
exec_mode : "cluster",
instances : "max"
}]
}
💬 Deployment System
PM2还提供了一套强大的部署系统,可帮助您简化应用程序的部署过程。能满足在同一台或多台服务器部署deploy
。
pm2 deploy <configuration_file> <environment_> <command_>
- configuration_file:配置文件
- environment:环境
- command:命令
pm2 deploy app.json prod setup # 设置“prod”远程服务器
Commands:
setup 运行远程安装命令
update 更新部署到最新版本
revert [n] 恢复版本到第n次部署
curr[ent] 输出当前版本提交信息
prev[ious] 输出上一版本提交信息
exec|run <cmd> 执行给定的<cmd>
list 列出之前的部署提交信息
[ref] 部署到[ref], "ref"设置, 新标记
需要提供一个名为app.json
的配置文件,其中包含有关部署环境、服务器和应用程序的详细信息。使用PM2的部署系统,您可以轻松地将应用程序部署到不同的服务器上。
基本常见命令清单 🌟🌟
遗忘之时,就来这里温故一下:
1、显示信息
pm2 [list|ls|l|status] # 列表 PM2 启动的所有的应用程序
pm2 monit # 每个应用程序的CPU和内存占用情况
pm2 show [name|id] # 应用程序的基本信息、情况
pm2 list --sort [name|id|pid|memory|cpu|status|uptime][:asc|desc] # 排序[列表字段][正序|倒序]
2、程序启动
pm2 start app.js # 启动app.js应用程序
pm2 restart [all|name1 name2] # 终止并重启应用
pm2 reload [all|name1 name2] # 重新加载(0秒的停机)
pm2 resurrect # 重新加载保存的应用列表
pm2 gracefulReload all # 以群集模式重新加载所有应用程序
pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
pm2 reset [name] # 重置应用程序统计
3、停止
pm2 stop [all|name|id|pid] # 停止应用程序
pm2 delete [all|name|id] # 关闭并删除应用程序
4、设置开机自启动
pm2 startup # 创建服务开机自启动
pm2 unstartup # 删除服务开机自启动
pm2 save # 保存当前应用列表,用于设置服务自启动
5、日志
pm2 logs [无|name] # 显示应用程序的日志(无,指所有应用程序)
pm2 flush [无|name] # 清空日志文件
6、安装升级
pm2 update # 更新升级
pm2 install pm2-logrotate # 安装模块(这里是日志**自动分割**)
pm2 uninstall pm2-logrotate # 卸载模块
7、远程部署
pm2 deploy app.json prod setup # 设置远程服务器
pm2 deploy app.json prod revert 2 # 恢复版本到第2次部署
通过掌握这些常用命令,我们可以更好地使用PM2进行应用程序的管理和部署,提高开发效率和运行稳定性。
总结
总结起来,PM2
作为一款强大的进程管理工具,通过自动重启、负载均衡、日志管理、部署系统等一系列功能,极大地简化了应用程序的部署与管理。无论是小型应用还是大型系统,PM2
都能帮助开发人员更好地掌控应用程序的运行状态,提高开发效率和用户体验。
如果您觉得这篇文章对您有所帮助,请点赞❤️和收藏,以便更多的人能够看到。同时,如果您有任何问题或不同的见解,欢迎在评论区留言讨论。