PM2 使用指南 - 踩坑记录

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

基础配置

先装 PM2:

bash 复制代码
npm install -g pm2
或
pnpm install -g pm2

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

javascript 复制代码
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 个实例就够用了,没必要开那么多。直接写数字就行:

javascript 复制代码
instances: 2,  // 开 2 个实例

重启不生效的问题

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

正确的做法是:

bash 复制代码
pm2 delete blog      # 先删除
pm2 start ecosystem.config.cjs  # 再启动

或者用我配置好的命令:

bash 复制代码
npm run pm2:delete
npm run pm2:start

script 和 args 的选择

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

javascript 复制代码
// 不推荐
script: 'npm',
args: 'start',

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

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

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

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

开发环境配置:

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

生产环境配置:

javascript 复制代码
{
  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',但在生产模式下不起作用,还是得用命令行参数。

javascript 复制代码
args: 'next start -H 0.0.0.0',  // 这样才生效

Next.js 的 basePath

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

javascript 复制代码
// next.config.ts
export default {
  basePath: '/blog',
}

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

常用命令集合

bash 复制代码
# 启动
pm2 start ecosystem.config.cjs

# 停止
pm2 stop blog

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

# 删除
pm2 delete blog

# 查看日志
pm2 logs blog

# 查看状态
pm2 list

# 查看详情
pm2 show blog

# 监控面板
pm2 monit

开机自启

bash 复制代码
# 保存当前进程列表
pm2 save

# 生成开机启动脚本
pm2 startup

package.json 脚本

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

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 的同学。

相关推荐
橙子家5 小时前
浏览器缓存之【身份与会话管理】:Cookies 和 Private state tokens
前端
最新资讯动态6 小时前
HDC 2026 | 对话鲸鸿动能:存量时代,品牌如何夺回营销“主动权”?
前端
最新资讯动态6 小时前
游戏出海,从产品走向体系
前端
最新资讯动态6 小时前
20人团队跑出百万DAU、大厂也来抢量:谁在鸿蒙生态跑出加速度
前端
最新资讯动态6 小时前
千万开发者背后,鸿蒙商业化的B面
前端
爱勇宝8 小时前
AI 时代:智商决定起点,情商决定走多远
前端·ai编程
kyriewen8 小时前
用了半年 Claude Code 后,我尝试关掉它写了一周代码——结果比想象中严重
前端·javascript·ai编程
IT_陈寒9 小时前
Vite的静态资源打包让我熬夜到三点,这坑千万别跳
前端·人工智能·后端
徐小夕10 小时前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
一份执念10 小时前
uni-app 小程序分包限制处理与主包体积优化实战
前端·微信小程序