蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
融合 AI、架构与工程实践,沉淀方法论,构建可持续的技术价值。
  1. 首页
  2. 效能录
  3. 正文

Node.js 开发利器:深入解析 PM2 与 Nodemon 的区别、使用与最佳实践

2025年9月24日 248点热度 1人点赞 0条评论

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 等容器化环境结合使用
    • 适用于开发和生产环境
功能点NodemonPM2
主要用途开发环境自动重启生产环境进程管理
多进程支持❌✅(Cluster 模式)
日志管理❌✅(支持日志轮转与查看)
负载均衡❌✅(可在多核 CPU 上分发请求)
自动重启✅(文件变动)✅(崩溃或指定策略)
CLI 操作简单性✅✅(功能更复杂)

二、Nodemon 的安装与使用

1. 安装

Bash
# 全局安装
npm install -g nodemon

# 项目内安装
npm install --save-dev nodemon

2. 基本使用

Bash
# 使用 nodemon 启动应用
nodemon app.js

此时,Nodemon 会监听当前目录下的 .js 文件变动,自动重启应用。

3. 高级用法

  • 指定监控文件类型
Bash
nodemon --ext js,ts,json app.js
  • 忽略某些文件或目录
Bash
nodemon --ignore node_modules --ignore logs app.js
  • 使用配置文件 nodemon.json
JSON
{
  "watch": ["src"],
  "ext": "js,json,ts",
  "ignore": ["node_modules", "dist"],
  "exec": "node app.js"
}

使用配置文件后,只需执行:

Bash
nodemon

即可自动加载配置。

4. 实操建议

  1. 开发环境必备:配合热重载,减少手动重启服务器的步骤。
  2. 配合 TypeScript:结合 ts-node 使用,例如:
Bash
nodemon --exec "ts-node" src/index.ts
  1. 与 Docker 联动:开发环境容器中使用 Nodemon,可实现文件同步自动重启。

三、PM2 的安装与使用

1. 安装

Bash
# 全局安装 PM2
npm install -g pm2

2. 基本使用

Bash
# 启动应用
pm2 start app.js

# 查看进程列表
pm2 list

# 停止应用
pm2 stop app

# 删除应用
pm2 delete app

3. 高级用法

  • Cluster 模式(多核 CPU 负载均衡)
Bash
pm2 start app.js -i max

-i max 表示使用 CPU 核心数启动多个进程。

  • 日志管理
Bash
pm2 logs           # 实时查看日志
pm2 flush          # 清空日志
pm2 reloadLogs     # 重新加载日志文件
  • 进程守护

PM2 可在应用崩溃后自动重启:

Bash
pm2 start app.js --watch
  • 保存进程列表与开机自启
Bash
pm2 save           # 保存当前进程列表
pm2 startup        # 生成开机自启动命令
  • JSON 配置文件管理
JSON
{
  "apps": [
    {
      "name": "my-app",
      "script": "./app.js",
      "instances": "max",
      "exec_mode": "cluster",
      "watch": true,
      "env": {
        "NODE_ENV": "development"
      },
      "env_production": {
        "NODE_ENV": "production"
      }
    }
  ]
}

执行:

Bash
pm2 start ecosystem.config.json

即可管理多个应用和不同环境配置。

4. 实操建议

  1. 生产环境必备:保证 Node.js 应用的高可用性和自动恢复。
  2. Cluster 模式提升性能:在多核服务器上充分利用 CPU 资源。
  3. 与日志分析工具结合:可与 ELK、Grafana 等结合,实现可视化监控。
  4. Docker & CI/CD 集成:在容器化部署中,结合 PM2 管理进程和日志。

四、Nodemon 与 PM2 的使用场景对比

场景NodemonPM2
本地开发调试✅ 高效自动重启⚠️ 过于复杂
文件实时热更新✅ 支持❌ 不专注于文件变化
单进程快速启动✅ 轻量✅ 可用,但功能略重
多核 CPU 负载均衡❌ 不支持✅ 支持 Cluster 模式
生产环境高可用❌ 不适合✅ 完美支持
日志与监控❌ 基础控制台输出✅ 日志管理、监控、报警
Docker 集成✅ 开发容器热更新✅ 生产容器进程管理

总结:

  • 开发环境 → 使用 Nodemon,专注提高开发效率。
  • 生产环境 → 使用 PM2,保障稳定性和高可用性。

五、Nodemon 与 PM2 联合使用实践

