nuxtjs是nodejs服務(wù)器渲染項(xiàng)目招拙,部署在linux服務(wù)器才能最好的發(fā)揮它的作用砸抛,這里介紹下如何用
pm2
發(fā)布。
我們直接使用npm run start
這種方式運(yùn)行的時(shí)候占用了窗口進(jìn)程,也不行進(jìn)行別的交互了骏庸,如果按住了Ctrl + C
就退出了nodejs服務(wù), 當(dāng)然也可以用nohup
直接讓他在后臺(tái)運(yùn)行年叮,不過(guò)這個(gè)都不如pm2
方便具被。pm2是node進(jìn)程管理工具,可以利用它來(lái)簡(jiǎn)化很多node應(yīng)用管理的繁瑣任務(wù)只损,如性能監(jiān)控一姿、自動(dòng)重啟、負(fù)載均衡等跃惫,而且使用非常簡(jiǎn)單叮叹。
步驟
首先你需要執(zhí)行build打包, 不管你是客戶(hù)端打包還是服務(wù)器打包。
一般是:
yarn build #最終執(zhí)行的是 nuxt build
編譯后多出了一個(gè) .nuxt
文件夾爆存,是編譯后的文件
+--components
+--dist
+--mixins
+--views
+-- App.js
// +-- 等等
記住這個(gè)文件夾很重要就完了衬横。
編譯完成之后,服務(wù)端運(yùn)行:
yarn start #實(shí)際上執(zhí)行: node server/index.js
實(shí)際上編譯完成之后,服務(wù)端運(yùn)行只需要下面幾個(gè)文件夾了终蒂,如果創(chuàng)建docker只需要這幾個(gè)文件夾的內(nèi)容即可蜂林。
.nuxt #編譯后的vue代碼,路由等
node_modules #依賴(lài)
server #服務(wù)端入口
static #靜態(tài)資源目錄
nuxt.config.js #配置
package.json #命令所在配置
當(dāng)然我們不能直接執(zhí)行拇泣,要用pm2來(lái)執(zhí)行噪叙。
就一句話(huà)
pm2 start npm --name '項(xiàng)目名' -- run start --watch
運(yùn)行并自動(dòng)重啟。
看看pm2的命令霉翔, 額睁蕾,真的是多,不過(guò)常用的就幾個(gè):
- 最簡(jiǎn)單的啟用一個(gè)應(yīng)用: pm2 start app.js
- 停止:pm2 stop app_name|app_id
- 刪除:pm2 delete app_name|app_id
- 重啟:pm2 restart app_name|app_id
- 停止所有:pm2 stop all
- 查看所有的進(jìn)程:pm2 list
- 查看所有的進(jìn)程狀態(tài):pm2 status
- 查看某一個(gè)進(jìn)程的信息:pm2 describe app_name|app_id
參數(shù)說(shuō)明
- --watch:監(jiān)聽(tīng)?wèi)?yīng)用目錄源碼的變化债朵,一旦發(fā)生變化子眶,自動(dòng)重啟。如果要精確監(jiān)聽(tīng)序芦、不見(jiàn)聽(tīng)的目錄臭杰,最好通過(guò)配置文件
- -i --instances:?jiǎn)⒂枚嗌賯€(gè)實(shí)例,可用于負(fù)載均衡谚中。如果-i 0或者-i max渴杆,則根據(jù)當(dāng)前機(jī)器核數(shù)確定實(shí)例數(shù)目寥枝,可以彌補(bǔ)node.js缺陷
- --ignore-watch:排除監(jiān)聽(tīng)的目錄/文件,可以是特定的文件名磁奖,也可以是正則囊拜。比如--ignore-watch="test node_modules "some scripts"
- -n --name:應(yīng)用的名稱(chēng)。查看應(yīng)用信息的時(shí)候可以用到
- -o --output <path>:標(biāo)準(zhǔn)輸出日志文件的路徑比搭,有默認(rèn)路徑
- -e --error <path>:錯(cuò)誤輸出日志文件的路徑冠跷,有默認(rèn)路徑
- --interpreter <interpreter>:the interpreter pm2 should use for executing app (bash, python...)。比如你用的coffee script來(lái)編寫(xiě)應(yīng)用
所以我們?yōu)榱朔奖銟?biāo)記我們需要給項(xiàng)目一個(gè)名字身诺,然后項(xiàng)目可以自動(dòng)重啟蜜托。所以只需要這樣寫(xiě)既可。
pm2 start npm --name '項(xiàng)目名' -- run start --watch
為了配合自動(dòng)發(fā)布戚长,腳本可以聯(lián)合起來(lái)寫(xiě)
cd /data/mydemo #進(jìn)入項(xiàng)目目錄
git checkout . #丟棄修改
git checkout master #切換到分支
git pull #拉取最新代碼
yarn && yarn project1-build #更新盗冷,執(zhí)行編譯
#檢查是不是已經(jīng)啟動(dòng)過(guò)怠苔,啟動(dòng)過(guò)就重新啟動(dòng), 沒(méi)啟動(dòng)就啟動(dòng)
# 獲取他的pid同廉,如果存在就是一個(gè)正整數(shù), 判斷它存在就可以重啟了
pm2 pid mydemo
if [[ `echo $?` =~ ^-?[0-9]+$ ]]; then
pm2 restart mydemo
exit
fi
pm2 start npm --name mydemo -- run start --watch
如何平滑更新?
上面的發(fā)布方式柑司,pm2重啟可以做到用戶(hù)無(wú)感知迫肖,但是重啟之前有個(gè)編譯的過(guò)程,編譯的時(shí)候會(huì)刪掉dist
文件夾攒驰,這樣就可能導(dǎo)致一些文件路徑失效蟆湖,導(dǎo)致網(wǎng)站無(wú)法的可能性。
1.編譯到新目錄玻粪,一次重啟
每次編譯文件到新文件夾隅津,編譯完成后修改pm2的啟動(dòng)路徑,這樣重啟不會(huì)導(dǎo)致長(zhǎng)時(shí)間不能服務(wù)狀態(tài)劲室。
2.nginx負(fù)載均衡
如果是部署在多臺(tái)服務(wù)器伦仍,利用負(fù)載均衡,一臺(tái)服務(wù)器停止nodejs服務(wù)后很洋,重新編譯啟動(dòng)充蓝。也可以達(dá)到目錄。
參考 不停機(jī)更新:基于 PM2