為什么要用pm2?
以前部署項目的方式
從github上下載
打包后通過ssh 或者FTP上傳到服務(wù)器,
在服務(wù)器上找到并解壓縮,放到相應(yīng)的文件夾
使用npm install 安裝依賴 以及編譯css 壓縮js文件等等
刪除壓縮包以及設(shè)置文件夾權(quán)限
運行項目,如果報錯
切換文件夾查看日志文件
在本地修改然后循環(huán)步驟2-7直到完美運行
....
增加一個新功能后者一行代碼
重復(fù)1-8
使用pm2以后的部署方式,當所有配置完成后三行命令
- git push 推送到github或者碼云上
- pm2 deploy ecosystem.json production setup 第一次從github上拉取到服務(wù)器
- pm2 deploy ecosystem.json production 部署并運行 看到 success
- 如果報錯使用pm2 logs 重復(fù)1,3
增加一個新功能后者一行代碼
1. git push
2. pm2 deploy ecosystem.json production
看到pm2 部署你的項目是不是很幸福,以前的工作方式簡直是在透支生命啊智蝠,不到可以提高幸福指數(shù)篇恒,還可以拯救生命。
步驟
1. 在服務(wù)器和本地創(chuàng)建密鑰
2. 安裝node.js pm2
3. 在github上建立倉庫
4. 使用密鑰配置服務(wù)器,本地,github三者無密碼登錄
5. 配置pm2 的部署配置文件
提問提問提問
pm2最原始形態(tài)應(yīng)該就是一個shell腳本,本來一個程序員2個小時就能完成的部署,他卻花費20個小時研究出來一個自動化部署的腳本,然后上傳到社區(qū),參考xxx漫畫
在本地和服務(wù)器創(chuàng)建密鑰
note:
至于說ssh秘鑰登錄原理自行搜索,本文關(guān)注點在于實現(xiàn)步驟
需要在本地電腦和服務(wù)器上裝好git Bash(Mac系統(tǒng)沒用過,好像不用get也行,反正有個終端能執(zhí)行shell就行)
需要在本地和服務(wù)器都要執(zhí)行一邊創(chuàng)建過程,創(chuàng)建過程都是一樣的
檢查電腦中是否已經(jīng)存在ssh key ll -a ~/.ssh 如果現(xiàn)實不存在文件或文件夾則繼續(xù),否則可以跳過也可以重新生成一次(會覆蓋掉以前的ssh key文件)
1. 先在本地創(chuàng)建 ssh key
**ssh-keygen -t rsa -b 4096 -C "郵箱地址"**
然后不需要輸入密碼,直接回車回車(**否則會很麻煩**)
檢查 cd ~ 賬戶下 ~/.ssh文件夾下是否多了3個文件
~/.ssh/id_rsa 私鑰
~/.ssh/id_rsa.pub 公鑰
~/.ssh/know_hosts 主機記錄,第一次登陸之后主機信息,當你敲yes之后會被記錄到這個文件
[站外圖片上傳中...(image-a78263-1533686425155)]
2. 將ssh key 加入代理
eval $(ssh-agent -s) 啟動 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)]
-
最關(guān)鍵的一步就是需要在服務(wù)器上新建一個填寫public key的文件
vim ~/.ssh/authorized_keys對vim使用不熟悉的同學(xué)可以自行搜索
然后使用
cat ~/.ssh/id_rsa.pub 復(fù)制本地的public key 粘貼進去
在操作的過程中可以多開幾個git Bash 鏈接到服務(wù)器以防自己操作失誤又順手關(guān)閉,導(dǎo)致自己都進不去自己的服務(wù)器
打通服務(wù)器與github上的ssh key的鏈接
在服務(wù)器上執(zhí)行 cat ~/.ssh/id_rsa.pub
復(fù)制key粘貼到 你的github賬戶>頭像下找到setttings > SSH >新建key>粘貼
-
測試是否能用
mkdir ~/test cd test git clone 任意倉庫的ssh地址,是ssh地址
[站外圖片上傳中...(image-2ced1e-1533686425155)]
- 測試本地到服務(wù)器的鏈接
ssh userName@xxxx.xxx.xxx.xxx
恭喜你,你已經(jīng)完成了 local <==>yourserver <==> you github 三者 ssh key 的互通
接下來就是配置node pm2 了
我假設(shè)你的本地電腦和服務(wù)器的node,pm2 已經(jīng)安裝完成并能正常運行
- 在本地和github新建一個項目并設(shè)置好,本地項目與github的映射
- 在本地github項目根文件夾下
- new一個ecosystem.json文件
[站外圖片上傳中...(image-f85782-1533686425155)]
{
"apps":[
{
"name":"Website", //項目名稱
"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倉庫 項目ssh地址
"path":"/www/website/production",//服務(wù)器部署地址 需要事先在服務(wù)器上將/www/website/ 新建出來
"ssh_options":"StrictHostKeyChecking=no",
"env":{
"NODE_ENV":"production"
}
}
}
}
- 以上面為模板,將加注釋部分修改為自己的參數(shù)
- 在服務(wù)器上新建
sudo mkdir /www/
sudo mkdir /www/website/
NOTE:
- 由于不是在用戶自己的home文件夾中新建文件所以需要sudo 提升權(quán)限
- 這里有個坑等你們踩過之后再說
- 測試,新建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}/`);
});
-
使用
pm2 deploy ecosystem.json production setup // 第一次部署 //在本地執(zhí)行腳本會在服務(wù)器中 pm2 deploy ecosystem.json production 運行
在跟著該教程做下去會有幾個坑
- 在第一次部署的時候,會遇到權(quá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/