使用PM2守护PHP命令行程序(socket聊天室服务端)
实例:使用pm2守护启动socket进程,作为聊天室的服务端。聊天室详见:[http://socket.gqz666.cn](http://socket.gqz666.cn)
安装
--
```
npm install pm2 -g
```
使用
--
### 启动
- 启动php文件
```
pm2 start app.php
```
启动完成后会输出
```
┌───────────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App name │ id │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ watching │
├───────────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ app.php │ 5 │ fork │ 30996 │ online │ 0 │ 104s │ 0% │ 16.2 MB │ disabled │
└───────────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘
```
id为pm2中管理进程使用的标识 进程死掉之后pm2会自动重启
### 查看进程详情
```
pm2 describe 5
```
### 停止进程
```
pm2 stop 5
```
### 进程列表
```
pm2 list
```
### 进程资源监控
```
pm2 monit
```
### 停止所有进程
```
pm2 stop all
```
### 删除所有进程
```
pm2 delete all
```
### 查看进程输出
```
pm2 logs <span class="hljs-meta">[</span>id]
```
不传入id时显示所有日志,否则显示指定进程日志
### 使用配置文件启动
pm2 强大之处在于其支持任意程序的守护,使用配置文件来启动程序比使用命令行启动更加清晰:
```
{<span>
</span><span class="hljs-attr">"name"</span>: <span class="hljs-string">"delay-message"</span>,<span>
</span><span class="hljs-attr">"args"</span>: <span class="hljs-string">"task/delaymessage"</span>,<span>
</span><span class="hljs-attr">"script"</span>: <span class="hljs-string">"yii"</span>,<span>
</span><span class="hljs-attr">"exec_interpreter"</span>: <span class="hljs-string">"php"</span>,<span>
</span><span class="hljs-attr">"exec_mode"</span>: <span class="hljs-string">"fork"</span>,<span>
</span><span class="hljs-attr">"max_memory_restart"</span>: <span class="hljs-string">"100M"</span><span>
</span>}<span>
</span>
```
- name 脚本显示名称
- args 脚本参数
- script 脚本文件名称
- exec\_interpreter 使用的解析器
- exec\_mode 启动模式,fork为使用子进程启动,cluster 使用nodejs的cluster模块启动
- max\_memory\_restart 进程占用内存超过时自动重启
pm2 相关命令和说明
**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
**自定义启动文件**
创建一个test.json的示例文件,格式如下:
{
"apps":
{
"name": "test",
"cwd": "/data/wwwroot/nodejs",
"script": "./test.sh",
"exec\_interpreter": "bash",
"min\_uptime": "60s",
"max\_restarts": 30,
"exec\_mode" : "cluster\_mode",
"error\_file" : "./test-err.log",
"out\_file": "./test-out.log",
"pid\_file": "./test.pid"
"watch": false
}
}
说明:
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会自动重载。这里也可以设置你要监控的文件。
<font color="#ff0000">附加资料</font>
1.支持js和ylm文件,js示例如下,[相关资料](http://pm2.keymetrics.io/docs/usage/application-declaration/)
```
module.exports = {
apps :<span class="hljs-meta"> [{
name : "worker",//应用名称
script : "./worker.js", //脚本路径相对于pm2开始
watch : true, //开启监察,文件改变自动重启
env: {
"PORT": 3000,
"NODE_ENV": "development",
},
env_production : {
"PORT": 80
"NODE_ENV": "production"
}
},{
name : "api-app",
script : "./api.js",
cwd : "/home/www/project_root/current",//
"error_file": "./logs/app.err.log",
"out_file": "./logs/app.out.log",
"log_date_format" : "YYYY-MM-DD HH:mm Z"
instances : 4, // 实例(多核)
exec_mode : "cluster" // 集群模式
}]</span>
}
```
2.开机自启 nodejs 服务器
```
启动想开机启动的项目 pm2 start app.js
保存 pm2 save
开机设置 pm2 startup centos
chmod +x /etc/init.d/pm2-init.sh
chkconfig –add pm2-init.sh
```
3.清除(pm2 flush)与重载日志(pm2 `reloadLogs`)
4.[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate) 进行日志分割
<div>普通日志,错误日志。这两个日志文件,如果pm2管理5个服务,那么该文件夹下总共有10个日志文件,并且随着时间不断增加,很容易就会产生很多个上g的日志文件,导致了服务器的磁盘空间不足的问题。</div>解决方法:
1. 合并日志: 将所有服务的日志合并到一个日志文件中
2. 循环回滚保存 : 可以选择1小时保存一份版本并且压缩,合并日志清空,重新记录
3. 利用错误收集系统,保证服务的错误正常收集
在pm2的配置文件中加入以下配置项
```
output: '/root/.pm2/logs/out.log',
error: '/root/.pm2/logs/error.log',
merge_logs: true
```
安装pm2-logrotate
```
pm2 install pm2-logrotate
```
查看默认配置
```
pm2 conf
```
```
max_size (Defaults to 10M): 配置项默认是 10MB,并不意味着切割出来的日志文件大小一定就是 10MB,而是检查时发现日志文件大小达到 max_size,则触发日志切割。
retain (Defaults to 30 file logs): 这个数字是在任何一个时间保留已分割的日志的数量,这意味着如果您保留7个,那么您将最多有7个已分割日志和您当前的一个
compress (Defaults to false): 对所有已分割的日志启用 gzip 压缩
dateFormat (Defaults to YYYY-MM-DD_HH-mm-ss) : 文件名格式化的规则
rotateModule (Defaults to true) : 像其他应用程序一样分割 pm2模块的日志
workerInterval (Defaults to 30 in secs) : 您可以控制工作线程检查日志大小的间隔(最小值为1)单位为秒(控制模块检查log日志大小的循环时间,默认30s检查一次)
rotateInterval (Defaults to 0 0 * * * everyday at midnight): 多久备份一次,默认值是0 0 * * *,意思是每天晚上0点分割
```
切割配置
```
pm2 set pm2-logrotate:max_size 500K
pm2 set pm2-logrotate:retain 7
pm2 set pm2-logrotate:compress true
pm2 set pm2-logrotate:workerInterval 60
```
使其生效
```
pm2 restart all
或者
pm2 update
```
使用[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate)进行日志管理使得我们的node服务的log以及pm2的log能够得到控制,防止log过多导致把磁盘刷爆。[pm2-logrotate](https://github.com/pm2-hive/pm2-logrotate)
配置看官网。
配置循环回滚策略

```
pm2 set pm2-logrotate:rotateInterval '* * */1 * *' //每小时备份
pm2 set pm2-logrotate:compress true //压缩
pm2 set pm2-logrotate:retain 3 //备份最多3份,也就是备份最进3小时的日志
```
需要注意的是设置retain参数,来限制日志文件数
参考地址:[https://www.ddhigh.com/node/2016/12/22/pm2-daemon-php-cli.html](https://www.ddhigh.com/node/2016/12/22/pm2-daemon-php-cli.html)
[http://blog.csdn.net/hsany330/article/details/51260792](http://blog.csdn.net/hsany330/article/details/51260792)
[https://www.jianshu.com/p/54bc346d2406](https://www.jianshu.com/p/54bc346d2406)
评论区