pm2的基本使用
目录
1、pm2的安装
pm2是基于npm进行安装的,在安装pm2之前要先安装npm
安装pm2
命令:
sudo npm install -y pm2 -g
查看pm2的安装路径
命令:
sudo whereis pm2
查看安装的pm2的版本
命令:
sudo pm2 -v
出现上图所示表示安装成功。
2、更新PM2
更新PM2非常快(少于几秒)并且无缝。
首先确保您正确保存了所有进程:
sudo pm2 save
然后从NPM安装最新的PM2版本:
sudo npm install pm2 -g
最后更新内存中的PM2进程:
sudo pm2 update
就是这样,您现在拥有了一个全新的PM2系统!
3、上传项目到服务器并使用普通方式启动
使用工具上传需要部署的项目到服务器上,目录为/opt/下
进入项目路径下,查看启动文件
命令:
cd /opt/Test/ //进入目录/opt/Test/
ll //查看当前目录先的所有文件
项目的启动文件为app.js
使用普通方式启动项目
命令:
sudo npm start app.js
启动完成,在浏览器中访问
后台窗口打印如下
此时项目正常启动,这样启动项目的缺点就是,Xshell窗口断开连接以后项目就停止运行了,所以需要用到守护进行的工具,因此可以采用pm2
4、使用pm2启动项目
使用pm2启动项目的方式有多种
启动单个项目
进入项目路径
命令:
cd /opt/Test/
注意:使用pm2启动项目时,默认是通过自己项目中的package.json中的配置进行启动的,需要查看项目中的package.json中start的配置。
查看项目中的文件
命令:
ll //查看当前目录先的所有文件
使用vim查看package.json文件
命令:
sudo vim package.json
查看scripts下的start的配置值,根据这个启动路径进行启动。记住这个启动路径,退出查看。
在项目路径下启动项目
命令:
sudo pm2 start ./bin/www //启动当前项目
项目正常启动
到浏览器中访问项目
启动成功
5、pm2对项目的基本管理操作
5.1、启动项目
命令:
sudo pm2 start ./bin/www //在项目为Test的路径下执行的命令
5.2、列出PM2管理的所有应用程序
命令:
sudo pm2 ls
或者使用list
命令:
sudo pm2 list
两个命令都能列出当前PM2管理的所有应用程序
5.3、停止项目
5.3.1、停止某个项目
指定项目app name或id
命令:
sudo pm2 stop www //停止项目名为www的应用程序
或者
sudo pm2 stop 0 //停止项目id为0的应用程序
正常停止以后项目的status变为stopped(已停止)状态
5.3.2、停止所有项目
命令:
sudo pm2 stop all //停止pm2管理的所有应用程序
5.4、重启项目
5.4.1、重启某个项目
使用restart重启指定项目app name或id
命令:
sudo pm2 restart www //重启项目名为www的应用程序
或者
sudo pm2 restart 0 //重启项目id为0的应用程序
正常重启以后项目的status变为online(在线)状态
使用reload重载(重启)指定项目app name或id
命令:
sudo pm2 reload www //重载项目名为www的应用程序
或者
sudo pm2 reload 0 //重载项目id为0的应用程序
该命令不会执行后不会自动列出管理列表
5.4.2、重启所有项目
命令:
sudo pm2 restart all //重启pm2管理的所有应用程序
或者
sudo pm2 reload all //重载pm2管理的所有应用程序
5.5、删除项目进程
5.5.1、删除某个项目进程
在进行删除某个项目进程时,一般通需要先停止一段时间才会在去删除该进程
命令:
sudo pm2 delete www //删除项目名为www的应用程序的进程
或者
sudo pm2 delete 0 //删除项目id为0的应用程序的进程
5.5.2、删除所有项目进程
命令:
sudo pm2 delete all //删除pm2管理的所有应用程序的进程
6、pm2携带参数启动项目
在启动命令的后面携带参数进行启动
6.1、面携带参数进行启动示例
例:启动应用程序并设置该应用程序名称为test
在目录/opt/存在node项目Test ,进入项目之后进行启动
不设置应用程序进程名称进行启动
sudo pm2 start ./bin/www
设置应用程序进程名称为test进行启动
sudo pm2 start ./bin/www --name test //启动应用程序并设置进程名称为test
6.2、常用入参
# 指定应用程序名称
--name <app_name>
# 当文件更改时,重启应用程序
--watch
# 为应用程序重新加载设置内存阈值
--max-memory-restart <200MB>
# 指定日志文件
--log <log_path>
# 向脚本传递额外的参数
-- arg1 arg2 arg3
# 自动重启之间的延迟
--restart-delay <delay in ms>
# 在日志前面加上时间前缀
--time
# 不要自动重启应用程序
--no-autorestart
# 为强制重启指定cron
--cron <cron_pattern>
# 附加到应用程序日志
--no-daemon
7、查看日志
7.1、默认文件位置
pm2生成的日志文件的默认路径在$ HOME /.pm2/logs /下面
进入.pm2目录,就可以看到pm2输出的相关文件
命令:
cd .pm2/
ll
进入logs/目录下就可以看到相关的日志了
命令:
cd logs/
ll
7.2、使用命令查看历史日志
命令:
sudo pm2 logs --lines 200 //查看历史日志
打印实时日志
命令:
sudo pm2 logs //实时显示日志
7.3、常用日志操作命令
sudo pm2 logs --raw # 显示流中的所有进程日志
sudo pm2 flush # 清空所有日志文件
sudo pm2 reloadLogs # 重新加载所有日志
8、查看仪表盘
命令:
sudo pm2 monit //查看仪表盘
仪表盘可以显示实时监控的动态数据,退出Ctrl+C
9、使用生态系统文件启动项目
9.1、准备需要pm2托管的项目
先准备两个测试项目Test1和Test2(这里两个项目都为nodejs项目),两个项目都放在/opt/目录下,两个项目监听的端口不同
9.2、创建生态系统文件
pm2的生态文件,允许您通过流程文件微调每个应用程序的行为,选项,环境变量,日志文件。它对基于微服务的应用程序特别有用。可以使用Javascript,JSON和YAML格式的文件进行配置。
首先需要先由pm2命令生成生态系统文件的模板。
在当前用户目录下创建project目录进行存放生态系统文件(该位置不固定,任意目录下都可创建生态系统文件,这里只是为了方便自己管理)
创建project目录
命令:
sudo mkdir project //创建目录
ll //查看当前目录下的所有文件
文件创建完成以后进入project目录
命令:
cd project/
使用pm2命令创建pm2的生态系统文件
命令:
sudo pm2 ecosystem //创建pm2的生态系统文件样本ecosystem.config.js
查看当前目录下的文件
命令:
ll
打开样本文件查看文件内容
命令:
sudo vim ecosystem.config.js
可以看到样本文件中的基本信息。
9.3、设置配置文件
将ecosystem.config.js文件根据自己的需求进行编辑
在配置文件中apps是一个数组因此可以支持多个项目的配置,每个项目用一个json串来进行配置,项目之间用逗号隔开即可。
以下配置文件配置了之前准备的Test1和Test2两个项目
文本配置
module.exports = {
apps : [{
name: 'Test1', //进程名称(可以为启动的这个实例自定义一个名称)
script: '/opt/Test1/bin/www', //实例启动脚本路径
args: 'one two', //需要传递给脚本的所有参数的字符串
instances: 1, //当前这个实例需要启动的个数,通常用于集群
//autorestart默认为true。如果为false,当应用程序崩溃或平稳结束,则PM2将不会重新启动您的应用程序
autorestart: true,
//watch默认为false,修改为true后,会启用监视和重启功能,如果文件夹或子文件夹中的文件发生更改,应用程序将重新加载
watch: false,
max_memory_restart: '1G', //如果超过指定的内存量,您的应用将重新启动
/*
//用于生产环境与开发环境的切换
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}*/
//项目日志的管理
log_date_format: 'YYYY-MM-DD HH:mm Z', //日志日期格式
error_file: '/home/aaron/project/Test1/Test1_error.log', //错误日志文件输出路径
out_file: '/home/aaron/project/Test1/Test1_out.log', //正确日志输出文件
combine_logs: true, //如果设置为true,则避免使用进程ID后缀日志文件
merge_logs: true, //combine_logs的别名
pid_file: '/home/aaron/project/Test1/Test1_pid.log' //pid日志文件路径
},
{
name: 'Test2',
script: '/opt/Test2/bin/www',
// Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
args: 'one two',
instances: 1,
autorestart: true,
watch: false,
max_memory_restart: '1G',
/*
//用于生产环境与开发环境的切换
env: {
NODE_ENV: 'development'
},
env_production: {
NODE_ENV: 'production'
}*/
//项目日志的管理
log_date_format: 'YYYY-MM-DD HH:mm Z', //日志日期格式
error_file: '/home/aaron/project/Test2/Test2_error.log', //错误日志文件输出路径
out_file: '/home/aaron/project/Test2/Test2_out.log', //正确日志输出文件
combine_logs: true, //如果设置为true,则避免使用进程ID后缀日志文件
merge_logs: true, //combine_logs的别名
pid_file: '/home/aaron/project/Test2/Test2_pid.log' //pid日志文件路径
}
],
deploy : {
production : {
user : 'node',
host : '212.83.163.1',
ref : 'origin/master',
repo : 'git@github.com:repo.git',
path : '/var/www/production',
'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
}
}
};
9.4、使用生态系统文件静启动项目
文件配置完成以后就可以启动项目了,但是使用pm2的生态系统文件进行启动时,我们需要启动的不是某个具体的项目而是启动配置完成的这个生态系统文件
命令:
sudo pm2 start ecosystem.config.js
执行完成这个命令以后,系统会先找相关的日志文件,没有的会先进行创建。
因为日志文件也配置在了当前目录下,查看当前目录下的文件,接着进行启动项目。
命令:
ll
项目启动完成测试访问
在浏览器中访问Test1项目监听的是3000端口
访问成功,Test1项目正常运行
在浏览器中访问Test1项目监听的是3001端口
访问成功,Test2项目正常运行
9.4、配置文件中pm2的可用属性
可以使用以下属性微调应用程序行为和配置:
一般
领域 | 类型 | 例 | 描述 |
name | (string) | “my-api” | 应用程序名称(默认为脚本文件名,没有扩展名) |
script | (string) | ”./api/app.js” | 脚本路径相对于pm2开始 |
cwd | (string) | “/var/www/” | 应用程序将从中启动的目录 |
args | (string) | “-a 13 -b 12” | 包含通过CLI传递给脚本的所有参数的字符串 |
interpreter | (string) | “/usr/bin/python” | 解释器绝对路径(默认为节点) |
interpreter_args | (string) | ”–harmony” | 传递给解释器的选项 |
node_args | (string) |
| 别名为interpreter_args |
高级功能
领域 | 类型 | 例 | 描述 |
instances | number | -1 | 要启动的应用实例数 |
exec_mode | string | “cluster” | 模式启动你的应用程序,可以是“集群”或“分叉”,默认分叉 |
watch | boolean or [] | true | 启用监视和重启功能,如果文件夹或子文件夹中的文件发生更改,您的应用程序将重新加载 |
ignore_watch | list | [”[\/\\]\./”, “node_modules”] | 通过监视功能忽略某些文件或文件夹名称的正则表达式列表 |
max_memory_restart | string | “150M” | 如果超过指定的内存量,您的应用将重新启动。人性化格式:可以是“10M”,“100K”,“2G”等...... |
env | object | {“NODE_ENV”: “development”, “ID”: “42”} | env将出现在您的应用中的变量 |
env_ | object | {“NODE_ENV”: “production”, “ID”: “89”} | 注入 在做pm2时重启app.yml --env |
source_map_support | boolean | true | 默认为true,[启用/禁用源映射文件] |
instance_var | string | “NODE_APP_INSTANCE” | 有一个NODE_APP_INSTANCE环境变量用于区分进程 |
日志文件
领域 | 类型 | 例 | 描述 |
log_date_format | (string) | “YYYY-MM-DD HH:mm Z” | 日志日期格式 |
error_file | (string) |
| 错误文件路径(默认为$ HOME / .pm2 / logs / XXXerr.log) |
out_file | (string) |
| 输出文件路径(默认为$ HOME / .pm2 / logs / XXXout.log) |
combine_logs | boolean | true | 如果设置为true,则避免使用进程ID后缀日志文件 |
merge_logs | boolean | true | combine_logs的别名 |
pid_file | (string) |
| pid文件路径(默认为$ HOME / .pm2 / pid / app-pm_id.pid) |
控制流
领域 | 类型 | 例 | 描述 |
min_uptime | (string) |
| 启动应用程序的最小正常运行时间 |
listen_timeout | number | 8000 | 如果应用没有监听,强制重新加载之前的时间以毫秒为单位 |
kill_timeout | number | 1600 | 发送最后一个SIGKILL之前的时间(以毫秒为单位) |
wait_ready | boolean | false | 而不是重新加载等待listen事件,等待process.send('ready') |
max_restarts | number | 10 | 在您的应用程序被视为错误并停止重新启动之前连续不稳定重启次数(小于1秒间隔或通过min_uptime的自定义时间)your app is considered errored and stop being restarted |
restart_delay | number | 4000 | 在重新启动崩溃的应用程序之前等待的时间(以毫秒为单位)。默认为0。 |
autorestart | boolean | false | 默认为true。如果为false,如果应用程序崩溃或平稳结束,则PM2将不会重新启动您的应用程序 |
cron_restart | string | “1 0 * * *” | 重新启动应用程序的cron模式。必须运行应用程序才能使cron功能正常运行 |
vizion | boolean | false | 默认为true。如果为false,则PM2将在没有vizion功能的情况下启动(版本控制元数据) |
post_update | list | [“npm install”, “echo launching the app”] | 从Keymetrics仪表板执行拉/升级操作后将执行的命令列表 |
force | boolean | true | 默认为false。如果为true,则可以多次启动相同的脚本,这通常是PM2不允许的 |
部署
条目名称 | 类型 | 默认 | 描述 |
key | String | $HOME/.ssh | SSH密钥路径 |
user | String |
| SSH用户 |
host | [String] |
| SSH主机 |
ssh_options | String or [String] |
| 没有命令行标志的SSH选项 |
ref | String |
| GIT远程/分支 |
repo | String |
| GIT 远程 |
path | String |
| 服务器中的路径 |
pre-setup | String |
| 预设置命令或本地计算机上脚本的路径 |
post-setup | String |
| 安装后命令或主机上脚本的路径 |
pre-deploy-local | String |
| 预部署行动 |
post-deploy | String |
| 部署后行动 |