在 Ruby 開發環境最常用的 Deploy 工具就是 Capistrano,讓開發者可以快速部署程式碼,在部署進行中,由於大量的 js 及 css 需要處理,所以花最長的時間就是 assets:precompile
,執行 cap deploy
就會發現卡在底下錯誤訊息
** [whenever:update_crontab] exception while rolling back: Net::SSH::Disconnect, connection closed by remote host *** [deploy:update_code] rolling back * executing “rm -rf /home/deploy/nami/releases/20150317135422; true” servers: [“xxxxx.tw”] ** [deploy:update_code] exception while rolling back: Net::SSH::Disconnect, connection closed by remote host
遇到這問題顧名思義就是 ssh timeout,造成原因就是由於 assets:precompile
執行時間過長,所以 Client 端的 ssh 就斷線,要解決這其實不難,請在 Server 端的 sshd 設定檔加入底下參數
ClientAliveInterval 120 ClientAliveCountMax 3
我們來看看 ClientAliveInterval 跟 ClientAliveCountMax 分別代表什麼意思,ClientAliveInterval
以上面例子來說,就是如果 120 秒內沒有收到 Client 端任何訊息,則 Server 會透過加密通道發送 Requerst 並且等待 Client 回應,而 ClientAliveCountMax
的用途就是,如果 120 秒沒收到回應,則繼續發送 Request 的次數,所以看到上面設定,就可以知道 120 * 3 秒後都沒有收到 Client 回應,則 SSH Server 就會強迫斷線,也就是會看到 Net::SSH::Disconnect
。SSH 的設定檔位置為 /etc/ssh/sshd_config
,完成後請記得重新啟動 sshd。
伺服器設定完成後,我們來看看 Client 端也要設定,請打開 /etc/ssh/ssh_config
輸入底下參數
ServerAliveInterval 120
讓 Client 端,每 120 秒可以送 response 給 Server 端,這樣就可以保持 ssh 連線。
參考:SSH Connection Closed While Deploying With Capistrano