使用shell指令碼實現php應用的批次更新

來源:互聯網
上載者:User

標籤:使用shell指令碼實現php應用的批次更新

拓撲:

control_server

192.168.1.200

 

lb1

192.168.1.202

 

lamp1

192.168.1.101

 

lamp2

192.168.1.102

 

網站:

www.aaa.com

 

注意點:

1.所有伺服器之間通過hosts來解析主機名稱

2.control_server與其他被管理主機基於密鑰方式進行ssh通訊

3.所有伺服器的ssh連接埠號碼已改為2222

 

實驗目的:

基於灰階發布模型,在control_server上使用shell指令碼,自動向多台lamp伺服器發布新版本的php應用

 

實現思路:

  1. 各伺服器上的設定檔以及檔案路徑要保持一致

  2. 更新web應用時,使用軟連結的方式來實現。如果新版本有嚴重BUG,方便復原到舊版本

650) this.width=650;" src="https://s1.51cto.com/wyfs02/M00/8D/A4/wKiom1ikWnTwdGhYAAD5tPW8HLQ061.jpg" title="b.JPG" alt="wKiom1ikWnTwdGhYAAD5tPW8HLQ061.jpg" />

 

  1. Load Balance上的nginx配置要規範:

①   不同的網站使用獨立的設定檔

650) this.width=650;" src="https://s4.51cto.com/wyfs02/M00/8D/A1/wKioL1ikWpHzIMLpAACSoq9Ty_w334.jpg" title="b.JPG" alt="wKioL1ikWpHzIMLpAACSoq9Ty_w334.jpg" />

 

②    配置upstream時可以自訂標籤,方便Regex匹配

650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/8D/A1/wKioL1ikWq6QU-nBAACGQX7W2jw660.jpg" title="b.JPG" alt="wKioL1ikWq6QU-nBAACGQX7W2jw660.jpg" />

 

 

具體實現過程:

  1. 向lamp1傳送項目包

  2. 修改所有Load Balance節點的nginx設定檔,標記lamp1伺服器為down,使新的請求不會再發往lamp1,並重載nginx

  3. 指令碼等待1分鐘,讓lamp1處理完已接收的請求

  4. 將網站目錄的軟串連指向新版本,並重載httpd

  5. 重新修改所有Load Balance節點的nginx設定檔,取消lamp1伺服器的down標記,並重載nginx

  6. 以此類推,向其他lamp伺服器更新web應用

  7. 指令碼執行完畢後,列出執行過程中發生異常的lamp伺服器列表,之後可以對這些伺服器進行進一步的人工檢查及更新

 

 

使用方法:

650) this.width=650;" src="https://s4.51cto.com/wyfs02/M01/8D/A4/wKiom1ikWseQ3e2VAABpN2e1Vm8057.jpg" title="b.JPG" alt="wKiom1ikWseQ3e2VAABpN2e1Vm8057.jpg" />

 

650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/8D/A1/wKioL1ikWuPzVUUJAABC4LldKNM265.jpg" title="b.JPG" alt="wKioL1ikWuPzVUUJAABC4LldKNM265.jpg" />

 

 

 

指令碼:

#!/bin/bash# read -p "請輸入項目包路徑:" webappPath#壓縮專案檔,便於傳輸webappName=`basename ${webappPath}`webappPackage=/tmp/${webappName}.tar.gz #web伺服器存放網站的路徑以及web服務的使用者名稱,每個伺服器的配置需要統一remoteWebappPath=/data/webappsremoteWebUser=apache #相應網站的nginx設定檔路徑nginxConfPath=/etc/nginx/conf.d/www_aaa_com.conf remoteSSHport=2222 tar -czf ${webappPackage} ${webappPath}&> /dev/null[ $? -ne 0 ] && echo "tarwrong" && exit 1 #Load Balance伺服器列表lbServers=(lb1) #Lamp伺服器列表lampServers=(lamp1 lamp2) #更新過程中發生異常的伺服器列表declare -a failureServers check(){   if [ $? -ne 0 ]; then       failureServers[${#failureServers[@]}]=$1       continue   fi} for lampServer in ${lampServers[@]}; do   scp -P ${remoteSSHport} ${webappPackage} ${lampServer}:/tmp &>/dev/null   check ${lampServer}    ssh -p ${remoteSSHport} ${lampServer} tar -xf /tmp/${webappName}.tar.gz-C /data/webapps   check ${lampServer}    ssh -p ${remoteSSHport} ${lampServer} chown -R${remoteWebUser}:${remoteWebUser} /data/webapps/${webappName}   check ${lampServer}      declare -i flag=0   for lbServer in ${lbServers}; do       ssh -p ${remoteSSHport} ${lbServer} "grep‘[^[:space:]].*;.*#${lampServer}\>‘ $nginxConfPath &> /dev/null"       check ${lampServer}        ssh -p ${remoteSSHport} ${lbServer} "sed -i -r‘[email protected]([^[:space:]].*);(.*#‘"${lampServer}"‘\>)@\1 down;\[email protected]‘${nginxConfPath}"       check ${lampServer}                 ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload"       check ${lampServer}              let flag+=1   done   [ $flag -ne ${#lbServers[@]} ] &&failureServers[${#failureServers[@]}]=$1 && continue      sleep 1m   ssh -p ${remoteSSHport} ${lampServer} "rm -f/data/webapps/aaa"   check ${lampServer}    ssh -p ${remoteSSHport} ${lampServer} "ln -s/data/webapps/${webappName} /data/webapps/aaa"   check ${lampServer}    ssh -p ${remoteSSHport} ${lampServer} "service httpd reload&> /dev/null"       check ${lampServer}    flag=0   for lbServer in ${lbServers}; do       ssh -p ${remoteSSHport} ${lbServer} "grep‘[^[:space:]].*down;.*#${lampServer}\>‘ $nginxConfPath &>/dev/null"       check ${lampServer}        ssh -p ${remoteSSHport} ${lbServer} "sed -i -r‘[email protected]([^[:space:]].*)[[:space:]]down;(.*#‘"${lampServer}"‘\>)@\1;\[email protected]‘${nginxConfPath}"       check ${lampServer}                 ssh -p ${remoteSSHport} ${lbServer} "nginx -s reload"       check ${lampServer}              let flag+=1   done   [ $flag -ne ${#lbServers[@]} ] &&failureServers[${#failureServers[@]}]=$1    ssh -p ${remoteSSHport} ${lampServer} "rm -f/tmp/${webappName}.tar.gz" done rm -f ${webappPackage}echo "任務執行完成" if [ ${#failureServers[@]} -gt 0 ]; then   echo   echo "下列伺服器未能正常更新,請進一步檢查:"   for failureServer in ${failureServers[@]}; do       echo ${failureServer}   donefi


使用shell指令碼實現php應用的批次更新

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.