在這裡要探討關於 node 到底適不適合在正式環境運行,在一開場首先說明我**“過去”**對於這個問題的看法,答案是:不適合。
原因在於,過去有見過幾個專案是由 node 開發,最終都因為穩定性不佳造成極大的損失的案例
當然,這經驗確實是我常建議團隊不要輕易決定使用 node 的原因。
事實上,為什麼 node 不適合在正式環境運行。針對這個問題其實真的探討過的人很少。
這裡參考 Burke Holland 所彙整的一些方法,進行來聊聊這個議題:
首先,關於造成 node 不適合的一些狀況進行探討:
如果透過 Express server 直接運行主機環境
會有兩類型的問題可能發生
第一種情況是在開發環境,任何變更 code 之後,都必須再重啟服務。
(事實上,沒有其他監控 process 機制,直接使用 node server 運行,是相當危險的做法)
針對這個狀況,常見會透過 supervisor 或 nodemon 來管理這些進程,監視我們的服務變更時可以重整 server 。
第二種情況是,如果在瀏覽一個不存在的頁面或檔案,會直接暴露錯誤訊息。接著會間接造成在 terminal 中所執行的 server 同時也會被關閉。
確實,這個坑基本上是多數有用過 node 的人都會經歷過。
通常,基於上述原因讓多數人直覺反應不應該將 Node 在正式環境運行。
但事實上,有些知名公司仍使用 Node 運行在正式環境,他們是怎麼做到的?
在這裡,接續探討一些如何在正式環境運行 node 的方法
前面提到,在測試環境中,我們可以使用 supervisor 或 nodemon 來輔助運行。
在正式環境中,則建議使用 pm2
pm2 是一個 Node 進程管理器,可以直接透過 npm 來安裝在 global 環境。
可以直接透過pm2 start 來運行 node
例如:
"scripts": {
"start": "pm2 start index.js",
"dev": "npx supervisor index.js"
}
pm2 會在背境運行監控,當服務發生 crash 他會自動 restart,
並且可以透過 pm2 log 0, 這裡的 0 表示為 {process id} ,可以用來查看他的日誌
pm2 log 0
另外,可以再加上 —watch 來監看 file 變化時,刷新服務
"scripts": {
"start": "pm2 start index.js --watch",
"dev": "npx supervisor index.js"
}
由於 pm2 是在背景運行,無法直接透過 ctrl + c 停止,必須透過以下語法
pm2 stop 0
//or
pm2 stop index
如果要直接刪除進程,則直接用 delete
pm2 delete
//or
pm2 delete index
此外,pm2 也可以做負載平衡設定,自動進行 balance,也可以同時運行多個 instances
但是,真對 pm2 雖然解決多數通點,但仍有一些說法提到可能會造成的一些問題,例如:
不應該透過 Node 來監控 Node
針對這點,有人提出的解決方法是透過更高層次的方式來處理,例如透過kubernetes cluster 來處理運行的事情。
另外,在 Azure 直接運行 node , 當系統發生 crash 之後,會再重新啟動,原因在於 Azure 是以 container 方式運行你的 app。
但是,如果只有運行一個 instance 的情況,當發生 crash 就會有一個短暫時間會發生服務無法使用的情況,因此多個 instance 做balance 還是有必要。可以透過 Azure Front Door 做 load balance。
也有建議是透過 systemd 來運行
針對以上探討方式,其實間接說明在正式環境還是可以運行 Node 對於有這方面需求的開發者,可以再針對有興趣的部分再進行延伸了解。
參考: