使用PM2守护PHP命令行程序(socket聊天室服务端)
实例:使用pm2守护启动socket进程,作为聊天室的服务端。聊天室详见: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 [id]
不传入id时显示所有日志,否则显示指定进程日志
使用配置文件启动
pm2 强大之处在于其支持任意程序的守护,使用配置文件来启动程序比使用命令行启动更加清晰:
{
"name": "delay-message",
"args": "task/delaymessage",
"script": "yii",
"exec_interpreter": "php",
"exec_mode": "fork",
"max_memory_restart": "100M"
}
- 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会自动重载。这里也可以设置你要监控的文件。
附加资料
1.支持js和ylm文件,js示例如下,相关资料
module.exports = {
apps : [{
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" // 集群模式
}]
}
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 进行日志分割
解决方法:
- 合并日志: 将所有服务的日志合并到一个日志文件中
- 循环回滚保存 : 可以选择1小时保存一份版本并且压缩,合并日志清空,重新记录
- 利用错误收集系统,保证服务的错误正常收集
在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进行日志管理使得我们的node服务的log以及pm2的log能够得到控制,防止log过多导致把磁盘刷爆。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
http://blog.csdn.net/hsany330/article/details/51260792
https://www.jianshu.com/p/54bc346d2406