一:安裝准備:
Capistrano應該裝在本地設備中,別在遠程服務器中安裝。安裝時需要ruby和gem。 OS X系統已經有了,Linux可以使用相應的包管理器安裝ruby和gem,安裝完ruby后,gem會含在里面。
sudo yum install ruby # CentOS, Fedora, 或 RHEL 系統
sudo apt
-
get
install ruby
-
full
# Debian 或 Ubuntu 系統
brew install ruby #蘋果系統
二:安裝完ruby和gem之后,安裝Capistrano
gem install capistrano
至此安裝完成!
三:使用配置
1.初始化項目,在項目最頂層目錄執行命令
cap install
結果如下:
生成的目錄結構應該如下圖:
下面是將應用部署在服務器端的設置。
服務器說明:
阿里雲服務器,公網IP:60.205.178.92
配置文件說明:
config/deploy.rb
這個配置文件包含所有環境(例如過渡環境和生產環境)的通用設置。
主要設置以下幾個屬性:
:application 這是PHP應用的名稱。只能包含字母、數字、下划線。
:repo_url 這是Git倉庫的URL。這個URL必須指向一個Git倉庫,而且遠程服務器必須能夠訪問這個倉庫。 (我的git倉庫放在碼雲上 ,地址是:git@gitee.com:cpfe/test-cap.git)
:deploy_to 這是遠程服務器中一個目錄的絕對路徑,我們部署的PHP應用就存放在這個目錄中。 (我的設置為 /var/www/my_app)
:keep_releases 保留多少個舊版,以防想把應用回滾到之前的版本。 (我的設置是5)
config/deploy/production.rb文件
這個文件只包含生產環境的設置,這個文件用於定義生產環境的角色。對於小型項目,我們的生產環境所使用的應用服務器和數據庫服務器使用的是同一台服務器就是我們購買的阿里雲服務器。所以此處只設置web角色,而且只有一個服務器屬於這個角色。將 production.rb 這個文件的內容替換為下面的代碼:
role :web, %w{deploy@60.205.178.92}
注意:此時需要在遠程服務器創建 deploy 用戶並設置密碼,並且創建一個存放部署的PHP應用的目錄,並且使該用戶擁有該目錄的讀寫權限。
我設置是在 /var/www/my_app 目錄存放應用的。
由於使用 Capistrano 自動部署的應用會創建符號鏈接,把 current/目錄指向存放當前應用版本的目錄。所以,需要更新web服務器的虛擬主機的文檔根目錄,指向 Capistrano 的 current 目錄。
值得注意的是,部署之前必須在本地電腦和遠程服務器之間,以及遠程服務器和Git倉庫之間建立認證。
認證:
本地服務器<--------------->遠程服務器
正常的訪問遠程服務器的方法是:ssh deploy@60.205.178.92,這個命令會要求輸入deploy用戶的密碼,然后登陸服務器,我們可以禁用密碼認證,加強安全。密碼認證有漏洞,會受到暴力攻擊,不懷好意的人會不斷嘗試猜測你的密碼。使用ssh登錄服務器時應該使用ssh密鑰對認證。原理如下圖:
如果要在多台電腦中登錄遠程服務器,或許不應使用ssh密鑰對認證,如果想這么做,要在每台本地電腦中生成ssh密鑰對,然后再把每個密鑰對中的公鑰復制到遠程服務器中。遇到這種情況,最好使用安全的密碼進行密碼認證。然而,如果只通過一台本地電腦訪問遠程服務器,ssh密鑰對認證是最好的方式。
創建 SSH 密鑰對的方法是,在本地設備中執行下述命令,一路回車即可:
ssh-keygen
密鑰對生成之后,可使用scp(安全復制)命令復制公鑰:
scp ~/.ssh/id_rsa.pub deploy@60.205.178.92:
注意一定要在末尾加上:符號!這個命令會把公鑰復制到遠程服務器中deploy用戶的家目錄里。
接下來,一 deploy 用戶的身份登錄遠程服務器。確認 ~/.ssh是否存在,如果不存在則創建:
mkdir ~/.ssh
然后執行下述命令:
touch ~/.ssh/authorized_keys
這個文件的內容是一系列允許登錄這台遠程服務器的公鑰。執行下述命令復制公鑰至該文件:
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
最后執行以下命令修改權限:
[deploy@iZ2ze6ey5vaxb4nhgemgfrZ ~]$ chown -R deploy:deploy ~/.ssh
[deploy@iZ2ze6ey5vaxb4nhgemgfrZ ~]$ chmod 700 ~/.ssh/
[deploy@iZ2ze6ey5vaxb4nhgemgfrZ ~]$ chmod 600 ~/.ssh/authorized_keys
注意:只有在存放私鑰的本地設備中通過ssh登錄遠程服務器時才不用輸入密碼。
遠程服務器 <--------------->Git倉庫
在運行自動化部署命令之前:
遠程服務器不需要 Capistrano,但是需要 Git,而且還
需要運行PHP應用所需的全部軟件。
Git 安裝:
Ubuntu:
sudo apt-get install git
CentOS:
sudo yum install git
四:部署應用
在終端中進入應用的最頂層目錄,執行下述命令:
cap production deploy
會看到如下所示的進度:
五:回滾應用
cap production deploy:rollback
至此簡單的應用自動化部署完成。但是對於我們很多的應用來說,都使用composer管理應用的依賴,所以我們可以使用Capistrano的鈎子安裝composer依賴,在config/deploy.rb 文件中添加下述Ruby代碼:
Before / After Hooks:
在以下的狀態前/后都可以進行一些操作:
deploy:starting
(部署中)
deploy:started
(部署已開始)
deploy:updating
(正在更新服務器端文件)
deploy:updated
(服務器端文件更新完畢)
deploy:publishing
(服務器端正在切換當前版本)
deploy:published
(服務器端當前版本已切換至最新版本)
deploy:finishing
(正在處理一些收尾工作)
deploy:finished
(一切就緒)
# Capistrano 使用的是語法(Rake語法)
# 命名空間是 deploy
namespace :deploy do
# 描述
desc "Build"
# 服務器端文件更新完畢之后進行的操作
after :updated, :build do
# 定義了這個任務需要哪些角色來執行,這里是web角色
on roles(:web) do
# 在遠端的指定文件夾里執行do-end里的內容。通常會用來跑服務器端的rake任務,因為rake任務通常需要在項目的根目錄來跑。
within release_path do
# 要執行的shell命令
execute :composer, "install --no-dev --quiet"
end
end
end
end
現在,每次部署到生產環境時都會安裝應用的依賴。
Laravel學院也有相關文章,搜索“服務器部署篇”,共四篇,內容也大都是參考《Modern PHP》。