最近在使用node部署項目,沒想到還有許多小公司徹底不用守護進程的工具直接跑項目的。由於咱們搭建的項目愈來愈多看着愈來愈煩,就本身搭建pm2了。以前一直是別人弄好我本身直接用的,第一次搭建考慮不周,請各位看客多多指正。node
一、首先全局安裝pm2 npm i pm2 -gnpm
二、而後能夠本身直接用 pm2 start [項目啓動文件]bash
三、對於egg的項目來講首先須要建立server.js啓動文件,代碼以下app
// server.jsconst egg = require('egg');const workers = Number(process.argv[2] || require('os').cpus().length);egg.startCluster({ workers, baseDir: __dirname,});複製代碼
四、此時能夠pm2 start server.js,可是這樣的話對缺乏對pm2 的配置工具
五、建立並配置pm2配置文件——pm2.config.js,配置裏邊能夠配置項目名,執行文件,實例個數,內存限制,日誌輸出,重啓次數,監聽重啓等。ui
const day = require('dayjs');module.exports = { apps: [ { name: 'server', // 項目名 script: './server.js', // 執行文件 cwd: './', // 根目錄 args: 'one two', // 傳遞給腳本的參數 interpreter: '', // 指定的腳本解釋器 interpreter_args: '', // 傳遞給解釋器的參數 // exec_mode: 'cluster_mode', // 應用啓動模式,支持fork和cluster模式 instances: 1, // 應用啓動實例個數,僅在cluster模式有效 默認爲fork;或者 max max_memory_restart: '1G', // 最大內存限制數,超出自動重啓 error_file: `./logs/pm2/${day().format('YYYYMMDD')}/app-err.log`, // 錯誤日誌文件 out_file: `./logs/pm2/${day().format('YYYYMMDD')}/app-out.log`, // 正常日誌文件 merge_logs: true, // 設置追加日誌而不是新建日誌 log_date_format: 'YYYY-MM-DD HH:mm:ss', // 指定日誌文件的時間格式 min_uptime: 1000, // 應用運行少於時間被認爲是異常啓動 max_restarts: 30, // 最大異常重啓次數,即小於min_uptime運行時間重啓次數; autorestart: true, // 默認爲true, 發生異常的狀況下自動重啓 cron_restart: '', // crontab時間格式重啓應用,目前只支持cluster模式; restart_delay: 60, // 異常重啓狀況下,延時重啓時間 // watch: true, // 是否監聽文件變更而後重啓 // ignore_watch: [ // // 不用監聽的文件 // 'node_modules', // 'logs', // 'news', // 'run', // 'test', // 'typings', // 'pm2.config', // ], env: { NODE_ENV: 'development', }, env_production: { NODE_ENV: 'production', }, }, ],};複製代碼
六、此時能夠 pm2 start pm2.config.js,就能夠在pm2 list 裏邊看到你的項目的狀況。spa
七、pm2 使用的簡單介紹rest
pm2 start ... 啓動項目
pm2 restart ... 重啓項目
pm2 delete ... 刪除項目
pm2 logs ... 查看日誌(也能夠直接打開文件查看)
pm2 gracefulReload ... 這個我用的比較少
複製代碼
八、注意事項日誌
a、有時候項目restart不起來,報錯端口占用,這裏是項目內存佔用過大會重開,因此去netstat 裏邊用taskkill殺掉對應的進程就行了,固然你也能夠吧內存配置的超級大...
b、輸出日誌的配置只是項目啓用生效,以後都是追加,因此致使項目時間久了日誌文件會超級大,暫時沒空解決,以後解決了再來更新
c、不建議開啓項目監測自動重啓,對於線上項目仍是穩一點。由於你能夠不當心改了東西他都會替你重啓。這樣很容易出問題的
複製代碼