资料总结 资料总结
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

linghui Wu

一只努力学飞的鱼
首页
go
java
云原生
  • mysql
  • redis
  • MongoDB
  • 设计模式详解
  • 数据结构与算法
  • 前端
  • 项目
  • 理论基础
  • 运营
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • html
  • css
  • js

  • typeScript

  • icon

  • vue

  • vuepress

  • uni-app
  • node

  • node
  • 前端
  • node
wulinghui
2025-02-27
目录

pm2部署

# pm2简介

能够充分利用多核 CPU且能够负载均衡、能够帮助应用在崩溃后、指定时间(cluster model)和超出最大内存限制等情况下实现自动重启。

  • 自动重启:避免nohup 失败后就彻底的挂啦的问题。

# 使用方法

pm2 start npm --name "my-app-prod" -- run start -- --ENV=product

这里的--之后的参数会传递给你的npm脚本,因此--ENV=develop会被正确地传递 用 pm2 启动一个名称为my-app-prod。 启动指令为 npm run start --ENV=product 缺点:重复执行,会有多个my-app-prod 任务 存在 pm2 list 列表里面。

# 推荐使用方法

利用PM2的生态系统文件:

module.exports = {
    apps: [
        {
            name: 'my-app-prod',
            script: 'npm',
            exec_interpreter: 'node', // 使用 node 解释器
            exec_mode: 'cluster', // 强制使用 fork 模式(单个可以正常输出日志) ,  默认是 cluster 模式:
            log_file: './logs/combined.log',
            out_file: './logs/out.log',
            error_file: './logs/error.log',
            log_date_format: 'YYYY-MM-DD HH:mm:ss',
            args: 'run start',
            env: {
                // NODE_ENV: 'product',  // 定义环境变量。可以在${process.env.NODE_ENV}使用。
            },
            instances: 'max', // 'max' 根据 CPU 核数启动实例数量,  //1 确保只启动一个实例:建议模式为fork,也就是单线程工作。
            autorestart: true, // 自动重启。
            restartDelay: 3000,// 在这里设置重启间隔时间,例如设置为5秒(5000毫秒)
            watch: false,
            max_memory_restart: '1G',
        },
    ],
};



module.exports = {
    apps: [
        {
            name: 'tg-bot', // 应用程序的名称
            script: 'dist/index.js', // 要运行的脚本文件
            instances: '1', // 实例数量。'max'表示使用所有CPU核心数
            exec_mode: 'cluster', // 运行模式,此处为集群模式
            increment_var: 'PORT', // 在集群模式下递增的端口变量名
            // 在这里设置重启间隔时间,例如设置为5秒(5000毫秒)
            restartDelay: 3000,
            env: {
                NODE_ENV: 'product', // 设置环境变量,此处为生产环境
            },
            watch: true, // 是否监视文件变化,如果文件发生变化,pm2会重新加载应用程序
            ignore_watch: ["logs/*.log"], // 指定要忽略的文件或文件夹的匹配模式。这样可以排除日志文件或其他不希望触发重启的文件,否则会一直重启服务。
            // 合并日志输出到单一文件。  必须指定否则合并没有用。
            log       : './logs/combined.log',
            merge_logs: true, // 这一行确保了stdout和stderr被合并
            log_date_format: 'YYYY-MM-DD HH:mm:ss.SSS', // 将输出时间格式化的日志,否则就没有对应时间输出。
        },
    ],
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

以上定义:集群模式,将产生多个实例,并存在服务器上。
使用:
pm2 start ecosystem.config.js

如果修改代码再次用pm2 start就行。

# pm2-cluster集群模式示例代码 (opens new window)

// pm2.config.js
module.exports = {
  apps: [
    {
      script: "httpServer.js",
      instances: "4",
      exec_mode: "cluster",
    },
  ],
};
1
2
3
4
5
6
7
8
9
10

# 部署过程中遇到的问题。

  • ecosystem.config.js 更改不生效的问题。

需要 pm2 delete my-app-prod , 再 start

  • 端口冲突的问题

需要先 pm2 stop xxx , 再delete ,再start .

  • 抱错日志和代码内容不一致的问题

缓存,需要 stop , delete , reset ,甚至删除 ~/.pm2 整个文件。 哈哈哈,其实本质是他将报错,调试日志放到不同的文件中,你删除对应文件,获得不理他就行。

# 部署Fastify项目踩的坑。

  • 背景使用啦自定义的日志,引入了pinoPretty,并自定义logger删除req和res的公共内容。
  • 在cluster模式下,就只能使用默认的日志。 亲测仅仅只能有日志级别的更改。 这种情况可以使用pm2的集群模式。
  • 因为cluster模式下,端口冲突的问题,多实例启动不了,改成 instances : 1
  • 因为cluster模式下,日志不打印的问题。 改成exec_mode: 'fork'模式就行。
  • 如需多实例并自定义日志,来实现多线程的操作,应采用nginx等反向代理来实现。 不要使用pm2的集群模式。

# 日志轮换插件

pm2-logrotate插件允许你同时配置日志文件的大小限制和时间间隔,以确保日志文件不会无限制增长,同时定期轮换日志文件。

# 安装
pm2 install pm2-logrotate
# 配置
## 按文件大小轮换,并且按时间间隔轮换。 2者满足一个就轮换
pm2 set pm2-logrotate:max_size 10M     # 设置每个日志文件的最大大小为 10MB
pm2 set pm2-logrotate:retain 10        # 保留最近的 10 个日志文件
pm2 set pm2-logrotate:compress true    # 启用日志压缩
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-ss   # 设置日期格式
pm2 set pm2-logrotate:rotateInterval '0 0 * * *'       # 每天轮换一次日志
# 生效
pm2 restart all
1
2
3
4
5
6
7
8
9
10
11
编辑 (opens new window)
上次更新: 2024/09/02, 10:51:33
最近更新
01
架构升级踩坑之路
02-27
02
总结
02-27
03
语法学习
02-27
更多文章>
| Copyright © 2021-2025 Wu lingui |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式