Skip to main content

pm2

介绍

PM2 是一个带有负载均衡功能的Node应用的进程管理器。当你要把你的独立代码利用全部的服务器上的所有CPU, 并保证进程永远都活着,0秒的重载,PM2是比较合适的。

常用功能如下:

  • 让node.js项目 能在文件更新时自动重启;自带热部署 - - - 当源文件更新 线上项目也会自动重启
  • 让node.js项目 能在服务器异常重启后也能自动启动;
  • 后台运行 - - - 不会占用实时窗口 会在后台运行
  • 日志系统,修改调整日志输出格式,加上时间前缀等;
  • 让node.js项目 部署在多台远程服务器上,且能实现项目版本自动更新发布等自动化操作;
  • 内置负载均衡 - - - 在cluster模式会自动使用轮询的方式达到负载均衡的效果,让 node.js项目 不改变代码的情况下,开启多个进程提升服务性能,还能让进程间实现负载均衡
  • 服务信息查看 - - - 查看运行中程序的各项信息

使用

npm install -g pm2
pm2 ls # 查看所有进程
pm2 stop xx # 停止某进程
pm2 start xx # 启动某进程

更多参考: https://pm2.keymetrics.io/

$ pm2 start [项目入口文件名]
例:
pm2 start serve.js

也可以在后面添加一些参数 来附加一些效果:

--watch // --watch 监听程序源文件的变化 一旦发生变化自动重启 (热启动效果)
--ignore-watch // 排除监听的目录或者文件 支持正则表达式
-n --name // 设置程序的名称
--log // 指定日志文件
--max-memory-restart [100MB] // 设置最大占用内存
--no-daemon // 非进程守护模式启动
--no-autorestart // 关闭自动重启
--time // 日志添加时间前缀
-e --error [path] // 错误日志输出路径
-i [n] // cluster mode 模式启动n个进程实例
-i max // 集群模式 将会检测cpu的数量并运行尽可能多的进程 自动开启负载均衡的效果
// serve.js
var http = require("http")
//创建服务器
http.createServer((req, res) => {
res.writeHead(200, { "Content-Type": "text/html;charset=utf-8" }) //设置响应头
res.write(`
<html>
<div>hello pm2</div>
</html>
`)
res.end()
}).listen(3000, () => {
console.log("server start")
})

可以看到命令行输出了以下信息 这是这个简单服务器程序的一些基础运行信息,这时即使关闭终端,这个程序仍然会在后套继续运行

可以启动多个这样的任务 可以通过以下命令查看所有的运行程序信息

// 查看所有使用pm2运行的程序信息
$ pm2 list

pm2常用命令

1.停止进程

// 停止指定的进程
$ pm2 stop [进程名] | [进程id]
// 停止所有的进程
$ pm2 stop all # 停止所有的应用程序

2.删除进程

// 删除指定的进程
$ pm2 delete [进程名] | [进程id]
// 删除所有进程
$ pm2 delete all
// 杀死pm2的守护进程 同时也会杀死所有进程
$ pm2 kill

3.重启进程

// 以下两个命令都可以达到重启进程的效果
$ pm2 restart [进程名] | [进程id] // 重启效果 短时间内进程无效
$ pm2 reload [进程名] | [进程id] // 重载效果 会保持进程在线

// 重启所有进程
$ pm2 reload all
// 重置重启数量
$ pm2 reset [进程名]

4.查看所有进程

// 以下三个命令都可以查看所有进程
$ pm2 list
$ pm2 ls
$ pm2 status

5.查看某一个进程的信息

$ pm2 show [进程名] | [进程id]

6.查看日志

// 查看所有的日志
$ pm2 logs
// 查看指定的进程日志
$ pm2 logs [进程名] | [进程id]
// 清空所有日志
$ pm2 flush

// 还可以附加一些参数 附加功能
--line [数字] // 查看最后多少条日志 默认是15条
--err // 只查看错误日志
--timestamp // 时实日志附带时间前缀

6.监控所有的进程

// 会进入一个信息面板
$ pm2 monit

5.pm2配置文件

$ pm2 ecosystem  // 当前目录下自动生成pm2的配置文件

// 以配置文件启动
$ pm2 start ecosystem.config.js --env production

pm2配置实例:

package.json

{
"name": "boter-server",
"version": "0.0.1",
"private": true,
"scripts": {
"start": "pm2 start ecosystem.config.js --env production",
"stop": "pm2 stop ecosystem.config.js --env production",
"restart": "pm2 restart ecosystem.config.js --env production",
"reload": "pm2 reload ecosystem.config.js --env production"
},

ecosystem.config.js

module.exports = {
apps: [
{
name: 'crawler-kline',
script: './index.js',
watch: false,
node_args: '-r tsconfig-paths/register', // node的启动模式
instances: 1, //将应用程序分布在所有CPU核心上,可以是整数或负数
// instances: 'max',
// instance_var: 'INSTANCE_ID',
log_date_format: 'YYYY-MM-DD HH:mm:ss',
exec_mode: 'cluster',
env: {
NODE_ENV: 'development',
},

env_prerelease: {
NODE_ENV: 'prerelease',
// PORT: 5001,
// 执行定时任务的 ip
HOST: '127.0.0.1',
},
env_test: {
NODE_ENV: 'test',
// PORT: 5001,

// 执行定时任务的 ip
HOST: 'xxxxxx',
},
env_production: {
NODE_ENV: 'production',
// PORT: 5001,

// 执行定时任务的 ip
HOST: 'xxxxx',
},
},
],
}