蓝戒博客

  • 首页
  • 研发说
  • 架构论
  • 效能录
  • AI谈
  • 随笔集
智构苍穹
AI为翼,架构为骨,文化为魂,实践探新境,价值筑长青。
  1. 首页
  2. 效能录
  3. 正文

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

2025年9月24日 147点热度 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 中对话未来。

最新 热点 随机
最新 热点 随机
npm 安全更新:把握令牌变更与发布体系的迁移参考指南 TresJS:用 Vue 构建现代化交互式 3D 体验 i18n 高效实现方案:前端国际化神器安利一波 前端国际化 i18n 实践:从项目到组件库的全链路方案 GEO(生成引擎优化)完整指南:AI 搜索时代的企业内容新机会 NativeScript:用 JavaScript / TypeScript 构建真正的原生应用
前端开源工具 PinMe:极简部署体验分享大屏适配的核心痛点与一行 autofit 解决方案markdown-exit:现代化的 Markdown 解析工具Lerna + Monorepo:前端多仓库管理的最佳实践CrewAI:基于角色协作的 AI Agent 团队框架浅析2025 最推荐的 uni-app 技术栈:unibest + uView Pro 高效开发全攻略
CSS命名规范—BEM思想 Mac下Flutter进行真机调试 jquery对象与js对象的相互转换方法 解决window下使用cmd运行node安装报错: npm ERR! code EIO 响应式web页面重构技术关键点 MCP 服务器深度解析:连接大模型语言与外部世界的桥梁
最近评论
渔夫 发布于 1 个月前(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