在实际项目中,可以结合两者的优势:

  1. 开发环境
    • 使用 Nodemon 进行本地开发和调试,配合 TypeScript 或 ES6 模块,实时热重载。
    • 配置 .env 文件区分开发环境和生产环境。
  2. 生产环境
    • 构建完成后使用 PM2 启动应用,配置 Cluster 模式和日志管理。
    • 结合 CI/CD 自动部署:如 GitLab CI/CD 或 GitHub Actions,部署完成后 PM2 自动拉起应用。

示例操作流程:

Bash
# 开发环境
nodemon --exec "ts-node" src/index.ts

# 生产环境
pm2 start ecosystem.config.json
pm2 logs
pm2 save
pm2 startup

六、最佳实践与常见问题

1. Nodemon 最佳实践

  • 在项目中使用 dev 脚本统一调用:
JSON
"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 在前台运行

七、完整命令示例表

工具命令说明
Nodemonnodemon app.js启动应用并监听文件变化
Nodemonnodemon --ext js,ts,json app.js指定监控文件类型
Nodemonnodemon --ignore node_modules忽略特定文件夹/文件
Nodemonnodemon --exec "ts-node" src/index.tsTypeScript 热重载
Nodemonnodemon -L使用 legacy watch,适合 Docker 或网络文件系统
PM2pm2 start app.js启动应用进程
PM2pm2 start app.js -i maxCluster 模式启动,利用所有 CPU 核心
PM2pm2 list查看进程列表
PM2pm2 stop app停止指定进程
PM2pm2 restart app重启指定进程
PM2pm2 delete app删除指定进程
PM2pm2 logs查看实时日志
PM2pm2 flush清空日志
PM2pm2 reloadLogs重新加载日志文件
PM2pm2 save保存当前进程列表,保证重启后恢复
PM2pm2 startup设置开机自启动
PM2pm2 start ecosystem.config.json使用配置文件管理多应用和环境

八、Docker 容器化使用实例

在现代开发中,Node.js 项目常常部署在 Docker 容器中。下面给出 Nodemon 开发环境 和 PM2 生产环境 的示例。

1. 开发环境(使用 Nodemon)

Dockerfile.dev

Dockerfile
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

YAML
version: '3.8'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
      - /app/node_modules
    ports:
      - "3000:3000"

说明:通过挂载本地代码卷,文件修改后 Nodemon 会自动重启应用,实现开发环境热重载。


2. 生产环境(使用 PM2)

Dockerfile.prod

Dockerfile
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

JavaScript
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. 生产容器启动命令

Bash
# 构建镜像
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 项目的开发与运维水平。


参考资料

  • Nodemon 官方文档
  • PM2 官方文档
  • Node.js 官方文档
标签: Nodemon PM2
最后更新:2025年9月24日

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

cywcd

我始终相信,技术不仅是解决问题的工具,更是推动思维进化和创造价值的方式。从研发到架构,追求极致效能;在随笔中沉淀思考,于 AI 中对话未来。

最新 热点 随机
最新 热点 随机
前端开发 TanStack 化:从“框架思维”到“能力组合”的工程演进 Docker 进阶(七):容器化体系设计总结与生产落地经验复盘 Docker 进阶(六):生产环境中的 Docker 安全、监控与日志体系 Docker 进阶(五):Docker + CI/CD —— 从代码提交到自动部署 Docker 进阶(四):使用 Docker Swarm 与 Kubernetes 实现容器编排 Docker 进阶(三):深入理解镜像层(Layer)与缓存机制
Workbox:可直接用于生产环境的 Service Worker 利器快速构建项目文档网站:主流文档站点工具选型与对比DiceBear:30+ 风格、完全可定制的开源头像生成解决方案ES2015 → ES2025:JavaScript 十年演进全景回顾与核心 API 总结ECMAScript 2025(ES16)深度解析20 个现代 JavaScript API 深度盘点
GEO(生成引擎优化)完整指南:AI 搜索时代的企业内容新机会 css中常用中文字体的Unicode编码 js中this指向问题全解析 NativeScript:用 JavaScript / TypeScript 构建真正的原生应用 移动端ios:active伪类无效的兼容解决方案 🧩 E2E 测试实战:Playwright 介绍与使用,对比 Cypress 的优劣势与生态选择
最近评论
渔夫 发布于 3 个月前(11月05日) 学到了,感谢博主分享
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
沙拉小王子 发布于 8 年前(11月30日) 适合vue入门者学习,赞一个
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8
cywcd 发布于 9 年前(04月27日) 请参考一下这篇文章http://www.jianshu.com/p/fa4460e75cd8

COPYRIGHT © 2025 蓝戒博客_智构苍穹-专注于大前端领域技术生态. ALL RIGHTS RESERVED.

京ICP备12026697号-2