[Nodejs] PM2 & Nuxt 零停機部署

想吃燒肉
Jan 5, 2023

--

對宅宅工程師來說,武漢肺炎並不可怕,可怕的是那些薪水不足以支付你的股票交割金

零停機部署(Zero Downtime Deployment)

意思是你有 4 個正在運行的實例(instances),您可以一次重新加載一個實例,當一個實例正在重新加載時,其他 3 個實例將使服務器保持活動狀態。因此,您可以更新您的網絡服務器,而無需離線甚至一秒鐘

這邊介紹的是 PM2 & Nuxt 的用法。
對於大部分工程師來說,設置和使用 PM2 cluser 非常容易,但是我們嘗試在我們的 nuxt server 上使用卻會遇到了一些問題。

首先,創建我們的 nuxt 服務器:

$ pm2 start npm --name MyAppName -- start

但是在嘗試啟動多個實例時,我們很快就會遇到問題。

現在雖然這是默認在 PM2 的fork模式下運行,但即使我們指定在cluster 模式下運行,我們仍然會遇到錯誤。

如果我們只使用 1 個實例並嘗試重新加載服務器怎麼辦?好吧,由於 Nuxt 在後台的工作方式,如果我們嘗試在服務器運行時重建服務器,在刪除構建文件並為新構建重新散列後,我們將遇到 404 錯誤。如果我們的靜態文件夾中的文件被更改,我們也會遇到問題。

那麼如果我們不能只是重建和重新加載一個服務器,我們也不能運行多個實例,那麼我們如何實現零停機部署?

nuxt-start: https://www.npmjs.com/package/nuxt-start

我們可以在目錄底下建立一個檔案 ecosystem.config.js

# ecosystem.config.js
module.exports = {
apps : [{
name : '[prod] MyAppName', // App name that shows in `pm2 ls`
exec_mode : 'cluster', // enables clustering
instances : 4, // or max
script : './node_modules/nuxt-start/bin/nuxt-start.js',
// The magic key
}]
};

啟動方式

$ pm2 start ecosystem.config.js

搞定!現在可以生成 Nuxt 服務器的多個實例以獲得更好的性能,並利用零停機時間部署在更新期間保持網站在線。

參考

--

--

想吃燒肉
想吃燒肉

Written by 想吃燒肉

我喜歡燒肉,只是個宅男, Web 前後端略懂,歡迎大家跟我討論。

No responses yet