夭幻境地

关注技术,关心成长,关怀世事人情

pm2——一个很棒的Node应用进程管理工具

pm2 是一个带有负载均衡功能的Node应用的进程管理器,类似有Supervisor,forever。

当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的。

它非常适合IaaS结构,但不要把它用于PaaS方案

2016_1_4_11_44_54_450_1000

主要特性:

  • 内建负载均衡(使用Node cluster 集群模块)
  • 后台运行
  • 0秒停机重载(维护升级的时候不需要停机)
  • 具有Ubuntu和CentOS 的启动脚本
  • 停止不稳定的进程(避免无限循环)
  • 控制台检测
  • 提供 HTTP API
  • 远程控制和实时的接口API ( Nodejs 模块,允许和PM2进程管理器交互 )

简单教程

首先需要安装pm2:

npm install -g pm2

运行:

pm2 start app.js

初次安装并运行,会有一个高大上的界面:

31920-a87d9f022b1bad3b

高大上的界面

查看运行状态

pm2 list

我们可以通过简单的命令查看应用的运行状态:

效果如下:

31920-a87d9f022b1bad3b

运行状态

ANodeBlog应用正在运行,pid为31480,并且占用内存为89.113 MB。

追踪资源运行情况

pm2 monit

会看到应用资源的实时运行情况

31920-a87d9f022b1bad3b

实时运行情况

查看应用详细部署状态

如果我们想要查看一个应用详细的运行状态,比如ANodeBlog的状态,可以运行:

pm2 describe 3

“3”是指App Id。

结果如下:

31920-a87d9f022b1bad3b

详细运行状态

PM2常用命令

假设你现在已经写好了一个app.js的文件,需要启动,你可以使用pm2进行管理

1. 启动

pm2 start app.js
pm2 start app.js –name my-api   #my-api为PM2进程名称
pm2 start app.js -i 0           #根据CPU核数启动进程个数
pm2 start app.js –watch   #实时监控app.js的方式启动,当app.js文件有变动时,pm2会自动reload

2. 查看进程

pm2 list
pm2 show 0 或者 # pm2 info 0  #查看进程详细信息,0为PM2进程id

3. 监控

pm2 monit

4. 停止

pm2 stop all  #停止PM2列表中所有的进程
pm2 stop 0    #停止PM2列表中进程为0的进程

5. 重载

pm2 reload all    #重载PM2列表中所有的进程
pm2 reload 0     #重载PM2列表中进程为0的进程

6. 重启

pm2 restart all     #重启PM2列表中所有的进程
pm2 restart 0      #重启PM2列表中进程为0的进程

7. 删除PM2进程

pm2 delete 0     #删除PM2列表中进程为0的进程
pm2 delete all   #删除PM2列表中所有的进程

8. 日志操作

pm2 logs [–raw]   #Display all processes logs in streaming
pm2 flush              #Empty all log file
pm2 reloadLogs    #Reload all logs

9. 升级PM2

npm install pm2@lastest -g   #安装最新的PM2版本
pm2 updatePM2                    #升级pm2

10. 更多命令参数请查看帮助

pm2 –help

预定义运行配置文件

我们可以预定义一个配置文件,然后制定运行这个配置文件,比如我们定义一个文件apps.json,内容如下:

{ 
	"apps" : [
		{
			"name" : "appname",
			"cwd" : "/nodejs",
			"script" : "./appname/app.js",
			"watch" : false,
			"instances" : 4,
			"exec_mode" : "cluster",
			"max_memory_restart" : "512M",
			"min_uptime" : "60s",
			"max_restarts" : 10,
			"error_file" : "./test-err.log",
			"out_file" : "./test-out.log",
			"pid_file" : "./test.pid",
			"env" : {
				"NODE_ENV" : "development"
			},
			"env_dev" : {
				"NODE_ENV" : "development"
			},
			"env_pro" : {
				"NODE_ENV" : "production"
			}
		}
	]
}

然后可以通过

