Koa從零搭建到Api實現—項目部署

PM2是經常使用的node進程管理工具,它能夠提供node.js應用管理,如自動重載、性能監控、負載均衡等。同類工具備Supervisor、Forever等。node

PM2安裝

使用PM2須要npm全局安裝。git

npm install -g pm2

複製代碼

啓動PM2項目

直接啓動項目

pm2 start app.js

複製代碼

便可啓動Node.js應用,成功後會看到打印的信息:github

[PM2] Spawning PM2 daemon with pm2_home=C:\Users\23101\.pm2
[PM2] PM2 Successfully daemonized
[PM2] Starting C:\xxx\lesson29\server.js in fork_mode (1 instance)
[PM2] Done.
┌────────┬────┬──────┬────────┬───┬─────┬───────────┐
│ Name   │ id │ mode │ status │ ↺ │ cpu │ memory    │
├────────┼────┼──────┼────────┼───┼─────┼───────────┤
│  app   │ 0  │ fork │ online │ 0 │ 0%  │ 32.0 MB   │
└────────┴────┴──────┴────────┴───┴─────┴───────────┘
 Use `pm2 show <id|name>` to get more details about an app

複製代碼

在表格中顯示了應用的名稱爲app、id爲0,應用名稱和id均可以做爲該應用的標識。正則表達式

經過配置文件管理應用

PM2還支持經過配置文件管理應用,這種方式能夠提供更豐富的配置,支持的配置格式是Javascript,JSON和YAML,具體能夠查看文檔。npm

文件夾結構

PM2啓動後,它將自動建立這些文件夾:數組

$HOME/.pm2 將包含全部PM2相關文件
$HOME/.pm2/logs 將包含全部應用程序日誌
$HOME/.pm2/pids 將包含全部應用程序pids
$HOME/.pm2/pm2.log PM2 日誌
$HOME/.pm2/pm2.pid PM2 pid
$HOME/.pm2/rpc.sock 遠程命令的套接字文件
$HOME/.pm2/pub.sock 可發佈事件的套接字文件
$HOME/.pm2/conf.js PM2配置
在Windows中,$ HOME環境變量能夠是$ HOMEDRIVE + $ HOMEPATH
複製代碼

查看應用列表

使用pm2 list能夠查看應用列表bash

┌──────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐
│ App name │ id │ version │ mode │ pid   │ status │ restart │ uptime │ cpu │ mem       │ user  │ watching │
├──────────┼────┼─────────┼──────┼───────┼────────┼─────────┼────────┼─────┼───────────┼───────┼──────────┤
│ server   │ 0  │ 1.0.0   │ fork │ 24776 │ online │ 9       │ 19m    │ 0%  │ 35.4 MB   │ 23101 │ disabled │
└──────────┴────┴─────────┴──────┴───────┴────────┴─────────┴────────┴─────┴───────────┴───────┴──────────┘

複製代碼

查看應用詳情

在命令行中輸入pm2 show 0,彈出信息以下:app

Describing process with id 0 - name server 
┌───────────────────┬─────────────────────────────────────────────┐
│ status            │ online                                      │
│ name              │ server                                      │
│ version           │ 1.0.0                                       │
│ restarts          │ 0                                           │
│ uptime            │ 3m                                          │
│ script path       │ C:\xxx\lesson29\server.js                   │
│ script args       │ N/A                                         │
│ error log path    │ C:\Users\23101\.pm2\logs\server-error.log   │
│ out log path      │ C:\Users\23101\.pm2\logs\server-out.log     │
│ pid path          │ C:\Users\23101\.pm2\pids\server-0.pid       │
│ interpreter       │ node                                        │
│ interpreter args  │ N/A                                         │
│ script id         │ 0                                           │
│ exec cwd          │ C:\xxx\lesson29                             │
│ exec mode         │ fork_mode                                   │
│ node.js version   │ 11.9.0                                      │
│ node env          │ N/A                                         │
│ watch & reload    │ ✘                                           │
│ unstable restarts │ 0                                           │
│ created at        │ 2019-04-09T14:07:23.918Z                    │
└───────────────────┴─────────────────────────────────────────────┘
 Revision control metadata 
