在這裡要探討關於 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 對於有這方面需求的開發者,可以再針對有興趣的部分再進行延伸了解。

參考:

https://medium.freecodecamp.org/you-should-never-ever-run-directly-against-node-js-in-production-maybe-7fdfaed51ec6