开发环境
在开发环境中,我们最关心的是 代码修改后能自动、快速地重启服务,无需手动执行命令。

nodemon (最常用)
nodemon 是一个为 Node.js 开发而生的工具,它会监视你项目中的文件变化,并自动重启服务器。
安装:
# 全局安装 (推荐) npm install -g nodemon # 或者作为项目依赖安装 npm install --save-dev nodemon
使用:
# 使用全局的 nodemon nodemon your-app.js # 如果你在 package.json 中配置了 "start" 脚本 npm start # nodemon 是项目依赖,需要 npx 来运行 npx nodemon your-app.js
优点:

- 自动重启:核心功能,文件一保存就重启。
- 配置灵活:可以通过
nodemon.json文件配置忽略的文件、监视的扩展名等。 - 调试友好:支持调试模式 (
--inspect)。
示例 nodemon.json 配置:
{
"watch": ["src/"],
"ext": "js,json",
"ignore": ["src/**/*.test.js", "src/**/*.spec.js"],
"delay": 1000
}
node-dev
node-dev 是另一个流行的选择,功能和 nodemon 类似,但速度更快,内存占用更小。
安装与使用:
# 安装 npm install -g node-dev # 使用 node-dev your-app.js
优点:

- 速度快:基于
chokidar(一个高性能的文件监视库)。 - 简单直接:配置相对简单。
生产环境
在生产环境中,我们需要的是 稳定、可靠、可控的重启机制,而不是频繁的自动重启,手动重启通常意味着服务出现了问题,需要恢复。
手动重启
这是最基础的方式,直接终止进程然后重新启动。
步骤:
-
找到 Node.js 进程的 PID (Process ID)
# 使用 pgrep 命令 (推荐) pgrep node # 或者使用 ps 命令 ps aux | grep node
找到你的应用对应的 PID。
-
终止进程
# 使用 kill 命令 + PID kill <PID>
kill 12345 -
重新启动应用
# 使用 pm2 启动 (推荐,见下文) pm2 start your-app.js # 或者直接用 node 命令启动 (不推荐,因为没有进程管理) node your-app.js
缺点:
- 窗口关闭即失效:如果直接通过
ssh连接并运行node app.js,当ssh断开或窗口关闭时,进程也会终止。 - 无管理能力:无法方便地查看日志、监控状态、集群管理等。
使用进程管理器 (强烈推荐)
在生产环境中,绝对不要直接用 node 命令启动应用,必须使用进程管理器来守护你的应用。
pm2 (最流行)
pm2 是一个功能非常强大的 Node.js 进程管理器。
安装:
npm install -g pm2
常用命令:
-
启动应用
pm2 start your-app.js --name "my-api" # --name 给进程起一个别名
-
重启应用
# 重命名的进程 "my-api" pm2 restart my-api # 或者根据应用文件名 pm2 restart your-app.js # 重启所有进程 pm2 restart all
-
停止应用
pm2 stop my-api
-
删除应用
pm2 delete my-api
-
查看进程列表和状态
pm2 list # 或 pm2 status
-
查看日志
# 查看所有日志 pm2 logs # 查看特定进程的日志 pm2 logs my-api
-
开机自启
pm2 startup # 根据提示执行生成的命令 pm2 save
优点:
- 守护进程:确保你的应用永远在线,如果意外退出,会自动重启。
- 集群模式:轻松实现多核负载均衡 (
pm2 start your-app.js -i max)。 - 日志管理:自动记录所有日志,方便排查问题。
- 监控:提供实时的进程状态和性能监控。
- 部署:内置简单的部署流程。
systemd (Linux 系统级推荐)
如果你的服务器是 Linux (如 Ubuntu, CentOS),使用 systemd 是最标准、最稳定的方式,它是一个系统和服务管理器。
步骤:
-
创建服务文件 在
/etc/systemd/system/目录下创建一个服务文件,my-node-app.service。sudo nano /etc/systemd/system/my-node-app.service
-
编辑服务文件内容 将下面的内容复制进去,并根据你的实际情况修改
User,Group,WorkingDirectory,ExecStart等路径。[Unit] Description=My Awesome Node.js App After=network.target [Service] User=your-linux-user # 运行应用的用户 Group=your-linux-user # 运行应用的组 WorkingDirectory=/path/to/your/app # 应用根目录 ExecStart=/usr/bin/node /path/to/your/app/app.js # 启动命令 Restart=always # 总是重启,即使非零退出 Environment=NODE_ENV=production # 设置环境变量 [Install] WantedBy=multi-user.target
-
启用并启动服务
# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start my-node-app.service # 设置开机自启 sudo systemctl enable my-node-app.service
-
管理服务
# 查看服务状态 sudo systemctl status my-node-app.service # 重启服务 sudo systemctl restart my-node-app.service # 停止服务 sudo systemctl stop my-node-app.service # 查看实时日志 sudo journalctl -u my-node-app.service -f
优点:
- 系统级集成:与操作系统深度集成,非常稳定。
- 依赖管理:可以定义服务间的依赖关系。
- 资源限制:可以限制服务的 CPU 和内存使用。
- 日志集成:日志直接输出到系统的
journald。
总结与对比
| 场景 | 推荐工具 | 命令示例 | 优点 |
|---|---|---|---|
| 开发环境 | nodemon |
nodemon app.js |
自动重启,开发效率高 |
| 生产环境 (手动) | pm2 / systemd |
pm2 restart my-api 或 sudo systemctl restart my-app |
稳定可控,适合故障恢复 |
| 生产环境 (守护) | pm2 / systemd |
pm2 start app.js 或 sudo systemctl start my-app |
自动守护,日志监控,集群 |
- 写代码时:用
nodemon。 - 部署到服务器:用
pm2(简单易用) 或systemd(最稳定、最标准)。
