使用pm2部署項(xiàng)目提高工作效率

為什么要用pm2?

以前部署項(xiàng)目的方式

  1. 從github上下載

  2. 打包后通過ssh 或者FTP上傳到服務(wù)器,

  3. 在服務(wù)器上找到并解壓縮,放到相應(yīng)的文件夾

  4. 使用npm install 安裝依賴 以及編譯css 壓縮js文件等等

  5. 刪除壓縮包以及設(shè)置文件夾權(quán)限

  6. 運(yùn)行項(xiàng)目,如果報(bào)錯(cuò)

  7. 切換文件夾查看日志文件

  8. 在本地修改然后循環(huán)步驟2-7直到完美運(yùn)行

    ....

增加一個(gè)新功能后者一行代碼

  重復(fù)1-8

使用pm2以后的部署方式,當(dāng)所有配置完成后三行命令

  1. git push 推送到github或者碼云上
  2. pm2 deploy ecosystem.json production setup 第一次從github上拉取到服務(wù)器
  3. pm2 deploy ecosystem.json production 部署并運(yùn)行 看到 success
  4. 如果報(bào)錯(cuò)使用pm2 logs 重復(fù)1,3

增加一個(gè)新功能后者一行代碼

1. git push 

   2. pm2 deploy ecosystem.json production 

看到pm2 部署你的項(xiàng)目是不是很幸福,以前的工作方式簡直是在透支生命啊,不到可以提高幸福指數(shù),還可以拯救生命。

步驟

1. 在服務(wù)器和本地創(chuàng)建密鑰
2. 安裝node.js pm2
3. 在github上建立倉庫
4. 使用密鑰配置服務(wù)器,本地,github三者無密碼登錄
5. 配置pm2 的部署配置文件

提問提問提問

pm2最原始形態(tài)應(yīng)該就是一個(gè)shell腳本,本來一個(gè)程序員2個(gè)小時(shí)就能完成的部署,他卻花費(fèi)20個(gè)小時(shí)研究出來一個(gè)自動(dòng)化部署的腳本,然后上傳到社區(qū),參考xxx漫畫

在本地和服務(wù)器創(chuàng)建密鑰

note: 
  • 至于說ssh秘鑰登錄原理自行搜索,本文關(guān)注點(diǎn)在于實(shí)現(xiàn)步驟

  • 需要在本地電腦和服務(wù)器上裝好git Bash(Mac系統(tǒng)沒用過,好像不用get也行,反正有個(gè)終端能執(zhí)行shell就行)

  • 需要在本地和服務(wù)器都要執(zhí)行一邊創(chuàng)建過程,創(chuàng)建過程都是一樣的

  • 檢查電腦中是否已經(jīng)存在ssh key ll -a ~/.ssh 如果現(xiàn)實(shí)不存在文件或文件夾則繼續(xù),否則可以跳過也可以重新生成一次(會(huì)覆蓋掉以前的ssh key文件)

1. 先在本地創(chuàng)建 ssh key

    **ssh-keygen -t rsa -b 4096 -C "郵箱地址"**
    然后不需要輸入密碼,直接回車回車(**否則會(huì)很麻煩**)
    檢查 cd ~ 賬戶下 ~/.ssh文件夾下是否多了3個(gè)文件
      ~/.ssh/id_rsa             私鑰
      ~/.ssh/id_rsa.pub         公鑰
      ~/.ssh/know_hosts    主機(jī)記錄,第一次登陸之后主機(jī)信息,當(dāng)你敲yes之后會(huì)被記錄到這個(gè)文件

[站外圖片上傳中...(image-a78263-1533686425155)]

2. 將ssh key 加入代理

    eval $(ssh-agent -s)     啟動(dòng) ssh-agent
    ssh-add ~/.ssh/id_rsa  將私鑰加入代理中

3. 將公鑰添加到github上

         使用 cat ~/.ssh/id_rsa.pub   查看并復(fù)制公鑰
        登陸你的github賬戶>頭像下找到setttings > SSH >粘貼

4. 測試下是否配置成功

    ssh -T git@github.com
    
    好了已經(jīng)打通了,本地與GitHub之間的無密碼登錄了

