[nodejs] pm2 : nodejs 的进程管理工具
0 pm2 概述
0.1 序
0.2 pm2 简述
PM2
是一款非常优秀的Node
进程管理工具,它有着丰富的特性:能够充分利用多核 CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启。PM2
是开源的基于Nodejs
的应用进程管理器
,包括守护进程,监控,日志的一整套完整的功能
PM2 是一个带有负载均衡功能的 Node 应用进程管理器
0.3 pm2的主要特性
- 内建负载均衡(使用 Node cluster 集群模块)
- 后台运行
- 0 秒停机重载,我理解大概意思是维护升级的时候不需要停机.
- 具有 Ubuntu 和 CentOS 的启动脚本
- 停止不稳定的进程(避免无限循环)
- 控制台检测
- 提供 HTTP API
- 远程控制和实时的接口 API(Nodejs 模块,允许和 PM2 进程管理器交互)
1 pm2的安装
Step1 安装nodejs/npm
- 在使用pm2之前,我们还需要安装nodejs/npm,这是前提
下载nodejs:
如何安装nodejs?
Step2 基于npm安装pm2
- 安装pm2
# 全局安装 pm2
npm install pm2 -g
npm install
- 查看版本
pm2 -v
或 pm2 --version
- 补充:基于yarn安装pm2
yarn global add pm2
2 pm2的常用命令
启动/停止/重启/重置/重载/删除
- 启动
# 启动进程/应用
pm2 start app.js
或 pm2 start bin/www
或 pm2 start app.js --name my-app
或 pm2 start app.js -i 4
# 根据CPU核数启动进程个数。
# cluster mode 模式启动4个app.js的应用实例,4个应用程序会自动进行负载均衡
或 pm2 start app.js --watch
# 实时监控app.js的方式启动。当app.js文件有变动时,pm2会自动reload
# 重命名进程/应用
pm2 start app.js --name wb123
# 添加进程/应用
pm2 start bin/www --watch
- 停止
# 结束进程/应用
pm2 stop www
# 结束所有进程/应用
pm2 stop all
# 停止PM2列表中进程为0的进程
pm2 stop 0
- 重载/重启
# 重载PM2列表中cluster mode下所有的进程
pm2 reload all
# 重载PM2列表中进程为0的进程
pm2 reload 0
# 重新启动所有进程/应用
pm2 restart all
# 重新启动指定的进程/应用
pm2 restart www
pm2 restart 0
# 重置重启
// Graceful reload all apps in cluster mode
pm2 gracefulReload all
pm2 reset [app-name]
- 删除应用/进程
# 删除所有进程/应用
pm2 delete all
# 删除指定的进程/应用
pm2 delete www
pm2 delete 0
查看/监控/日志
- 查看/列出应用/进程
# 列出所有进程/应用
pm2 list
# 显示应用程序的所有信息
pm2 show [app-name]
或 pm2 show 0
# 查看进程详细信息,0为PM2进程id
pm2 info 0
# 查看某个进程/应用具体情况
pm2 describe www
- 监控应用/进程
# 查看进程/应用的资源消耗情况 (显示每个应用程序的CPU和内存占用情况)
pm2 monit
- 日志操作
pm2 logs # 显示所有应用程序的日志
pm2 logs [app-name] # 显示指定应用程序的日志
# 例如:若要查看某个进程/应用的日志 : pm2 logs www
pm2 logs [–raw] #Display all processes logs in streaming
pm2 flush #Empty all log file
pm2 reloadLogs #Reload all logs
系统级/远程操作/安装/卸载/其他
- 系统级命令
pm2 startup # 创建开机自启动命令
pm2 save # 保存当前应用列表
pm2 resurrect # 重新加载保存的应用列表
pm2 update # Save processes, kill PM2 and restore processes
pm2 generate # Generate a sample json configuration file
- 远程操作
pm2 deploy app.json prod setup # Setup “prod” remote server
pm2 deploy app.json prod # Update “prod” remote server
pm2 deploy app.json prod revert 2 # Revert “prod” remote server by 2
- 安装/升级/卸载
npm install pm2@lastest -g # 安装最新的PM2版本
pm2 updatePM2 # 升级pm2
pm2 module:generate [name] # Generate sample module with name [name]
pm2 install pm2-logrotate # Install module (here a log rotation system)
pm2 uninstall pm2-logrotate # Uninstall module
pm2 publish # Increment version, git push and npm publish
- 其他命令
pm2 start script.sh # 启动 bash 脚本
pm2 scale api 10 # 把名字叫api的应用扩展到10个实例
pm2 reset [app-name] # 重置重启数量
- 更多 、帮助
pm2 --help
3 PM2目录结构
默认的目录是:当前用于的HOME目录下的
.pm2
目录(此目录可以自定义),详细信息如下:
$HOME/.pm2 # will contain all PM2 related files
$HOME/.pm2/logs # will contain all applications logs
$HOME/.pm2/pids # will contain all applications pids
$HOME/.pm2/pm2.log # PM2 logs
$HOME/.pm2/pm2.pid # PM2 pid
$HOME/.pm2/rpc.sock # Socket file for remote commands
$HOME/.pm2/pub.sock # Socket file for publishable events
$HOME/.pm2/conf.js # PM2 Configuration
4 自定义PM2启动文件
创建一个test.json的示例文件,格式如下:
~]# mkdir -p /opt/htdocs/testapp
~]# cd /opt/htdocs/testapp
testapp]# cat test.json
{
"apps": [
{
"name": "test",
//"port": "8003", // 启动端口
"cwd": "/opt/htdocs/testapp",
"script": "./test.sh",
"exec_interpreter": "bash",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"error_file": "./test-err.log",
"out_file": "./test-out.log",
"pid_file": "./test.pid",
"instances": 6,
"min_uptime": "200s",
"max_restarts": 10,
"max_memory_restart": "1M",
"cron_restart": "1 0 * * *",
"watch": false,
"merge_logs": true,
"exec_mode": "fork",
"autorestart": false,
"vizion": false
}
]
}
参数说明:
apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用
name:应用程序名称
cwd:应用程序所在的目录
script:应用程序的脚本路径
log_date_format:配置日志的输出格式
error_file:自定义应用程序的错误日志文件六、实例展示
out_file:自定义应用程序日志文件已上面的test.json为例
pid_file:自定义应用程序的pid文件
instances:启动脚本相 默认 nodejs
min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启max_restarts设置数量
max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数
cron_restart:定时启动,解决重启能解决的问题
watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。done
merge_logs:combine_logs的别名
exec_interpreter:应用程序的脚本类型,这里使用的shell,默认是nodejs
exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork
autorestart:启用/禁用应用程序崩溃或退出时自动重启
vizion:启用/禁用vizion特性(版本控制)
执行如下命令:
testapp]# pm2 start test.json
[PM2][WARN] You are starting 6 processes in fork_mode without load balancing. To enable it remove -x option.
[PM2][WARN] Applications test not running, starting...
[PM2] cron restart at 1 0 * * *
[PM2] App [test] launched (6 instances)
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ test │ 0 │ fork │ 2194 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 1 │ fork │ 2196 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 2 │ fork │ 2198 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 3 │ fork │ 2200 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 4 │ fork │ 2202 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 5 │ fork │ 2204 │ online │ 0 │ 0s │ 0% │ 1.4 MB │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
[root@bogon testapp]# pm2 list
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ test │ 0 │ fork │ 2221 │ online │ 1 │ 5s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 1 │ fork │ 2225 │ online │ 1 │ 5s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 2 │ fork │ 2229 │ online │ 1 │ 5s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 3 │ fork │ 2233 │ online │ 1 │ 5s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 4 │ fork │ 2237 │ online │ 1 │ 4s │ 0% │ 1.4 MB │ root │ disabled │
│ test │ 5 │ fork │ 2241 │ online │ 1 │ 4s │ 0% │ 1.4 MB │ root │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
testapp]# pm2 delete all
[PM2] Applying action deleteProcessId on app [all](ids: 0,1,2,3,4,5)
[PM2] [test](3) ✓
[PM2] [test](1) ✓
[PM2] [test](0) ✓
[PM2] [test](2) ✓
[PM2] [test](4) ✓
[PM2] [test](5) ✓
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
[root@bogon testapp]# pm2 list
┌──────────┬────┬──────┬─────┬────────┬─────────┬────────┬─────┬─────┬──────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
└──────────┴────┴──────┴─────┴────────┴─────────┴────────┴─────┴─────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
Y 扩展:PM2与Docker的对比
-
PM2
是一个Nodejs进程管理工具,而Docker
是一个容器化平台。它们在部署方式、优点和用途上有一些差异。 -
PM2 的优点:
- 简单易用:PM2 提供了简单的命令行接口,可以方便地管理应用程序的生命周期,如启动、停止、重启等。
- 进程管理:PM2 可以监控和管理多个进程,并提供日志管理、负载均衡等功能,从而更好地利用系统资源和保持应用程序的稳定性。
- 自动重启:如果应用程序崩溃或发生错误,PM2 可以自动重启它,确保应用程序始终可用。
- 运行时诊断:PM2 提供了实时监控和诊断工具,可以查看内存使用情况、CPU 使用情况和请求量等关键指标,帮助排查问题和性能调优。
- Docker 的优点:
- 环境隔离:Docker 使用容器来隔离应用程序及其依赖项,使得在不同环境中运行应用程序更加一致可靠。这意味着你可以在开发、测试和生产环境中使用相同的容器镜像,避免了环境配置的问题。
- 轻量级和可移植性:Docker 容器非常轻量级,占用资源较少。由于容器是独立的、自包含的单元,可以轻松地在不同的主机和平台上部署和迁移。
- 版本控制和复现性:Docker 镜像可以通过 Dockerfile 追踪和管理,这样你可以确保应用程序的版本一致性,并能够简化部署过程。此外,Docker 镜像的分层结构可以使镜像构建更加高效,减少资源消耗。
- 扩展和集群:Docker 可以方便地扩展应用程序,通过容器编排工具(如 Docker Compose、Kubernetes)可以轻松地进行多容器的管理和扩展。
- 差异与用途:
- PM2 更适合传统的服务器部署方式,适用于管理和监控多个 Node.js 进程,提供进程管理相关功能。
- Docker 更适合容器化部署,适用于将应用程序及其依赖项打包成容器镜像,并在不同环境中进行部署、迁移和扩展。
- 最佳实践:可基于Docker部署PM2的前端应用
综上所述,
PM2
更注重进程管理和应用程序的稳定性,而Docker
更注重环境隔离、可移植性和版本控制。
需根据你的需求和部署方式选择合适的工具。
在某些情况下,也可以结合使用 PM2 和 Docker,例如将使用 PM2 管理的 Node.js 应用程序放置在 Docker 容器中进行部署。
X 参考与推荐文献
- PM2 | NodeJS应用进程管理工具—PM2的基本使用 - CSDN
- pm2 应用程序日志(logs) - jiyik.com
- pm2 管理应用程序状态 - jiyik.com
- Centos 7安装pm2 , 操作等常用命令 - CSDN
- 【进程管理器】PM2应用进程管理器 - CSDN 【推荐】
- pm2
- 基于docker部署pm2前端应用
本文作者:
千千寰宇
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!
本文链接: https://www.cnblogs.com/johnnyzen
关于博文:评论和私信会在第一时间回复,或直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
日常交流:大数据与软件开发-QQ交流群: 774386015 【入群二维码】参见左下角。您的支持、鼓励是博主技术写作的重要动力!