使用PM2守护PHP命令行程序(socket聊天室服务端)

2018-01-02 12:03:14 查看 2746 回复 0

实例:使用pm2守护启动socket进程,作为聊天室的服务端。聊天室详见:http://socket.gqz666.cn

安装

npm install pm2 -g

使用

启动

  • 启动php文件
pm2 start app.php

启动完成后会输出

┌───────────────┬────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬──────────┐
│ App nameidmodepidstatusrestartuptimecpumemwatching │
├───────────────┼────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼──────────┤
│ app.php       │ 5  │ fork │ 30996 │ online │ 0       │ 104s   │ 0%  │ 16.2 MBdisabled │
└───────────────┴────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴──────────┘

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 进行日志分割

普通日志,错误日志。这两个日志文件,如果pm2管理5个服务,那么该文件夹下总共有10个日志文件,并且随着时间不断增加,很容易就会产生很多个上g的日志文件,导致了服务器的磁盘空间不足的问题。

解决方法:

  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进行日志管理使得我们的node服务的log以及pm2的log能够得到控制,防止log过多导致把磁盘刷爆。pm2-logrotate

配置看官网。

配置循环回滚策略

zzz

 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