在發布任何 Web 應用程式之前,您應該先問自己幾個問題
sails.log()
與像 Papertrail 這樣的託管服務結合使用?NODE_ENV
環境變數設定為 "production" 的情況下於本機啟動?(一個快速測試方法是執行 NODE_ENV=production node app
(或作為捷徑:sails lift --prod
)。)您可以透過幾種不同的方式提供僅在生產環境中應用的配置。大多數應用程式發現自己混合使用環境變數和 config/env/production.js
。無論您如何進行,本節和文件中的擴展章節涵蓋了您在進入生產環境之前應檢閱的配置設定。
Node.js 相當快速。對於許多應用程式來說,一台伺服器就足以處理預期的流量—至少一開始是這樣。
本節重點介紹單一伺服器 Sails 部署。這種部署方式在規模上本質上是有限的。請參閱擴展以獲取有關在負載平衡器後部署您的 Sails/Node 應用程式的資訊。
許多團隊決定在負載平衡器或代理伺服器(在像 Heroku 或 Now 這樣的 PaaS 中,或者在 nginx 伺服器後)後部署其生產應用程式。這通常是正確的方法,因為它有助於在您的可擴展性需求發生變化並且您需要新增更多伺服器時,為您的應用程式提供未來的保障。如果您正在使用負載平衡器或代理伺服器,則可以忽略以下列表中的一些事項
如果您的應用程式使用 sockets 並且您正在使用 nginx,請務必將其配置為將 websocket 訊息中繼到您的伺服器。您可以在 nginx 關於該主題的文件中找到有關代理 WebSockets 的指南。
NODE_ENV
環境變數設定為 'production'
將您應用程式的環境配置設定為 'production'
會告訴 Sails 進入備戰狀態—也就是說,您的應用程式正在生產環境中執行。這是目前為止最重要的一步。如果您只有時間在部署您的 Sails 應用程式之前更改一個設定,那應該是這個設定!
當您的應用程式在生產環境中執行時
migrate: 'safe'
。這是一種安全機制,可防止在部署期間意外損壞您的生產資料。.css
和 .js
檔案,以減少頁面載入時間並降低頻寬消耗。res.serverError()
的錯誤訊息和堆疊追蹤仍然會被記錄,但不會在回應中傳送(這是為了防止潛在的攻擊者存取任何敏感資訊,例如加密的密碼或您的 Sails 應用程式在伺服器檔案系統上的位置路徑)。注意:如果您以其他方式將
sails.config.environment
設定為'production'
,那完全沒問題。只需注意 Sails 要么會自動為您將NODE_ENV
環境變數設定為'production'
,要么它會記錄警告—所以請密切注意控制台!這個環境變數如此重要的原因是它是 Node.js 中的通用慣例,無論您使用的是哪個框架。Sails 中的內建 middleware 和相依性期望NODE_ENV
在生產環境中設定,否則它們會使用其效率較低的程式碼路徑,這些路徑僅為開發使用而設計。
sails.config.sockets.onlyAllowOrigins
值如果您為您的應用程式啟用了 sockets(也就是說,您已安裝 sails-hook-sockets
模組),那麼為了安全起見,您需要將 sails.config.sockets.onlyAllowOrigins
設定為應該允許透過 websockets 連接到您的應用程式的來源陣列。您可能會在應用程式的 config/env/production.js
檔案中設定此項。請參閱socket 配置文件以獲取有關 onlyAllowOrigins
的更多資訊。
無論是透過使用 sails_port
環境變數、設定 --port
命令列選項,還是更改您的生產配置檔案,都將以下內容新增到您的 Sails 配置的頂層
port: 80
如上所述,如果您的應用程式將在負載平衡器或代理伺服器後執行,請忽略此步驟。
如果您的所有應用程式模型都使用預設資料儲存區,那麼設定您的生產資料庫就像在 config/env/production.js 檔案中使用正確的設定配置 sails.config.datastores.default
一樣簡單。
如果您的應用程式使用多個資料庫,您的流程將會類似。對於應用程式使用的每個資料儲存區,在 config/env/production.js 中的 sails.config.datastores
字典中新增一個項目。
請記住,如果您正在使用版本控制(例如 git),那麼如果您將任何敏感憑證(例如資料庫密碼)包含在您應用程式的配置檔案中,它們將被簽入到儲存庫中。解決此問題的常見方法是將某些敏感配置設定作為環境變數提供。請參閱配置以獲取更多資訊。
如果您正在使用關聯式資料庫(例如 MySQL),則還有一個額外的步驟。還記得 Sails 如何在生產環境中執行時將您的所有模型設定為 migrate:safe
嗎?這表示在啟動應用程式時不會執行自動遷移...這表示預設情況下您的資料表將不存在。在首次設定 Sails 應用程式的關聯式資料庫時,處理此問題的常見方法如下
frenchfryparty
)。'production'
,並將您的模型的配置設定保留為 migrate: 'alter'
。現在執行一次 sails lift
-- 當本機伺服器完成啟動後,終止它。如果這讓您感到緊張,或者您無法遠端連線到生產資料庫,您可以跳過上述步驟。相反,只需轉儲您的本機 schema 並將其匯入到生產資料庫中即可。
防止 CSRF 是 Sails 應用程式的重要安全措施。如果您尚未在啟用 CSRF 保護的情況下進行開發(請參閱 sails.config.security.csrf
),請務必在進入生產環境之前啟用 CSRF 保護。
如果您的 API 或網站執行任何需要身份驗證的操作,您應該在生產環境中使用 SSL。要配置您的 Sails 應用程式以使用 SSL 憑證,請使用 sails.config.ssl
。
如上所述,如果您的應用程式將在負載平衡器或代理伺服器後執行,請忽略此步驟。
部署的最後一步實際上是啟動伺服器。例如
NODE_ENV=production node app.js
或者,如果您更習慣使用命令列選項,您可以使用 --prod
node app.js --prod
# (Sails will set `NODE_ENV` automatically)
如您所見,在生產環境中,您應該使用 node app.js
而不是 sails lift
來啟動您的 Sails 應用程式。這樣,您的應用程式只需運行捆綁在您的 Sails 應用程式中的 app.js
檔案(執行相同的操作),而不是依賴於存取 sails
命令列工具。
除非您部署到像 Heroku 這樣的 PaaS,否則您會想要使用像 pm2
或 forever
這樣的工具,以確保您的應用程式伺服器在崩潰時會重新啟動。無論您選擇哪個守護程式,您都會希望確保它按照上述方式啟動伺服器。