2008-09-30 77 views
5

我有一個在nginx下運行的三個mongrels羣集,我使用Capistrano 2.4.3部署應用程序。當我在運行系統時進行「cap deploy」時,其行爲如下:Capistrano沒有正確地重新啓動Mongrel羣集

  1. 該應用程序已部署。代碼已成功更新。
  2. 在帽部署輸出,有這樣:

    • 執行「命令-p '須藤密碼:' mongrel_rails簇::重啓-C /無功/網絡/軌道/ MyApp的/當前/配置/ mongrel_cluster.yml」
    • 服務器:[ 「MYIP」]
    • [MYIP]執行命令
    • ** [出:: MYIP]停止端口9096
    • ** [出:: MYIP]停止港口9097
    • ** [出:: MYIP]停止端口9098
    • ** [出:: MYIP]已經開始端口9096
    • ** [出:: MYIP]已經開始端口9097
    • ** [出:: MYIP]已經開始端口9098
  3. 我立即檢查服務器上,發現雜種仍在運行,以及PID文件仍在爲前三個實例。
  4. 不久後(不到一分鐘),我發現Mongrel不再運行,PID文件不見了,並且重啓失敗。
  5. 如果我手動啓動服務器上的mongrel,應用程序啓動就好了。

好像「mongrel_rails集羣::重啓」嘗試在集羣的重新啓動之前未正確等待一個句號 。如何診斷和解決此問題?

編輯:這裏的答案:

mongrel_cluster,在「重啓」任務,只要做到這一點:

def run 
    stop 
    start 
end 

它沒有做任何等待或檢查,看看該程序前退出調用「開始」。這是a known bug with an outstanding patch submitted。我將這個補丁應用於Mongrel Cluster,問題消失了。

回答

4

你可以明確地告訴mongrel_cluster配方中加入你的食譜Capistrano的下一個開始前刪除進程文件:

# helps keep mongrel pid files clean 
set :mongrel_clean, true 

這將導致它傳遞--clean選項mongrel_cluster_ctl。

我回去看看我的一個部署食譜,並注意到我也改變了我的重啓任務的工作方式。看看在雜種用戶組中的下列信息:

mongrel users discussion of restart

以下是我的部署:重新啓動任務。我承認這有點破解。

namespace :deploy do 
    desc "Restart the Mongrel processes on the app server." 
    task :restart, :roles => :app do 
    mongrel.cluster.stop 
    sleep 2.5 
    mongrel.cluster.start 
    end 
end 
+0

這是正確的道路。看到我的編輯問題:有一個修補mongrel_cluster修補行爲的補丁。 – Pete 2008-10-02 16:53:12

0

我討厭這麼基本,但聽起來好像pid文件在試圖啓動時仍然處於閒置狀態。確保雜種被用手擋住。用手清理pid文件。然後做一個帽子部署。

1

首先,通過調用cap deploy:restart縮小您的測試範圍。您可能想通過--debug選項在遠程執行前提示或--dry-run選項只是爲了在調整設置時看到發生了什麼。

乍一看,這聽起來像是對pid文件或混雜進程的權限問題,但很難確定。這吸引了我的眼睛有兩件事情是:

  • :runner變量被明確地設置爲nil - 有沒有這種特定的原因是什麼?
  • Capistrano 2.4引入了:admin_runner變量的新行爲。沒有看完整個配方,這可能與你的問題有關?

    :主場迎戰亞軍:admin_runner(從capistrano 2.4 release) 一些封口機已經注意到,有部署:安裝和部署:清理運行爲:亞軍用戶搞砸了他們精心製作的權限。我同意這是一個問題。在此版本中,部署:啓動,部署:停止並部署:重新啓動所有在sudoing時繼續使用:runner用戶,但部署:安裝和部署:清除將使用:admin_runner用戶。 admin_runner變量在默認情況下是未設置的,意味着這些任務將以root身份登錄,但是如果您希望他們以runner身份運行,只需執行「set:admin_runner,runner」即可。

我對下一步該怎麼做的建議。手動停止雜種並清理PID。手動啓動雜種。接下來,在調試問題時繼續運行cap deploy:restart。必要時重複。

+0

感謝瑞安。我想你讓我失去了知覺。當我解決問題時,我會跟進。 – Pete 2008-10-01 02:40:09

1

無論哪種方式,我的雜種都在上一個停止命令完成之前開始關閉。

睡眠2.5不是一個好的解決方案,如果停止所有正在運行的雜種需要2.5秒以上的時間。

似乎有需要:

stop && start 

stop; start 

(這是怎麼了慶典的作品,& &等待第一個命令完成W/O錯誤,而「;」只是運行下一個命令)。

我不知道是否有一個:

wait cluster_stop 
then cluster_start 
+0

看看這個:http://rubyforge.org/tracker/index.php?func=detail&aid=19657&group_id=1336&atid=5291 – Pete 2008-12-02 18:46:33