[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 参考与推荐文献

  • 基于docker部署pm2前端应用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章