PM2是經常使用的node進程管理工具,它能夠提供node.js應用管理,如自動重載、性能監控、負載均衡等。同類工具備Supervisor、Forever等。
使用PM2須要npm全局安裝。node
npm install -g pm2
pm2 start app.js
便可啓動Node.js應用,成功後會看到打印的信息:git
[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均可以做爲該應用的標識。github
PM2還支持經過配置文件管理應用,這種方式能夠提供更豐富的配置,支持的配置格式是Javascript,JSON和YAML,具體能夠查看文檔。正則表達式
PM2啓動後,它將自動建立這些文件夾:npm
$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能夠查看應用列表數組
┌──────────┬────┬─────────┬──────┬───────┬────────┬─────────┬────────┬─────┬───────────┬───────┬──────────┐ │ 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
使用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 } }
在項目開發時,一般須要進行環境管理,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' } }
在服務端的代碼中,能夠經過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