┌──────────────────┬──────────────────────────────────────────┐
│ revision control │ git                                      │
│ remote url       │ https://github.com/chencl1986/Blog.git   │
│ repository root  │ C:\xxx\Blog                              │
│ last update      │ 2019-04-09T14:07:24.928Z                 │
│ revision         │ 08f1efdfeb48bcc87f96b563d4d013a22e42ed9f │
│ comment          │                                          │
│ branch           │ master                                   │
└──────────────────┴──────────────────────────────────────────┘
 Actions available 
┌────────────────────────┐
│ km:heapdump            │
│ km:cpu:profiling:start │
│ km:cpu:profiling:stop  │
│ km:heap:sampling:start │
│ km:heap:sampling:stop  │
└────────────────────────┘
 Trigger via: pm2 trigger server <action_name>

 Code metrics value 
┌────────────────────────┬───────┐
│ Heap Size              │ 13.70 │
│ Heap Usage             │ 59.91 │
│ Used Heap Size         │ 8.21  │
│ Active requests        │ 0     │
│ Active handles         │ 4     │
│ Event Loop Latency     │ 2.30  │
│ Event Loop Latency p95 │ 7.15  │
│ HTTP Mean Latency      │ 10    │
│ HTTP P95 Latency       │ 10038 │
│ HTTP                   │ 0     │
└────────────────────────┴───────┘
 Add your own code metrics: http://bit.ly/code-metrics
 Use `pm2 logs server [--lines 1000]` to display logs
 Use `pm2 env 0` to display environement variables
 Use `pm2 monit` to monitor CPU and Memory usage server


複製代碼

監控CPU內存

使用pm2 monit方法,便可監控CPU和內存的使用狀況,同時應用的報錯信息也會打印在Global Logs窗口中。負載均衡

監聽代碼變化

使用以下命令,能夠監聽代碼保存,並更新應用。less

pm2 start server.js --watch

複製代碼

PM2不止監聽server.js文件,還監聽了它引用的全部模塊,只要任意模塊代碼進行了保存,如鍵盤按下ctrl + s,或新建文件,PM2就會進行重啓。 若是須要忽略某些文件,則能夠在配置文件中設置,以下:

{
  "watch": ["server", "client"],
  "ignore_watch" : ["node_modules", "client/img"],
  "watch_options": {
    "followSymlinks": false
  }
}

複製代碼
  • watch能夠是布爾值,路徑數組或表示路徑的字符串。默認爲false。
  • ignore_watch能夠是一個路徑數組或一個字符串,它將被chokidar解釋爲glob或正則表達式。
  • watch_options是一個替代chokidar的選項的對象。有關定義,請參閱chokidar文檔。

環境管理

在項目開發時,一般須要進行環境管理,PM2能夠使用配置文件與命令行參數設置環境。

添加配置文件

首先,使用pm2 init命令,建立一個ecosystem.config.js文件,其中已經有默認的配置。

module.exports = {
  apps : [{
    name: 'API',
    script: 'app.js',

    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    args: 'one two',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'development'
    },
    env_production: {
      NODE_ENV: 'production'
    }
  }],

  deploy : {
    production : {
      user : 'node',
      host : '212.83.163.1',
      ref  : 'origin/master',
      repo : 'git@github.com:repo.git',
      path : '/var/www/production',
      'post-deploy' : 'npm install && pm2 reload ecosystem.config.js --env production'
    }
  }
};


複製代碼

修改配置

其中,對環境管理有用的爲:

{
  env: {
    NODE_ENV: 'development'
  },
  env_production: {
    NODE_ENV: 'production'
  }
}


複製代碼

爲了配合咱們的項目,能夠將配置修改成以下:

{
  env: {
    NODE_ENV: 'dev'
  },
  env_development: {
    NODE_ENV: 'dev'
  },
  env_production: {
    NODE_ENV: 'prod'
  }
}


複製代碼
  • pm2 start ecosystem.config.js --watch --env
  • pm2 start ecosystem.config.js --watch --env development
  • pm2 start ecosystem.config.js --watch --env production

啓動開發環境

在服務端的代碼中,能夠經過process.env.NODE_ENV,拿到設置的值。 例如咱們使用pm2 start ecosystem.config.js --watch --env development命令啓動項目,則能夠打印出process.env.NODE_ENV的值爲`dev:

const process = require('process')
console.log(process.env.NODE_ENV) // dev
mode = process.env.NODE_ENV // dev

複製代碼
相關文章
相關標籤/搜索