科普文:為什麼不能在伺服器上 npm install ?

科普文:為什麼不能在伺服器上 npm install ?

來自專欄 Node.js201 人贊了文章

## 背景

Node.js 很簡單,容易上手。但也因此缺乏不少規範,使用者水平參差不齊。

最近經常看到的一個問題是:很多新手,在部署的時候,是直接在伺服器上 npm install ,這是非常不推薦的。


## 先拋結論

鑒於評論區的情況,把本文的主要觀點提煉到前面:

  • 不能在線上多台伺服器上去安裝依賴。(不管你鎖還是沒鎖版本)
  • 依賴必須是在 CI 或 打包機 上去安裝並打包。
  • 打包方式可以是壓縮包,也可以是 Docker 鏡像(推薦)。

## 存在的問題

1. 無法確定唯一性

因為安裝是有較大的網路耗時的,所以你甚至無法保證集群情況下,兩台伺服器上npm install 下來的包是一模一樣的。

如果某個庫剛好更新了,並且它有 BUG,然後你就是百思不得其解:一定概率出某個問題。排查起來簡直想死。

當然,很多人為了解決這個問題,就選擇「鎖版本」這個方案。

評論區的同學,不要急,看完下面第 2 點,即使鎖版本也是在 CI 上 install 而不是伺服器上。

鑒於 「鎖版本」屬於 「屎色自行車問題」 ,這裡不想討論。

我們的觀點參見:「知乎專欄 - 死馬:為什麼我不使用 shrinkwrap(lock)」。

2. 上線耗時久,無法快速回滾

上線後,發現線上故障,要快速回滾止血的時候,就懵逼了:

  1. 要等待依賴安裝,萬一網路有個抖動啥的,妥妥的 P4 故障變為 P0 故障,年終獎沒了。
  2. 萬一問題是底層依賴導致的,回滾也沒用。
  3. npm cache 解決不了問題,如機器擴容的時候。

## 推薦方案

知乎圖片查看體驗差,請點擊大圖,清晰點

其中,關鍵點是:在構建期就把依賴打包進去。

優點:

  • 解壓即可立刻啟動,無需等待網路耗時。
  • 能保證肯定是可以運行的,因為此時依賴都是確定好的,且經過 CI 單測保障的。
  • 可以快速回滾,止血。
  • 打包方式可以是 tar 或 docker。(推薦後者)

缺點:

  • 包體積大(但其實存儲不值錢。。。)

知乎圖片查看體驗差,請點擊大圖,清晰點

上圖是用 PlantUML 在語雀繪製的,想享受類 Markdown 的體驗來畫流程圖,就用 PlantUML


## 如何實施?

那有同學就要問了:我是小公司,不像你們有這些基建可以服務,怎麼辦?

其實成本真的很低:

  • 代碼倉庫 GitLab 自帶 CI 了,你只需要寫個配置文件,觸發自動構建即可。(或 Jenkins)
  • 然後把構建後的文件,找個地方存儲,如 OSS 。
  • 伺服器部署的話,有運維發布系統最好,沒有的話,自己寫個 shell 把 OSS 文件下載解壓。
  • 當然,很多雲服務都支持 Docker 鏡像了,那就更簡單了。

## 廣告區

  • 更好的閱讀體驗請訪問 語雀版 。
  • 如果喜歡我的文章,請關注 我的知乎 和 Follow GitHub
  • 廣州阿里遊戲,招前端,熟悉動效,Node 的速來~

推薦閱讀:

如何看待Docker改名為Moby?
現在國內、國際市場上有哪些docker的容器管理平台?
DaoCloud是一家什麼樣的公司?
基於OSS搭建私有(跨區域)Docker鏡像倉庫
基於Docker、Registrator、Zookeeper實現的服務自動註冊

TAG:eggjs | Nodejs | Docker |