菜鸟科技网

如何在Linux系统中安全重启Node.js服务?不同场景下有哪些高效的重启命令?

开发环境

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

如何在Linux系统中安全重启Node.js服务?不同场景下有哪些高效的重启命令?-图1
(图片来源网络,侵删)

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

优点:

如何在Linux系统中安全重启Node.js服务?不同场景下有哪些高效的重启命令?-图2
(图片来源网络,侵删)
  • 自动重启:核心功能,文件一保存就重启。
  • 配置灵活:可以通过 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

优点:

如何在Linux系统中安全重启Node.js服务?不同场景下有哪些高效的重启命令?-图3
(图片来源网络,侵删)
  • 速度快:基于 chokidar (一个高性能的文件监视库)。
  • 简单直接:配置相对简单。

生产环境

在生产环境中,我们需要的是 稳定、可靠、可控的重启机制,而不是频繁的自动重启,手动重启通常意味着服务出现了问题,需要恢复。

手动重启

这是最基础的方式,直接终止进程然后重新启动。

步骤:

  1. 找到 Node.js 进程的 PID (Process ID)

    # 使用 pgrep 命令 (推荐)
    pgrep node
    # 或者使用 ps 命令
    ps aux | grep node

    找到你的应用对应的 PID。

  2. 终止进程

    # 使用 kill 命令 + PID
    kill <PID>

    kill 12345

  3. 重新启动应用

    # 使用 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 是最标准、最稳定的方式,它是一个系统和服务管理器。

步骤:

  1. 创建服务文件/etc/systemd/system/ 目录下创建一个服务文件,my-node-app.service

    sudo nano /etc/systemd/system/my-node-app.service
  2. 编辑服务文件内容 将下面的内容复制进去,并根据你的实际情况修改 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
  3. 启用并启动服务

    # 重新加载 systemd 配置
    sudo systemctl daemon-reload
    # 启动服务
    sudo systemctl start my-node-app.service
    # 设置开机自启
    sudo systemctl enable my-node-app.service
  4. 管理服务

    # 查看服务状态
    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-apisudo systemctl restart my-app 稳定可控,适合故障恢复
生产环境 (守护) pm2 / systemd pm2 start app.jssudo systemctl start my-app 自动守护,日志监控,集群

  • 写代码时:用 nodemon
  • 部署到服务器:用 pm2 (简单易用) 或 systemd (最稳定、最标准)。
分享:
扫描分享到社交APP
上一篇
下一篇