2012-02-07 56 views
2

所以我必須在生產幾臺機器正在運行在機架頂部的西納特拉應用。通常情況下,所有的事情都是蠢蠢欲動的,直到Puppet - 我們用來將更改同步到我們的服務器 - 注意到項目的Gemfile.lock已更改,因此需要發出命令bundle install --binstubs --deployment,以便我們獲得新的寶石。發生這種情況時,任何http請求在調用Bundler來請求我們的寶石時都會導致500錯誤,因爲新的寶石尚未安裝。架:在`束捆紮機:: GemNotFound錯誤安裝--deployment`

我們通常至少有一個機架過程遊逛由於另一個進程定期發出HTTP請求,以確保服務器是活的,但是當這種情況發生,沒有貨架的過程活着。如果問題出現在新實例中,PassengerMinInstances指令可能會有所幫助,但我們也有一個定期提取頁面以測試服務器仍然運行的進程,所以至少應該有一個Rack進程處於活動狀態以處理請求。

我應該注意到,在bundle install完成之後,木偶並沒有真正重新啓動Rack(通過touch重新啓動restart.txt文件),因此我們的Rack進程在此時會消失時間。有沒有人遇到過這樣的事情?是否有一些Rack選項不能在我忽略的每個請求中重新加載整個環境?

回答

0

爲後人的緣故,我來回答這個問題。作爲部署的一部分,所有文件都被chown -R所觸及,它更新文件的ctime(但不是mtime)。 Passenger中還有一個有趣的bug/feature,他們將在/tmp/restart.txt文件的mtime或ctime更改時重新啓動服務器。

解決方案:停止部署期間chowning的目錄。

1

我知道這並不直接回答你的問題,但我已經在過去做了繞過這種情況發生的事情是用軟鏈接指向他們和部署應用程序到版本號迪爾斯(Nginx)代理服務器將請求路由到鏈路。在部署結束時,部署腳本將鏈接指向新應用程序。

它似乎工作不夠好,對我來說,如果事情真的出問題,你可以隨時手動重新指向的鏈接返回到以前的版本。

+0

有趣。如果您不介意對每個應用程序進行全面檢出(可能還有相關的寶石),那麼這不是一個糟糕的解決方案。如果你經常部署,那麼這是一個很大的帶寬。 – tjarratt 2012-02-07 03:24:27