PM2 使用指南 - 踩坑记录
最近把本地项目改成用 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'会开很多实例,小项目直接写数字 - 改配置后要先
delete再start,restart不重读配置 - 用
npx比npm稳定 - 开发环境用
next dev,生产环境用next start - 开发环境只能用
fork模式 - 用
-H 0.0.0.0让服务监听所有地址 - 注意 Next.js 的
basePath配置
差不多就这些点了,希望能帮到后面用 PM2 的同学。