# [PM2实用入门指南](https://www.cnblogs.com/chyingp/p/pm2-documentation.html)
## 简介 {#简介}
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单。
下面就对PM2进行入门性的介绍,基本涵盖了PM2的常用的功能和配置。
## 安装 {#安装}
全局安装,简直不能更简单。
```
npm install -g pm2
```
## 目录介绍 {#目录介绍}
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
## 入门教程 {#入门教程}
挑我们最爱的express应用来举例。一般我们都是通过`npm start`启动应用,其实就是调用`node ./bin/www`。那么,换成pm2就是
注意,这里用了`--watch`参数,意味着当你的express应用代码发生变化时,pm2会帮你重启服务,多贴心。
```
pm2 start ./bin/www --watch
```
入门太简单了,没什么好讲的。直接上官方文档:[http://pm2.keymetrics.io/docs/usage/quick-start](http://pm2.keymetrics.io/docs/usage/quick-start)
## 常用命令 {#常用命令}
### 启动 {#启动}
参数说明:
* `--watch`
:监听应用目录的变化,一旦发生变化,自动重启。如果要精确监听、不见听的目录,最好通过配置文件。
* `-i --instances`
:启用多少个实例,可用于负载均衡。如果
`-i 0`
或者
`-i max`
,则根据当前机器核数确定实例数目。
* `--ignore-watch`
:排除监听的目录/文件,可以是特定的文件名,也可以是正则。比如
`--ignore-watch="test node_modules "some scripts""`
* `-n --name`
:应用的名称。查看应用信息的时候可以用到。
* `-o --output `
`<`
`path`
`>`
:标准输出日志文件的路径。
* `-e --error `
`<`
`path`
`>`
:错误输出日志文件的路径。
* `--interpreter `
`<`
`interpreter`
`>`
:the interpreter pm2 should use for executing app \(bash, python...\)。比如你用的coffee script来编写应用。
完整命令行参数列表:[地址](http://pm2.keymetrics.io/docs/usage/quick-start/#options)
```
pm2 start app.js --watch -i 2
```
### 重启 {#重启}
```
pm2 restart app.js
```
### 停止 {#停止}
停止特定的应用。可以先通过`pm2 list`获取应用的名字(--name指定的)或者进程id。
```
pm2 stop app_name|app_id
```
如果要停止所有应用,可以
```
pm2 stop app_name|app_id
```
### 删除 {#删除}
类似`pm2 stop`,如下
```
pm2 stop app_name|app_id
pm2 stop all
```
### 查看进程状态 {#查看进程状态}
```
pm2 list
```
### 查看某个进程的信息 {#查看某个进程的信息}
```
[root@iZ94wb7tioqZ pids]# pm2 describe 0
Describing process with id 0 - name oc-server
┌───────────────────┬──────────────────────────────────────────────────────────────┐
│ status │ online │
│ name │ oc-server │
│ id │ 0 │
│ path │ /data/file/qiquan/over_the_counter/server/bin/www │
│ args │ │
│ exec cwd │ /data/file/qiquan/over_the_counter/server │
│ error log path │ /data/file/qiquan/over_the_counter/server/logs/app-err-0.log │
│ out log path │ /data/file/qiquan/over_the_counter/server/logs/app-out-0.log │
│ pid path │ /root/.pm2/pids/oc-server-0.pid │
│ mode │ fork_mode │
│ node v8 arguments │ │
│ watch & reload │ │
│ interpreter │ node │
│ restarts │ 293 │
│ unstable restarts │ 0 │
│ uptime │ 87m │
│ created at │ 2016-08-26T08:13:43.705Z │
└───────────────────┴──────────────────────────────────────────────────────────────┘
```
## 配置文件 {#配置文件}
### 简单说明 {#简单说明}
* 配置文件里的设置项,跟命令行参数基本是一一对应的。
* 可以选择
`yaml`
或者
`json`
文件,就看个人洗好了。
* `json`
格式的配置文件,pm2当作普通的js文件来处理,所以可以在里面添加注释或者编写代码,这对于动态调整配置很有好处。
* 如果启动的时候指定了配置文件,那么命令行参数会被忽略。(个别参数除外,比如--env)
### 例子 {#例子}
举个简单例子,完整配置说明请参考[官方文档](http://pm2.keymetrics.io/docs/usage/pm2-doc-single-page/)。
```
{
"name" : "fis-receiver", // 应用名称
"script" : "./bin/www", // 实际启动脚本
"cwd" : "./", // 当前工作路径
"watch": [ // 监控变化的目录,一旦变化,自动重启
"bin",
"routers"
],
"ignore_watch" : [ // 从监控目录中排除
"node_modules",
"logs",
"public"
],
"watch_options": {
"followSymlinks": false
},
"error_file" : "./logs/app-err.log", // 错误日志路径
"out_file" : "./logs/app-out.log", // 普通日志路径
"env": {
"NODE_ENV": "production" // 环境参数,当前指定为生产环境
}
}
```
## 自动重启 {#自动重启}
前面已经提到了,这里贴命令行,更多点击[这里](http://pm2.keymetrics.io/docs/usage/watch-and-restart/#auto-restart-apps-on-file-change)。
```
pm2
start
app.js
--watch
```
这里是监控整个项目的文件,如果只想监听指定文件和目录,建议通过配置文件的`watch`、`ignore_watch`字段来设置。
## 环境切换 {#环境切换}
在实际项目开发中,我们的应用经常需要在多个环境下部署,比如开发环境、测试环境、生产环境等。在不同环境下,有时候配置项会有差异,比如链接的数据库地址不同等。
对于这种场景,pm2也是可以很好支持的。首先通过在配置文件中通过`env_xx`来声明不同环境的配置,然后在启动应用时,通过`--env`参数指定运行的环境。
### 环境配置声明 {#环境配置声明}
首先,在配置文件中,通过`env`选项声明多个环境配置。简单说明下:
* `env`
为默认的环境配置(生产环境),
`env_dev`
、
`env_test`
则分别是开发、测试环境。可以看到,不同环境下的
`NODE_ENV`
、
`REMOTE_ADDR`
字段的值是不同的。
* 在应用中,可以通过
`process.env.REMOTE_ADDR`
等来读取配置中生命的变量。
```
"env"
:
{
"NODE_ENV"
:
"production"
,
"REMOTE_ADDR"
:
"http://www.example.com/"
},
"env_dev"
:
{
"NODE_ENV"
:
"development"
,
"REMOTE_ADDR"
:
"http://wdev.example.com/"
},
"env_test"
:
{
"NODE_ENV"
:
"test"
,
"REMOTE_ADDR"
:
"http://wtest.example.com/"
}
```
### 启动指明环境 {#启动指明环境}
假设通过下面启动脚本(开发环境),那么,此时`process.env.REMOTE_ADDR`的值就是相应的[http://wdev.example.com/](http://wdev.example.com/),可以自己试验下。
```
pm2
start
app.js --env dev
```
## 负载均衡 {#负载均衡}
命令如下,表示开启三个进程。如果`-i 0`,则会根据机器当前核数自动开启尽可能多的进程。
```
pm2
start
app.js -i
3
# 开启三个进程
pm2
start
app.js -i
max
# 根据机器CPU核数,开启对应数目的进程
```
参考文档:[点击查看](http://pm2.keymetrics.io/docs/usage/cluster-mode/#automatic-load-balancing)
## 日志查看 {#日志查看}
除了可以打开日志文件查看日志外,还可以通过`pm2 logs`来查看实时日志。这点对于线上问题排查非常重要。
比如某个node服务突然异常重启了,那么可以通过pm2提供的日志工具来查看实时日志,看是不是脚本出错之类导致的异常重启。
```
pm2
logs
```
## 指令tab补全 {#指令tab补全}
运行`pm2 --help`,可以看到`pm2`支持的子命令还是蛮多的,这个时候,自动完成的功能就很重要了。
运行如下命令。恭喜,已经能够通过tab自动补全了。细节可参考[这里](http://pm2.keymetrics.io/docs/usage/auto-completion/)。
```
pm2 completion
install
source
~/.bash_profile
```

## 开机自动启动 {#开机自动启动}
可以通过`pm2 startup`来实现开机自启动。细节可[参考](http://pm2.keymetrics.io/docs/usage/startup/)。大致流程如下
1. 通过
`pm2 save`
保存当前进程状态。
2. 通过
`pm2 startup [platform]`
生成开机自启动的命令。(记得查看控制台输出)
3. 将步骤2生成的命令,粘贴到控制台进行,搞定。
## 传入node args {#传入node-args}
直接上例子,分别是通过命令行和配置文件。
命令行:
```
pm2
start
app.js --node-args=
"--harmony"
```
配置文件:
```
{
"
name
"
:
"oc-server"
,
"
script
"
:
"app.js"
,
"
node_args
"
:
"--harmony"
}
```
### 实例说明 {#实例说明}
假设是在`centos`下,那么运行如下命令,搞定。强烈建议运行完成之后,重启机器,看是否设置成功。
```
[root
@iZ94wb7tioqZ
option_analysis]
# pm2 save
[root
@iZ94wb7tioqZ
option_analysis]
# pm2 startup centos
[
PM2
]
Generating
system init script
in
/etc/init.d/pm2-init.sh
[
PM2
]
Making
script booting at startup...
[
PM2
] /
var
/lock/subsys/pm2-init.sh lockfile has been added
[
PM2
] -centos-
Using
the
command
:
su -c
"chmod +x /etc/init.d/pm2-init.sh; chkconfig --add pm2-init.sh"
[
PM2
]
Done
.
[root
@iZ94wb7tioqZ
option_analysis]
# pm2 save
[
PM2
]
Dumping
processes
```
## 远程部署 {#远程部署}
可参考官方文档,配置也不复杂,用到的时候再来填写这里的坑。TODO
官方文档:[http://pm2.keymetrics.io/docs/usage/deployment/\#getting-started](http://pm2.keymetrics.io/docs/usage/deployment/#getting-started)
## 监控\(monitor\) {#监控monitor}
运行如下命令,查看当前通过pm2运行的进程的状态。
```
pm2
monit
```
看到类似输出
```
[root@oneday-dev0 server]
# pm2 monit
⌬
PM2
monitoring (
To
go further check
out
https:
//app.keymetrics.io)
[ ]
0
%
⌬
PM2
monitoring (
To
go further check o[||||||||||||||| ]
196.285
MB
● fis-receiver [ ]
0
%
[
1
] [fork_mode] [||||| ]
65.773
MB
● www [ ]
0
%
[
2
] [fork_mode] [||||| ]
74.426
MB
● oc-server [ ]
0
%
[
3
] [fork_mode] [|||| ]
57.801
MB
● pm2-http-
interface
[ ] stopped
[
4
] [fork_mode] [ ]
0
B
● start-production
[
5
] [fork_mode]
```
## 内存使用超过上限自动重启 {#内存使用超过上限自动重启}
如果想要你的应用,在超过使用内存上限后自动重启,那么可以加上`--max-memory-restart`参数。(有对应的配置项)
```
pm2
start
big-array.js --
max
-memory-restart
20
M
```
## 更新pm2 {#更新pm2}
官方文档:[http://pm2.keymetrics.io/docs/usage/update-pm2/\#updating-pm2](http://pm2.keymetrics.io/docs/usage/update-pm2/#updating-pm2)
```
$
pm2 save
# 记得保存进程状态
$
npm install pm2 -g
$
pm2 update
```
## pm2 + nginx {#pm2-nginx}
无非就是在nginx上做个反向代理配置,直接贴配置。
```
upstream
my_nodejs_upstream {
server
127.0.0.1:3001
;
}
server
{
listen
80
;
server_name
my_nodejs_server;
root
/home/www/project_root;
location
/ {
proxy_set_header
X-Forwarded-For
$proxy_add_x_forwarded_for
;
proxy_set_header
Host
$http_host
;
proxy_set_header
X-NginX-Proxy
true
;
proxy_http_version
1
.
1
;
proxy_set_header
Upgrade
$http_upgrade
;
proxy_set_header
Connection
"upgrade"
;
proxy_max_temp_file_size
0
;
proxy_pass
http://my_nodejs_upstream/
;
proxy_redirect
off
;
proxy_read_timeout
240s
;
}
}
```
官方文档:[http://pm2.keymetrics.io/docs/tutorials/pm2-nginx-production-setup](http://pm2.keymetrics.io/docs/tutorials/pm2-nginx-production-setup)
## 在线监控系统 {#在线监控系统}
收费服务,使用超级简单,可以方便的对进程的服务情况进行监控。可以试用下,地址在[这里](https://app.keymetrics.io/)。
这里贴个项目中试用的截图。

## pm2编程接口 {#pm2编程接口}
如果想把pm2的进程监控,跟其他自动化流程整合起来,pm2的编程接口就很有用了。细节可参考官方文档:
[http://pm2.keymetrics.io/docs/usage/pm2-api/](http://pm2.keymetrics.io/docs/usage/pm2-api/)
## 模块扩展系统 {#模块扩展系统}
pm2支持第三方扩展,比如常用的log rotate等。可参考[官方文档](http://pm2.keymetrics.io/docs/advanced/pm2-module-system/)。
[https://www.cnblogs.com/chyingp/p/pm2-documentation.html](https://www.cnblogs.com/chyingp/p/pm2-documentation.html)
- 首页
- pm2
- pm2
- pm2 离线安装
- pm2 使用指南
- node
- 正则
- web
- webpack
- 配置
- 优化代码体积
- plugin-proposal-decorators
- webpack 打包原理解析
- babel presets配置 babel7
- 配置路径别名
- 去除开发中的警告信息
- css
- 滚动条
- input自动填充背景色
- 颜色渐变
- scss
- 网页定制光标
- 超出文本显示省略号。。。
- calc兼容性写法
- box-sizing
- clip-path
- 苹果手机页面滑动卡顿
- 字体间距根据父级宽度自适应
- 纯css动态效果
- 清除浮动的三种方法
- 按钮增加闪烁效果
- 字体渐变
- react
- mobx
- 路由
- antd 表格在safari上卡顿
- 项目初始化
- react-antd-mobx-momnet
- 显示字符串中的标签
- antd Select 在搜索精准度
- 路由切换动态过渡效果
- css中图片打包后的路径出错
- antd upload 无法及时更新state
- antd DatePicker设置中文失败
- antd-pro 添加登录页面报错
- new Array创建新数组数据指向相同
- react 页面刷新渲染两次
- useEffect
- Hooks 闭包解决方案
- hooks 方法封装
- Plugin "react" was conflicted between "package.json » eslint-config-react-app
- javascript
- canvas
- 多张图片合成一张
- 排序
- js比较符号==、===
- 运动函数封装(简易、通用)
- 导出表格(excel )
- react使用demo
- xlsx导出excel
- js获取屏幕高度宽度
- toFixed 函数修改
- 获取cookie,url参数
- 奇怪的错误问题
- copy(深拷贝 浅拷贝)
- 导出pdf
- 解决图片失真
- 判断字符串长度(带中文)
- js中 文件、图片二进制和base64的互转
- 读取深度嵌套的json数据
- 手动实现Promise.all
- cookie 删除
- webpack 打包过后的文件报错 regeneratorRuntime is not defined
- 防抖与节流
- react hooks 中使用防抖节流
- 图片懒加载
- 重排和重绘
- 修复部分无法JASON.parse的数据
- react-native
- android-studio 打开调试工具
- 适配全面屏
- node
- 服务端 node + nginx 反向代理
- 生成文件夹目录列表
- mogodb常用操作
- 发布npm包
- cli工具
- 上传文件
- nodejs使用crypto进行加密/解密操作
- mongodb 加入验证之后连接失败
- nextjs使用问题
- node转发http请求
- mongodb 导入导出 备份
- node-sass 安装问题、安装失败等
- npm yarn 安装依赖太慢
- puppeteer 安装问题 centos
- mongoose
- 其他
- 禁止浏览器缓存
- chrome平滑滚动
- pdf预览
- 问题整理
- 资料
- 小程序
- fetch
- cookie 设置跨域资源共享
- taro 小程序
- taro request
- 设置npm镜像
- esbuild the service is no longer running
- 离线地图
- uniapp 转 vue-cli
- 工具
- Excel表格密码保护的解除方法
- vscode(插件)
- vscode 常用代码片段
- vscode 开启tab补全代码
- mac 百度网盘破解
- mysql 重置密码
- chrome 好用的扩展
- Mac/Linux/Windows通过命令调用浏览器打开某网页
- 小链接
- 数据库
- mongo
- sql文件导入
- join 用法
- sql 时间格式化 DATE_FORMAT
- 创建全文检索并分词查询
- 阿里云node-mysql 操作文档
- sql 时间查询
- mysql group查询结果合并为一行
- mysql 锁
- mysql count 同个字段多个结果合并到一行
- 解决Node.js mysql客户端不支持认证协议引发的“ER_NOT_SUPPORTED_AUTH_MODE”问题
- mysql 根据经纬度计算距离
- PHP
- 文件读取
- 接收前端json数据
- 自定义排序
- session 写入失败无法保存
- php 上传大文件$_FILES为空
- base64转图片
- composer.phar 安装东西太慢 切换国内镜像
- laravel sql查询记录
- 解决: Please provide a valid cache path.
- thinkphp开启多应用
- 上传文件报错 Filename cannot be empty
- php curl 报错 curl: (35) SSL connect error
- App
- android未授权错误(Flutter)
- uniapp
- 服务端
- mongodb 定时备份
- mysql 错误
- nginx 转发网络请求
- midwayjs 使用egg-mysql
- https 无法访问
- egg 配置跨域
- 算法实现
- 排序
- 全排列
- 无重复字符的最长子串
- 反转单向链表
- 斐波那契数列
- 有效的括号
- GIT
- git克隆大文件
- 面试整理
- 前端整理
- 大厂高级前端面试题
- 三年大厂面试题
- 面试经验
- 头条it技术工程师
- 每日学习
- 常见的数据结构
- 面试地址汇总
- 练习汇总
- 前端八股文
- mac环境配置
- mac nginx重启报错
- mac 安装redis
- fis配置
- 切换php版本
- Mac OS X下的Oh-My-ZSH安装与配置
- mac 查看端口进程 停止进程
- mac 配置ssh 免密码登录服务器
- navigate 中文破解
- 删除启动台无效文件夹
- 删除顶部图标(卸载后的软件还存在)
- 修复mac 下安装全局依赖失效
- navicate 完美破解 内有下载地址
- nginx 报错 500 "/usr/local/var/run/nginx/client_body_temp/0000000004" failed (13: Permission denied)
- 安装PHP redis扩展
- 安装zsh后 nvm node命令失效
- python
- python 在vscode中编辑,格式化文件总是提示There is no Pip installer available in the selected environment.
- 杂项
- 膝盖修复
- 微信打开网页链接反应巨慢
- chrome 显示http/https完整连接
- doracms
- pdfjs 中文无法显示
- docker
- go
- 指针、指针地址* &
- 脚本
- 京东疯狂的joy脚本
- 2021京东炸年兽
- LINUX