cd 'apps.json文件所在目录'
pm2 start apps.json --env dev

运行apps.json所指定的所有应用。

注:指令参数--env 指定node环境。参数值由dev_*所指定(上文--env dev指定node环境为development),不指定--env参数时,默认node环境为env指定的值;

参数说明:

apps:json结构,apps是一个数组,每一个数组成员就是对应一个pm2中运行的应用 

name:应用程序的名称 

cwd:应用程序所在的目录 

script:应用程序的脚本路径 

exec_interpreter:应用程序的脚本类型,这里使用的 

shell,默认是nodejs 

min_uptime:最小运行时间,这里设置的是60s即如果应用程序在60s内退出,pm2会认为程序异常退出,此时触发重启 

max_restarts:设置数量 

max_restarts:设置应用程序异常退出重启的次数,默认15次(从0开始计数) 

exec_mode:应用程序启动模式,这里设置的是cluster_mode(集群),默认是fork 

error_file:自定义应用程序的错误日志文件 

out_file:自定义应用程序日志文件 

pid_file:自定义应用程序的pid文件 

watch:是否启用监控模式,默认是false。如果设置成true,当应用程序变动时,pm2会自动重载。这里也可以设置你要监控的文件。

PM2目录结构

默认的目录是:当前用于的家目录下的.pm2目录(此目录可以自定义,请参考:五、自定义启动文件),详细信息如下:

  1. $HOME/.pm2                   #will contain all PM2 related files
  2. $HOME/.pm2/logs           #will contain all applications logs
  3. $HOME/.pm2/pids           #will contain all applications pids
  4. $HOME/.pm2/pm2.log     #PM2 logs
  5. $HOME/.pm2/pm2.pid     #PM2 pid
  6. $HOME/.pm2/rpc.sock    #Socket file for remote commands
  7. $HOME/.pm2/pub.sock   #Socket file for publishable events
  8. $HOME/.pm2/conf.js       #PM2 Configuration

pm2指令集

# General
npm install pm2 -g            # Install PM2
pm2 start app.js              # Start, Daemonize and auto-restart application (Node)
pm2 start app.py              # Start, Daemonize and auto-restart application (Python)
pm2 start npm -- start        # Start, Daemonize and auto-restart Node application
 
# Cluster Mode (Node.js only)
pm2 start app.js -i 4         # Start 4 instances of application in cluster mode
                                # it will load balance network queries to each app
pm2 reload all                # Zero Second Downtime Reload
pm2 scale [app-name] 10       # Scale Cluster app to 10 process
 
# Process Monitoring
pm2 list                      # List all processes started with PM2
pm2 monit                     # Display memory and cpu usage of each app
pm2 show [app-name]           # Show all informations about application
 
# Log management
pm2 logs                      # Display logs of all apps
pm2 logs [app-name]           # Display logs for a specific app
pm2 logs --json               # Logs in JSON format
pm2 flush
pm2 reloadLogs
 
# Process State Management
pm2 start app.js --name="api" # Start application and name it "api"
pm2 start app.js -- -a 34     # Start app and pass option "-a 34" as argument
pm2 start app.js --watch      # Restart application on file change
pm2 start script.sh           # Start bash script
pm2 start app.json            # Start all applications declared in app.json
pm2 reset [app-name]          # Reset all counbters
pm2 stop all                  # Stop all apps
pm2 stop 0                    # Stop process with id 0
pm2 restart all               # Restart all apps
pm2 gracefulReload all        # Graceful reload all apps in cluster mode
pm2 delete all                # Kill and delete all apps
pm2 delete 0                  # Delete app with id 0
 
# Startup/Boot management
pm2 startup                   # Generate a startup script to respawn PM2 on boot
pm2 save                      # Save current process list
pm2 resurrect                 # Restore previously save processes
pm2 update                    # Save processes, kill PM2 and restore processes
pm2 generate                  # Generate a sample json configuration file
 
# Deployment
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
 
# Module system
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

参考文档:


最后编辑于 2017-09-29 10:21