Node.js 在现代全栈开发中广泛应用,凭借其非阻塞、事件驱动的特性,能够高效处理并发请求,并在构建实时应用和微服务时表现出色。然而,在开发和运维过程中,开发者经常需要一些工具来提升开发效率、管理进程和保障服务稳定运行。今天,我们将全面解析两款 Node.js 开发利器——Nodemon 与 PM2,帮助你在开发与生产环境中做出最优选择。
一、Nodemon 与 PM2 的基本概念
1. Nodemon
Nodemon 是一个专为 开发环境 设计的 Node.js 工具,它的核心功能是自动监控文件变化并重启应用,让开发者无需手动重启服务器,从而提高开发效率。
- 特点:
- 自动监听指定目录或文件变化
- 支持自定义监控文件类型(如
.js,.ts) - 与 Node.js 兼容,可直接替代
node app.js命令 - 适用于开发环境,不建议直接用于生产环境
2. PM2
PM2 是一个面向 生产环境 的 Node.js 进程管理工具,它不仅可以启动 Node.js 应用,还提供进程守护、日志管理、负载均衡等功能。
- 特点:
- 支持多进程模式(cluster)提升应用性能
- 自动重启崩溃的进程,保证服务稳定
- 提供日志、监控和进程管理界面
- 可与 Docker、Kubernetes 等容器化环境结合使用
- 适用于开发和生产环境
| 功能点 | Nodemon | PM2 |
|---|---|---|
| 主要用途 | 开发环境自动重启 | 生产环境进程管理 |
| 多进程支持 | ❌ | ✅(Cluster 模式) |
| 日志管理 | ❌ | ✅(支持日志轮转与查看) |
| 负载均衡 | ❌ | ✅(可在多核 CPU 上分发请求) |
| 自动重启 | ✅(文件变动) | ✅(崩溃或指定策略) |
| CLI 操作简单性 | ✅ | ✅(功能更复杂) |
二、Nodemon 的安装与使用
1. 安装
# 全局安装
npm install -g nodemon
# 项目内安装
npm install --save-dev nodemon
2. 基本使用
# 使用 nodemon 启动应用
nodemon app.js
此时,Nodemon 会监听当前目录下的 .js 文件变动,自动重启应用。
3. 高级用法
- 指定监控文件类型
nodemon --ext js,ts,json app.js
- 忽略某些文件或目录
nodemon --ignore node_modules --ignore logs app.js
- 使用配置文件
nodemon.json
{
"watch": ["src"],
"ext": "js,json,ts",
"ignore": ["node_modules", "dist"],
"exec": "node app.js"
}
使用配置文件后,只需执行:
nodemon
即可自动加载配置。
4. 实操建议
- 开发环境必备:配合热重载,减少手动重启服务器的步骤。
- 配合 TypeScript:结合
ts-node使用,例如:
nodemon --exec "ts-node" src/index.ts
- 与 Docker 联动:开发环境容器中使用 Nodemon,可实现文件同步自动重启。
三、PM2 的安装与使用
1. 安装
# 全局安装 PM2
npm install -g pm2
2. 基本使用
# 启动应用
pm2 start app.js
# 查看进程列表
pm2 list
# 停止应用
pm2 stop app
# 删除应用
pm2 delete app
3. 高级用法
- Cluster 模式(多核 CPU 负载均衡)
pm2 start app.js -i max
-i max 表示使用 CPU 核心数启动多个进程。
- 日志管理
pm2 logs # 实时查看日志
pm2 flush # 清空日志
pm2 reloadLogs # 重新加载日志文件
- 进程守护
PM2 可在应用崩溃后自动重启:
pm2 start app.js --watch
- 保存进程列表与开机自启
pm2 save # 保存当前进程列表
pm2 startup # 生成开机自启动命令
- JSON 配置文件管理
{
"apps": [
{
"name": "my-app",
"script": "./app.js",
"instances": "max",
"exec_mode": "cluster",
"watch": true,
"env": {
"NODE_ENV": "development"
},
"env_production": {
"NODE_ENV": "production"
}
}
]
}
执行:
pm2 start ecosystem.config.json
即可管理多个应用和不同环境配置。
4. 实操建议
- 生产环境必备:保证 Node.js 应用的高可用性和自动恢复。
- Cluster 模式提升性能:在多核服务器上充分利用 CPU 资源。
- 与日志分析工具结合:可与 ELK、Grafana 等结合,实现可视化监控。
- Docker & CI/CD 集成:在容器化部署中,结合 PM2 管理进程和日志。
四、Nodemon 与 PM2 的使用场景对比
| 场景 | Nodemon | PM2 |
|---|---|---|
| 本地开发调试 | ✅ 高效自动重启 | ⚠️ 过于复杂 |
| 文件实时热更新 | ✅ 支持 | ❌ 不专注于文件变化 |
| 单进程快速启动 | ✅ 轻量 | ✅ 可用,但功能略重 |
| 多核 CPU 负载均衡 | ❌ 不支持 | ✅ 支持 Cluster 模式 |
| 生产环境高可用 | ❌ 不适合 | ✅ 完美支持 |
| 日志与监控 | ❌ 基础控制台输出 | ✅ 日志管理、监控、报警 |
| Docker 集成 | ✅ 开发容器热更新 | ✅ 生产容器进程管理 |
总结:
- 开发环境 → 使用 Nodemon,专注提高开发效率。
- 生产环境 → 使用 PM2,保障稳定性和高可用性。
五、Nodemon 与 PM2 联合使用实践
在实际项目中,可以结合两者的优势:
- 开发环境
- 使用 Nodemon 进行本地开发和调试,配合 TypeScript 或 ES6 模块,实时热重载。
- 配置
.env文件区分开发环境和生产环境。
- 生产环境
- 构建完成后使用 PM2 启动应用,配置 Cluster 模式和日志管理。
- 结合 CI/CD 自动部署:如 GitLab CI/CD 或 GitHub Actions,部署完成后 PM2 自动拉起应用。
示例操作流程:
# 开发环境
nodemon --exec "ts-node" src/index.ts
# 生产环境
pm2 start ecosystem.config.json
pm2 logs
pm2 save
pm2 startup
六、最佳实践与常见问题
1. Nodemon 最佳实践
- 在项目中使用
dev脚本统一调用:
"scripts": {
"dev": "nodemon"
}
- 配置
.nodemonignore忽略大文件夹,避免性能问题。 - 对于 TypeScript 项目,结合
ts-node和sourceMap。
2. PM2 最佳实践
- 使用
ecosystem.config.json管理多应用、环境配置。 - 开启 Cluster 模式提升多核 CPU 性能。
- 结合日志轮转插件
pm2-logrotate管理日志。 - 与 CI/CD 集成实现自动部署和进程管理。
- 定期执行
pm2 save保存进程列表,防止系统重启丢失进程。
3. 常见问题
| 问题 | 解决方案 |
|---|---|
| Nodemon 重启过慢 | 忽略 node_modules、大文件夹或使用 --legacy-watch |
| PM2 进程启动失败 | 检查端口占用、权限问题或配置文件语法 |
| PM2 日志文件过大 | 安装 pm2-logrotate 并配置轮转策略 |
| Docker 内 PM2 不能守护进程 | 使用 --no-daemon 让 PM2 在前台运行 |
七、完整命令示例表
| 工具 | 命令 | 说明 |
|---|---|---|
| Nodemon | nodemon app.js | 启动应用并监听文件变化 |
| Nodemon | nodemon --ext js,ts,json app.js | 指定监控文件类型 |
| Nodemon | nodemon --ignore node_modules | 忽略特定文件夹/文件 |
| Nodemon | nodemon --exec "ts-node" src/index.ts | TypeScript 热重载 |
| Nodemon | nodemon -L | 使用 legacy watch,适合 Docker 或网络文件系统 |
| PM2 | pm2 start app.js | 启动应用进程 |
| PM2 | pm2 start app.js -i max | Cluster 模式启动,利用所有 CPU 核心 |
| PM2 | pm2 list | 查看进程列表 |
| PM2 | pm2 stop app | 停止指定进程 |
| PM2 | pm2 restart app | 重启指定进程 |
| PM2 | pm2 delete app | 删除指定进程 |
| PM2 | pm2 logs | 查看实时日志 |
| PM2 | pm2 flush | 清空日志 |
| PM2 | pm2 reloadLogs | 重新加载日志文件 |
| PM2 | pm2 save | 保存当前进程列表,保证重启后恢复 |
| PM2 | pm2 startup | 设置开机自启动 |
| PM2 | pm2 start ecosystem.config.json | 使用配置文件管理多应用和环境 |
八、Docker 容器化使用实例
在现代开发中,Node.js 项目常常部署在 Docker 容器中。下面给出 Nodemon 开发环境 和 PM2 生产环境 的示例。
1. 开发环境(使用 Nodemon)
Dockerfile.dev
FROM node:20-alpine
WORKDIR /app
# 安装依赖
COPY package*.json ./
RUN npm install
# 安装 nodemon
RUN npm install -g nodemon
# 复制源代码
COPY . .
# 暴露端口
EXPOSE 3000
# 启动应用(热重载)
CMD ["nodemon", "--legacy-watch", "src/index.js"]
docker-compose.dev.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- .:/app
- /app/node_modules
ports:
- "3000:3000"
说明:通过挂载本地代码卷,文件修改后 Nodemon 会自动重启应用,实现开发环境热重载。
2. 生产环境(使用 PM2)
Dockerfile.prod
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
# 安装 PM2
RUN npm install -g pm2
COPY . .
EXPOSE 3000
# 启动 PM2 生产模式
CMD ["pm2-runtime", "ecosystem.config.js"]
ecosystem.config.js
module.exports = {
apps: [
{
name: "my-app",
script: "./src/index.js",
instances: "max",
exec_mode: "cluster",
watch: false,
env: {
NODE_ENV: "production"
}
}
]
}
说明:
pm2-runtime是专门为 Docker 设计的 PM2 启动方式,保证容器前台运行、进程守护和多核优化。
3. 生产容器启动命令
# 构建镜像
docker build -t my-node-app-prod -f Dockerfile.prod .
# 运行容器
docker run -d -p 3000:3000 my-node-app-prod
结合 PM2 的 Cluster 模式,生产环境可以充分利用服务器多核 CPU,并保证进程崩溃自动恢复。
4. 小结
- 开发环境 → 使用 Nodemon + Docker 卷挂载,实现热重载和快速迭代。
- 生产环境 → 使用 PM2 + Docker 镜像 + pm2-runtime,保证高可用、多进程负载均衡和日志管理。
- 通过以上方式,可以在同一项目中兼顾开发效率和生产稳定性,实现完整 Node.js 生命周期管理。
九、总结
Nodemon 与 PM2 是 Node.js 开发者和运维工程师的两大利器,各有侧重点:
- Nodemon:开发神器,关注快速迭代和热重载,轻量且易用。
- PM2:生产利器,关注进程管理、高可用、日志与性能优化,功能强大。
在实际项目中,开发环境使用 Nodemon,生产环境使用 PM2 是最合理的组合策略。同时,结合 CI/CD、Docker 容器化、日志管理和多核优化,可以显著提升 Node.js 应用的开发效率和生产稳定性。
无论是单机开发还是企业级生产环境,掌握 Nodemon 与 PM2 的使用和最佳实践,将大大提升 Node.js 项目的开发与运维水平。
参考资料
文章评论