2014-02-20 153 views
2

我正在尋找以一致和及時的方式將一些Web服務部署到生產環境中的方法。NodeJS生產部署最佳實踐

我目前正在實施一個部署管道,該管道將以特定版本的軟件的手動部署操作結束到由Ansible提供的多個虛擬機。這個想法是使用版本A配置x個實例,同時已經有y個運行版本B的實例。然後映射並輕拂流量。同樣的機制應該允許我使用我已經制作的圖像在一個集合中縮放新的vms。

我已經考慮了以下選項,但如果有件事我俯瞰想知道:

  1. TGZ

的CI環境會從已經通過單元測試和一個項目建立一個壓縮包集成測試。可選擇的將會被捆綁(取消需要在生產機器上運行npm install並依賴到公共或專用npm存儲庫的網絡連接)。

我的主要問題是,依賴於系統庫的任何依賴關係都會建立在不同的機器上(儘管是相同的圖像)。我不喜歡這個。

  1. NPM

的CI環境將發佈私人NPM庫和Ansible部署腳本設置之後會檢查出一個特定版本。當您想要部署時,這又會受到對外部服務的依賴。我不喜歡這個。

  1. GIT中

任何系統依賴模塊成爲全球安裝爲配置的一部分,並且所有其他依賴檢入到存儲庫。這使我能夠靈活地進行差異部署,只需推動增量,應用程序守護進程幾乎可以立即由進程管理器自動重新啓動。依賴關係然後被絕對鎖定。

這將意味着除非進行縮放,否則不需要旋轉新的虛擬機。部署可以直接推送到所有活動實例。

回答

1

首先,無論部署方法如何,您都需要確保在部署新代碼時不會丟棄請求。一種簡單的方法是在切換之前從負載平衡器中刪除節點。在此之前,您可能還想嘗試評估是否存在掛起的請求,打開的連接或由於提前終止而受到負面影響的其他任何事情。或者可能類似up模塊。

大多數人不會推薦源代碼控制你的模塊。看起來你的node_modules已經從npm install填入了.tgz,而在你的package.json中使用bundledDependencies聲明可能會涵蓋你的所有顧慮。通過這種方法,節點上的npm install將不會再次下載並安裝所有內容。雖然,它會重建節點gyp實現,這可能會覆蓋您的系統庫關注點。

您還可以利用git標籤更容易地跟蹤具有特定依賴性和有效載荷的版本。手動部署代碼可能非常乏味,您可能需要考慮自動執行例程,同時從接口迭代數據庫中已知的x個已知服務器條目。 docker.io可能是有趣的。