科普文:為什麼不能在伺服器上 npm install ?
07-12
科普文:為什麼不能在伺服器上 npm install ?
來自專欄 Node.js201 人贊了文章
## 背景
Node.js 很簡單,容易上手。但也因此缺乏不少規範,使用者水平參差不齊。
最近經常看到的一個問題是:很多新手,在部署的時候,是直接在伺服器上 npm install
,這是非常不推薦的。
## 先拋結論
鑒於評論區的情況,把本文的主要觀點提煉到前面:
- 不能在線上多台伺服器上去安裝依賴。(不管你鎖還是沒鎖版本)
- 依賴必須是在 CI 或 打包機 上去安裝並打包。
- 打包方式可以是壓縮包,也可以是 Docker 鏡像(推薦)。
## 存在的問題
1. 無法確定唯一性
因為安裝是有較大的網路耗時的,所以你甚至無法保證集群情況下,兩台伺服器上npm install
下來的包是一模一樣的。
如果某個庫剛好更新了,並且它有 BUG,然後你就是百思不得其解:一定概率出某個問題。排查起來簡直想死。
當然,很多人為了解決這個問題,就選擇「鎖版本」這個方案。
評論區的同學,不要急,看完下面第 2 點,即使鎖版本也是在 CI 上 install 而不是伺服器上。
鑒於 「鎖版本」屬於 「屎色自行車問題」 ,這裡不想討論。
我們的觀點參見:「知乎專欄 - 死馬:為什麼我不使用 shrinkwrap(lock)」。
2. 上線耗時久,無法快速回滾
上線後,發現線上故障,要快速回滾止血的時候,就懵逼了:
- 要等待依賴安裝,萬一網路有個抖動啥的,妥妥的 P4 故障變為 P0 故障,年終獎沒了。
- 萬一問題是底層依賴導致的,回滾也沒用。
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實現的服務自動註冊