以前的一篇文章是爲了解決問題而寫的,不少東西都沒有介紹清楚,這一篇文章就是完整介紹一下 Capistrano,主要的參考來源是 Modern PHP 這本書。nginx
Capistrano 是用於自動部署應用的軟件,能讓部署變得簡單、可預知結果和可逆。Capistrano 運行在本地設備中,經過 SSH 與遠程服務器通訊。Capistrano 原本是爲了部署 Ruby 應用而開發的,不過對任何編程語言開發的應用都有用,包括 PHP。web
Capistrano 安裝在本地設備中。部署 PHP 應用時,Capistrano 會在本地設備中執行 SSH 命令,與遠程服務器通訊。Capistrano 會在遠程服務器中保存以前部署的應用,並且每次部署的版本放在各自的目錄中。Capistrano 會維護五個或更多以前部署的應用,以防須要回滾到早期版本。Capistrano 還會建立一個 current/
目錄,經過符號連接指向當前部署的應用所在的目錄。在生產服務器中,Capistrano 管理的目錄結構可能像下圖這樣:數據庫
home/ deploy/ apps/ my_app/ current/ releases/ release1/ release2/ release3/ release4/
把新版應用部署到生產環境時,Capistrano 首先從應用的 Git 倉庫獲取最新版代碼,而後把應用的代碼放到 releases/
目錄中的一個新子目錄中,最後把 current/
目錄的符號連接指向這個新目錄。讓 Capistrano 回滾到以前的版本時,Capistrno 會把 current/
目錄的符號連接指向 releases/
目錄中存檔以前版本的目錄。Capistrano 是一種優雅且簡單的部署方案,能讓 PHP 應用的部署過程變得簡單、可預知和可逆。編程
Capistrano 應該安裝在本地設備中,別在遠程服務器中安裝。安裝時還須要 ruby 和 gem。OS X 系統已經有了。Ubuntu 用戶能夠直接用下面的命令安裝:api
sudo apt-get install ruby sudo apt-get install gem
安裝好以後,執行下面命令安裝 Capistrano:ruby
gem install capistrano
安裝 Capistrano 以後,爲了使用 Capistrano,必須初始化項目。打開終端,進入項目的根目錄,執行下面的命令:服務器
cap install
這個命令會建立 Capfile 文件,config/ 目錄和 lib/ 目錄。如今,項目目錄結構應該以下所示:架構
Capfile config/ deploy/ production.rb staging.rb deploy.rb lib/ capistrano/ tasks/
Capfile 是 Capistrano 的中央配置文件,會聚合 config/ 目錄中的配置文件。 config/ 目錄中存放的是各個遠程服務器環境(例如,測試環境、過渡環境或生產環境)的配置文件。app
默認狀況下,Capistrano 假設你爲應用搭建了多個環境。例如,可能有單獨的過渡環境和生產環境。Capistrano 在 config/deploy/
目錄中爲每一個環境都提供了單獨的配置文件。Capistrano 還提供了 config/deploy.rb
配置文件,這個文件用於保存全部環境通用的設置。composer
在每一個環境中,Capistrano 會區分服務器的角色。例如,生產環境可能有前置 Web 服務器(web角色),應用服務器(app角色)和數據庫服務器(db角色)。只有最大規模的應用纔有必要使用這種架構,小型 PHP 應用通常在同一臺設備中運行 Web 服務器(nginx)、應用服務器(PHP-FPM)和數據庫服務器(MariaDB)。
這篇文章的例子中,我使用的是 web 角色,和生產環境的配置。
這個配置文件包含全部環境通用的配置。打開這個文件,而後更新下列設置:
/home/deploy/apps/my_app
。這個文件只包含生產環境的設置。這個文件用於定義生產環境的角色,列出屬於各個角色的服務器。咱們只使用 web 角色,並且只有一個服務器屬於這個角色。因此,這是,把該文件所有內容替換爲下列代碼便可:
role :web, %w(deploy@123.123.123.123)
使用 Capistrano 部署應用以前,咱們必須在本地電腦和遠程服務器之間,以及遠程服務器和 Git 倉庫之間創建認證。在以前的文章中 [[Blog:設置 SSH Key 登陸服務器和 Git 服務器]] 已經討論瞭如何使用 SSH 密鑰登陸服務器和 Git 服務,使用以前討論的方法在每臺遠程服務器中生成 SSH 公鑰和私鑰。Git 倉庫應該能訪問每臺遠程服務器的公鑰。Github 容許在用戶帳戶中添加多個 SSH 公鑰。總之,咱們必須不使用密碼就能把 Git 倉庫克隆到遠程服務器。
就快能部署環境了,但在此以前,還須要準備遠程服務器。咱們要經過 SSH 登陸遠程服務器,建立一個目錄,存放部署的 PHP 應用。deploy 用戶必須有這個目錄的讀寫權限。我喜歡在 deploy 用戶的主目錄中建立這個目錄:
/home /deploy apps/ my_app/
Capistrano 會建立符號連接,把 current/
目錄指向存放當前應用版本的目錄。所以,咱們要更新 Web 服務器的虛擬主機文檔根目錄,指向 Capistrano 的 current/ 目錄。根據上述文件系統的結構圖,要把虛擬主機的文檔根目錄改成 /home/deploy.apps.my_app/current/public/
。這麼設置的前提是,假設 PHP 應用中有個 public/ 目錄,把它當作文檔根目錄。而後重啓 Web 服務器,加載修改後的虛擬主機配置。
遠程服務器不須要 Capistrano,可是須要 Git。並且還須要運行 PHP 應用所須要的所有軟件。
Capistrano 容許在部署應用過程當中的特定時刻執行咱們指定的命令。不少 PHP 開發者都使用 Composer 管理應用的依賴。每次使用 Capistrano 部署應用時,咱們可使用 Capistrano 的鉤子安裝 Composer 依賴,打開 config/deploy.rb 文件,添加下面的 ruby 代碼:
namespace :deploy do desc "update composer package" after :updated, :build do on roles(:web) do within release_path do execute :composer, "install --no-dev --quiet" execute :cp, "-rfv ../../shared/configs ./application/" end end end end
一些不便於放在 Git 中的配置文件此時能夠經過在鉤子中執行 ln -s source dest
命令,創建符號連接,引用外部的配置文件。
一切準備就緒之後,切換到本地項目根目錄,執行下列命令部署你的應用!
cap production deploy
要回滾到上個版本,只需執行下列命令:
cap production deploy:rollback
PS - 我的博客原文:使用_Capistrano_進行自動化部署(2)