最近把本地项目改成用 PM2 跑踩了一点坑记录一下免得下次又忘。基础配置先装 PM2npminstall-gpm2 或pnpminstall-gpm2创建一个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# 再启动或者用我配置好的命令npmrun pm2:deletenpmrun pm2:startscript 和 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,// 开发环境不支持 clusterenv:{NODE_ENV:development,},}生产环境配置{script:npx,args:next start -H 0.0.0.0,exec_mode:cluster,// 生产环境可以用 clusterinstances: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.tsexportdefault{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 startuppackage.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会开很多实例小项目直接写数字改配置后要先delete再startrestart不重读配置用npx比npm稳定开发环境用next dev生产环境用next start开发环境只能用fork模式用-H 0.0.0.0让服务监听所有地址注意 Next.js 的basePath配置差不多就这些点了希望能帮到后面用 PM2 的同学。