1. 程式人生 > 實用技巧 >使用pm2快速將專案部署到遠端伺服器

使用pm2快速將專案部署到遠端伺服器

使用背景

當我們需要將專案部署到遠端線上伺服器時;傳統的方法可能就是:

將原生代碼通過ssh、ftp等方式上傳到伺服器;然後通過ssh登入到伺服器,配置好環境;手動啟動應用。太過手動化,麻煩,操作繁瑣。

現代自動化部署

環境:本地(Mac);遠端伺服器(CentOS)使用工具:Git、pm2、node;需知概念:ssh祕鑰登陸;Github新增Deploy Keys

1、伺服器環境部署

基本工具安裝:git、pm2、node

2、ssh伺服器免密登陸

伺服器生成祕鑰對

ssh-keygen -t rsa -C  '[email protected]'

-t 指定金鑰型別,預設即 rsa ,可以省略
-C 設定註釋文字,比如郵箱,可以省略

由於使用的是百度雲伺服器,裡面可以直接介面生成祕鑰對,然後下載到本地的是一個xxx.txt檔案
. 此時登陸可以使用ssh -i xxx.txt[下載的公鑰路徑] name@domain報錯:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'server-key.txt' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "server-key.txt": bad permissions

大概意思就是,私鑰檔案不能被其他人所訪問。可能考慮到如果被別人獲取到,就可能對伺服器安全造成影響,所以需要從新設定下祕鑰檔案的許可權

重新設定祕鑰檔案許可權:chmod 600 server-key.txt,取消其他使用者Read許可權但是,使用ssh name@domain形式還是沒法直接登入;追其原因,發現因為不是本地直接生成的祕鑰對;所以需要使用ssh-add -K ~/.ssh/xxx.txt[下載公鑰檔案](-K表示永久儲存式,如果不使用者每次開機後需要重新ssh-add),就像是本地生成祕鑰對然後部署到伺服器需要將祕鑰追加到ssh認證檔案一個道理;ssh name@domain可以正常免密登陸啦!(配置這種形式登陸後面pm2需要使用)配置快捷登入(附加)

    1. 進入ssh目錄:cd ~/.ssh
    2. 建立config檔案: touch config
    3. 進入config配置檔案配置:vi config
        Host            lwh            #快捷別名
        HostName        host           #ssh伺服器ip或domain
        Port            port           #ssh伺服器埠,預設為22
        User            root           #ssh伺服器使用者名稱
        IdentityFile    ~/.ssh/server-key.txt    #下載的私鑰檔案
    4. :wq!儲存退出
    5. 完成後可以直接使用:ssh lwh 登陸

在Github上新增Deploy Keys

伺服器生成祕鑰

# 生成ssh key
ssh-keygen -t rsa

# 檢視公鑰內容
cat ~/.ssh/id_rsa.pub

複製祕鑰內容,新增到Github上對應的專案倉庫Settings下的Deploy keys中配置Deploy keys,使得伺服器可以通過ssh拉取專案倉庫;

配置pm2

配置ecosystem.config.js;具體pm2配置及基本使用介紹,戳~使用pm2配置生產環境

module.exports = {
  apps: [
    {
      name: 'back-Api',      //應用名
      script: './server/start.js',   //應用檔案位置
      env: {
        //PM2_SERVE_PATH: "./apidoc",    //靜態服務路徑
        PM2_SERVE_PORT: 8080,   //靜態伺服器訪問埠
        NODE_ENV: 'development' //啟動預設模式
      },
      env_production : {
        PM2_SERVE_PORT: 8080,
        NODE_ENV: 'production'  //使用production模式 pm2 start ecosystem.config.js --env production
      },
      instances:"max",          //將應用程式分佈在所有CPU核心上,可以是整數或負數
      instance_var: "INSTANCE_ID",
      exec_mode: "cluster",
      min_uptime: "30s",
      max_restarts: 10,
      //cron_restart: "40",
      watch:[
        "server",
      ],  //監聽模式,不能單純的設定為true,易導致無限重啟,因為日誌檔案在變化,需要排除對其的監聽
      merge_logs: true,         //叢集情況下,可以合併日誌
    }
  ],
  deploy: {
      production : {
        //配置沒法提供密碼,所以前面需要配置ssh免密碼登入伺服器
        user: 'root',                      //ssh 登陸伺服器使用者名稱
        host: '100.12.102.198',              //ssh 地址伺服器domain/IP
        ref: 'origin/master',             //Git遠端/分支
        repo: '[email protected]',         //git地址使用ssh地址
        path: '/liwenhui/www',       //專案存放伺服器檔案路徑
        "post-deploy": 'npm install && pm2 reload ecosystem.config.js --env production'  //部署後的動作
      }
  }
};

豌豆資源搜尋網站 https://55wd.com 電腦刺繡繡花廠 http://www.szhdn.com

開始部署

開始部署

pm2deployecosystem.config.jsproduction

報錯

appledeMBP:back-server-api apple$ pm2 deploy ecosystem.config.js production
--> Deploying to production environment
--> on host 106.12.132.188
  ○ deploying origin/master
  ○ executing pre-deploy-local
  ○ hook pre-deploy
bash: 第 0 行:cd: /lwh/www/source: 沒有那個檔案或目錄
  ○ fetching updates
  ○ full fetch
bash: 第 0 行:cd: /lwh/www/source: 沒有那個檔案或目錄

  fetch failed

Deploy failed
1

需要先初始化伺服器應用:pm2 deploy ecosystem.config.js production setup,然後:pm2 deploy ecosystem.config.js production