rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • 前端

    • JavaScript
    • html
    • css
    • 微信小程序
  • 服务端

    • node
    • nvm
    • npm
    • pm2

pm2

基本信息

pm2官网| pm2文档

https://pm2.fenxianglu.cn/docs/start/

pm2 是基于nodejs开发的进程管理器,适用于后台常驻脚本管理,同时对node网络应用有自建负载均衡功能。官方的说法,pm2 是一个带有负载均衡功能的Node应用的进程管理器,个人认为,并不准确,因为pm2支持多种语言,只是对于除node之外的其他进程无负载均衡的能力。

安装

$ 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

更新

$ pm2 save # 记得保存进程状态
$ npm install pm2 -g
$ pm2 update

常用命令

启动

参数说明

--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来编写应用。
$ pm2 start app.js --watch -i 2 # 加 --watch 自动重启

进程管理

$ pm2 start app.js -i 4          # 后台运行pm2,启动4个app.js 
                                 # 也可以把'max' 参数传递给 start
                                 # 正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 restart app.js             # 重启指定的进程名
$ pm2 restart 0                  # 重启指定的进程
$ pm2 restart all                # 重启所有进程
$ pm2 reload 0                   # 重启指定的进程
$ pm2 reload all                 # 0 秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0                     # 停止指定的进程
$ pm2 stop all                   # 停止所有进程
$ pm2 delete 0                   # 杀死指定的进程
$ pm2 delete all                 # 杀死全部进程
$ pm2 list                       # 显示所有进程状态
$ pm2 monit                      # 监视所有进程
$ pm2 logs                       # 显示所有进程日志
$ pm2 startup                    # 产生 init 脚本 保持进程活着
$ pm2 web                        # 运行健壮的 computer API endpoint (http://localhost:9615)

负载均衡

命令如下,表示开启三个进程。如果-i 0,则会根据机器当前核数自动开启尽可能多的进程。

$ pm2 start app.js -i 3 # 开启三个进程
$ pm2 start app.js -i max # 根据机器CPU核数,开启对应数目的进程 

指令tab补全

$ pm2 completion install
$ source ~/.bash_profile

开机自动启动

可以通过pm2 startup来实现开机自启动。细节可参考。大致流程如下

  1. 通过 pm2 save 保存当前进程状态。
  2. 通过pm2 startup [platform] 生成开机自启动的命令。
  3. 将步骤2生成的命令,粘贴到控制台进行。

传入node args

命令行

pm2 start app.js --node-args="--harmony"

配置文件

{
  "name" : "oc-server",
  "script" : "app.js",
  "node_args" : "--harmony"
}

内存使用超过上限自动重启

如果想要你的应用,在超过使用内存上限后自动重启,那么可以加上 --max-memory-restart 参数。

$ pm2 start big-array.js --max-memory-restart 20M

Nginx as a HTTP proxy

就是在nginx上做个反向代理配置

upstream my_nodejs_upstream {
    server 127.0.0.1:3001;
    keepalive 64;
}

server {
    listen 443 ssl;
    
    server_name www.my-website.com;
    ssl_certificate_key /etc/ssl/main.key;
    ssl_certificate     /etc/ssl/main.crt;
   
    location / {
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    	proxy_set_header Host $http_host;
        
    	proxy_http_version 1.1;
    	proxy_set_header Upgrade $http_upgrade;
    	proxy_set_header Connection "upgrade";
        
    	proxy_pass http://my_nodejs_upstream/;
    	proxy_redirect off;
    	proxy_read_timeout 240s;
    }
}

fork与cluster启动模式

pm2启动进程的支持两种模式:fork与cluster,对于了解node的人知道,node的多进程编程api: child_process.fork与cluster。关于pm2的fork与cluster两者的本质区别,个人认为就是node API的child_process.fork与cluster的区别,stackoverflow有关于这个问题的讨论。下面做个粗浅的归纳:

  1. cluster是fork的派生,cluster支持所有cluster拥有的特性。

  2. fork不支持socket地址端口复用,cluster支持地址端口复用。因为只有node的cluster模块支持socket选项SO_REUSEADDR。

  3. fork不可以启动多个实例进程,cluster可以启动多个实例。但node的child_process.fork是可以实现启动多个进程的,但是为什么没有实现呢?就个人理解,node多为提供网络服务,启动多个实例需要地址端口复用,此时便可使用cluster模式实现,但fork模式并不支持地址端口复用,多实例进程启动会产生异常错误。但对于常驻任务脚本而言,不需要提供网络服务,此时多进程启动可以实现,同时也提高了任务处理效率。对于上述需求,可以两种方式实现,一是配置app0,app1,app2方式启动多个进程,二是通过应用实例自身调用child_process.fork多进程编程实现。

  4. fork模式可以应用于其他语言,如php,python,perl,ruby,bash,coffee, 而cluster只能应用于node。

  5. fork不支持定时重启,cluster支持定时重启。定时重启也就是配置中的cron_restart配置项。github上面有作者关于fork模式下是否需要实现cron-like定时的讨论,官网文档注明说,fork模式的定时重启这个功能不久将实现。

pm2编程接口

特点

  1. 支持进程行为配置 ,即可以通过配置,实现对pm2管理应用的一些基础属性更新修改,如应用名称,启动模式等。
  2. 支持集群模式,支持负载均衡,但因采用nodejs的cluster模块实现,仅适用于nodejs进程。
  3. 支持source map,此项针对js, source map文件是js源文件的信息文件,里面存储着源文件的位置信息。
  4. 支持热重启。
  5. 支持部署工作流,pm2可依据测试环境和线上环境自动部署到不同的服务器,同时运行在不同配置下。
  6. 支持监听重启,在文件更新等情况下可实现进程自动重启。
  7. 支持linux的startup进程启动,startup是指系统boot, 进程自启动,如centos的chkconfig。
  8. 日志管理,两种日志,pm2系统日志与管理的进程日志,默认会把进程的控制台输出记录到日志中。
  9. 命令自动补全功能,个人感觉这个功能意义不大,而且尝试了一下,没有原生的linux命令自动补全反应敏捷。
  10. 监控功能,pm2 monit监控cpu和memory使用情况,keymetrics监控更为详细。
  11. 支持开发调试模式,非后台运行,pm2-dev start 。
  12. 支持pm2模块开发,实现pm2的功能扩展。
  13. keymetrics监控,比pm2 monit监控更为详细友好,通过web页面展示。
  14. 最大内存重启,设置最大内存限制,超过限制自动重启。
  15. 编程API,提供API供开发者通过编程方式灵活管理进程。

pm2 注意事项 todo

index.js 成功后,webhooks调成功了会如下图显示

如果pm2启动后状态变成error,执行 npm install pm2@latest -g

pm2 启动 index.js 启动前先在index.js目录

  1. 宝塔安装node

  2. 安装依赖

index.js 同级目录下

install http
install github-webhook-handler
install child_process
  1. 检查权限是不是www的

  2. 拷贝jsserver文件

拷贝jsserver文件
拷贝.ssh私钥公钥
拷贝wiki项目
最近更新:: 2025/10/22 15:36
Contributors: luokaiwen
Prev
npm