如何使用PM2部署Node.js项目

193 阅读3分钟

为什么使用 PM2?

  1. 进程管理:PM2可以管理多个Node.js进程,并确保它们始终运行。如果进程崩溃或停止,则PM2可以自动重新启动它们。
  2. 日志管理:PM2可以记录Node.js应用程序的输出,并将其保存到文件中,可以轻松查看和分析这些日志文件,以便快速诊断和解决问题。
  3. 负载均衡:PM2可以配置负载均衡,将流量分配到多个Node.js进程中。这可以提高应用程序的可扩展性和可靠性。
  4. 部署管理:PM2可以帮助您轻松地部署和管理Node.js应用程序。可以使用PM2来部署应用程序,以便它们可以在多个服务器上运行,或者在生产环境中运行。
  5. 监控:PM2可以监控Node.js应用程序的运行情况,并提供有用的指标和警报。这可以帮助了解应用程序的性能和可靠性,并及时识别潜在的问题。

PM2快速上手

  1. 安装PM2

    npm install pm2 -g
    
  2. 进入Node.js项目根目录

    // app.js
    // simple server
    
    const express = require('express');
    const app = express();
    
    app.get('/hello', (req, res)=>{
      res.send('hello')
    })
    
    app.listen(8888, () =>{
      console.log('Server listening on port 8888')
    })
    
  3. 启动项目

    pm2 start app.js
    

    Untitled.png

  4. 确认程序状态

    pm2 list
    

    Untitled 1.png

  5. 查看日志

    pm2 log 
    

    Untitled 2.png

  6. 停止应用程序

    pm2 stop [app-id/app-name]
    

    Untitled 3.png

  7. 重启应用

    pm2 restart [app-id/app-name]
    

    Untitled 4.png

pm2 一些其他的常用命令

  • 删除所有应用程序:pm2 delete all Untitled 5.png

  • 删除指定应用程序:pm2 delete [app-id/app-name]

  • 监控和管理在 PM2 中运行的 Node.js 应用程序:pm2 monit。 通过 pm2 monit命令,可以在终端中打开一个仪表盘,显示所有正在运行的应用程序及其资源使用情况,例如 CPU 和内存使用情况、请求次数等等。通过这些监控指标,可以更好地了解应用程序的运行情况,并及时发现潜在的问题,从而做出相应的优化或调整。 Untitled 6.png

  • 将 PM2 设置为开机自启动:pm2 startup

  • 存当前运行的应用程序列表,以便下次启动时自动恢复:pm2 save

  • 重新启动(直接将server kill掉然后重新启动一个server)名为 app.js 的应用程序:pm2 restart app.js

    注:重新启动的这一段时间内,server是有一个空窗期的。这个时间内所有的request都会被内核拒绝,因为根本没有它们需要找的server存在。

  • 重新加载名为 app.js 的应用程序:pm2 reload app.js

    注:重载是对于cluster模式而言的,通过重新加载,pm2将逐个重新启动所有进程,始终保持至少一个进程运行。reload命令会先创建一个server,然后将原server kill掉,此时原server上的正在执行的request因为进程被关闭而失败。后续的request进来时,因为新server已经启动了。所以不存在空窗期,所以后续的request不会报错。

通过配置文件启动Node.js 项目

  1. 新建deploy.json

    {
      "apps":[
          {
              "name": "app-server",
              "script": "app.js",
              "exec_mode": "fork",
              "watch": false,
              "ignore_watch" : [
                  "node_modules", 
                  "files"
              ],
              "log_date_format": "YYYY-MM-DD HH:mm:ss",
              "max_memory_restart": "3G",
              "env": {
                  "COMMON_VARIABLE": "true"
              },
              "env_production": {
                  "NODE_ENV": "production"
              }
          }
      ],
      "deploy": {
          "production": {
              "post-deploy": "pm2 startOrRestart deploy.json --env production",
              "env": {
                  "NODE_ENV": "production",
                  "PORT": "8888"
              }
          }
      }
    }
    
  2. 启动:pm2 startOrRestart deploy.json --env production Untitled 7.png

    Untitled 8.png