普通视图

发现新文章,点击刷新页面。
今天 — 2026年3月8日首页

PM2 使用指南 - 踩坑记录

2026年3月8日 13:25

最近把本地项目改成用 PM2 跑,踩了一点坑,记录一下免得下次又忘。

基础配置

先装 PM2:

npm install -g pm2
或
pnpm install -g pm2

创建一个 ecosystem.config.cjs 文件,这是 PM2 的配置文件:

module.exports = {
  apps: [
    {
      name: 'blog',           // 应用名称
      script: 'npx',          // 用什么命令跑
      args: 'next start -H 0.0.0.0',  // 命令参数
      cwd: '/path/to/project', // 项目路径
      instances: 1,           // 实例数量
      exec_mode: 'fork',      // 运行模式
      autorestart: true,      // 崩溃自动重启
      watch: false,           // 不监听文件变化
      max_memory_restart: '1G', // 内存超限重启
      env: {
        NODE_ENV: 'production',
        PORT: 3000,
      },
    },
  ],
};

实例数量这个坑

刚开始配置的时候,我把 instances 设置成了 'max',结果一启动就开了 16 个实例。查了一下才知道,'max' 会根据 CPU 核心数自动启动对应数量的实例。我家里主机是 16 核的,所以直接开了 16 个。

对于小项目来说,2-4 个实例就够用了,没必要开那么多。直接写数字就行:

instances: 2,  // 开 2 个实例

重启不生效的问题

改完配置文件后,我直接用了 pm2 restart,结果配置根本没生效。查了文档才知道,pm2 restart 不会重新读取配置文件,只是重启现有的进程。

正确的做法是:

pm2 delete blog      # 先删除
pm2 start ecosystem.config.cjs  # 再启动

或者用我配置好的命令:

npm run pm2:delete
npm run pm2:start

script 和 args 的选择

一开始我用 script: 'npm'args: 'start',结果各种问题。后来改成直接用 npx 就好多了:

// 不推荐
script: 'npm',
args: 'start',

// 推荐
script: 'npx',
args: 'next start -H 0.0.0.0',

npx 直接运行命令更稳定,npm 作为中间层有时候会有奇怪的问题。

开发环境和生产环境的区别

这个坑我解决了好一会。开发环境要用 next dev,生产环境用 next start

开发环境配置:

{
  script: 'npx',
  args: 'next dev --turbopack -H 0.0.0.0',
  exec_mode: 'fork',  // 开发环境不支持 cluster
  env: {
    NODE_ENV: 'development',
  },
}

生产环境配置:

{
  script: 'npx',
  args: 'next start -H 0.0.0.0',
  exec_mode: 'cluster',  // 生产环境可以用 cluster
  instances: 2,
  env: {
    NODE_ENV: 'production',
  },
}

注意!!!开发环境不能用 cluster 模式,只能用 fork

监听地址的问题

Next.js 默认只监听 localhost,外部访问不了。需要加 -H 0.0.0.0 参数。

我试过用环境变量 HOSTNAME: '0.0.0.0',但在生产模式下不起作用,还是得用命令行参数。

args: 'next start -H 0.0.0.0',  // 这样才生效

Next.js 的 basePath

如果 Next.js 配置了 basePath,访问的时候要加上这个路径。比如:

// next.config.ts
export default {
  basePath: '/blog',
}

那访问地址就是 http://127.0.0.1:3000/blog,不是 http://127.0.0.1:3000

常用命令集合

# 启动
pm2 start ecosystem.config.cjs

# 停止
pm2 stop blog

# 重启(不重读配置)
pm2 restart blog

# 删除
pm2 delete blog

# 查看日志
pm2 logs blog

# 查看状态
pm2 list

# 查看详情
pm2 show blog

# 监控面板
pm2 monit

开机自启

# 保存当前进程列表
pm2 save

# 生成开机启动脚本
pm2 startup

package.json 脚本

把常用命令写到 package.json 里,方便使用:

{
  "scripts": {
    "pm2:start": "pm2 start ecosystem.config.cjs",
    "pm2:stop": "pm2 stop blog",
    "pm2:restart": "pm2 restart blog",
    "pm2:delete": "pm2 delete blog",
    "pm2:logs": "pm2 logs blog",
    "pm2:monit": "pm2 monit"
  }
}

总结复盘

  • instances: 'max' 会开很多实例,小项目直接写数字
  • 改配置后要先 deletestartrestart 不重读配置
  • npxnpm 稳定
  • 开发环境用 next dev,生产环境用 next start
  • 开发环境只能用 fork 模式
  • -H 0.0.0.0 让服务监听所有地址
  • 注意 Next.js 的 basePath 配置

差不多就这些点了,希望能帮到后面用 PM2 的同学。

❌
❌