服務(wù)器上的操作和本地一樣,在子賬號下使用如下命令,不要在root賬戶下操作

[站外圖片上傳中...(image-cbbc1b-1533686425155)]

  1. 最關(guān)鍵的一步就是需要在服務(wù)器上新建一個(gè)填寫public key的文件
    vim ~/.ssh/authorized_keys

     對vim使用不熟悉的同學(xué)可以自行搜索
    
  2. 然后使用
    cat ~/.ssh/id_rsa.pub 復(fù)制本地的public key 粘貼進(jìn)去

在操作的過程中可以多開幾個(gè)git Bash 鏈接到服務(wù)器以防自己操作失誤又順手關(guān)閉,導(dǎo)致自己都進(jìn)不去自己的服務(wù)器

打通服務(wù)器與github上的ssh key的鏈接

  1. 在服務(wù)器上執(zhí)行 cat ~/.ssh/id_rsa.pub

  2. 復(fù)制key粘貼到 你的github賬戶>頭像下找到setttings > SSH >新建key>粘貼

  3. 測試是否能用

      mkdir ~/test 
      cd test
      git clone 任意倉庫的ssh地址,是ssh地址
    

[站外圖片上傳中...(image-2ced1e-1533686425155)]

  1. 測試本地到服務(wù)器的鏈接
    ssh userName@xxxx.xxx.xxx.xxx

恭喜你,你已經(jīng)完成了 local <==>yourserver <==> you github 三者 ssh key 的互通

接下來就是配置node pm2 了

    我假設(shè)你的本地電腦和服務(wù)器的node,pm2 已經(jīng)安裝完成并能正常運(yùn)行
  1. 在本地和github新建一個(gè)項(xiàng)目并設(shè)置好,本地項(xiàng)目與github的映射
  2. 在本地github項(xiàng)目根文件夾下
  3. new一個(gè)ecosystem.json文件

[站外圖片上傳中...(image-f85782-1533686425155)]

      {
  "apps":[
      {
          "name":"Website",  //項(xiàng)目名稱
          "script":"app.js", //入口文件
          "env":{
              "COMMON_VARIABLE": "true" 
          },
          "env_production" : {
              "NODE_ENV": "production"
            }
      }
  ],
  "deploy":{
      "production":{
          "user":"userName",       // 服務(wù)器登錄用戶名
          "host":["120.xxx.xxx.xxx"], //服務(wù)器ip
          "port":"22",           //ssh 端口如果沒改過為 22          
          "ref":"origin/master",
          "repo":"git@github.com:macheng2017/study.git", //git倉庫 項(xiàng)目ssh地址
          "path":"/www/website/production",//服務(wù)器部署地址 需要事先在服務(wù)器上將/www/website/ 新建出來
          "ssh_options":"StrictHostKeyChecking=no",
          "env":{
              "NODE_ENV":"production"
          }
      }
  }
}
  1. 以上面為模板,將加注釋部分修改為自己的參數(shù)
  2. 在服務(wù)器上新建
    sudo mkdir /www/
    sudo mkdir /www/website/

NOTE:

  1. 由于不是在用戶自己的home文件夾中新建文件所以需要sudo 提升權(quán)限
  2. 這里有個(gè)坑等你們踩過之后再說
  1. 測試,新建app.js 我們就以node.js官網(wǎng)上的示例
const http = require("http");

const hostname = "0.0.0.0";
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader("Content-Type", "text/plain");
  res.write('Hello world');
  res.end();
});
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});
  1. 使用

     pm2 deploy ecosystem.json production setup // 第一次部署
     //在本地執(zhí)行腳本會(huì)在服務(wù)器中
     pm2 deploy ecosystem.json production  運(yùn)行
    

在跟著該教程做下去會(huì)有幾個(gè)坑

  1. 在第一次部署的時(shí)候,會(huì)遇到權(quán)限問題,還是因?yàn)槭褂玫氖亲淤~號新建的 /www/website/ 權(quán)限不夠 使用 chmod 777 website 修改權(quán)限即可

參考:

https://help.github.com/articles/connecting-to-github-with-ssh/
http://pm2.keymetrics.io/docs/usage/deployment/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。