前言
通常一個網站
數據庫掛掉後,後果將是非常嚴重的。基本上整個網站基本不可用了。對於一些網站來說,當數據庫掛掉後,如果能提供基本的浏覽服務,也是不錯的。本文將嘗試使用varnish + nginx + lua 搭建網站降級系統來實現整個目標。
降級目標
降級方案的目標是,當網站出現致命故障時(如出現500錯誤,不能提供服務),可以把緩存的頁面數據展現給用戶。從而提供基本的浏覽服務。
1、只提供基本的浏覽服務
2、浏覽的數據都是非登錄狀態下的數據
3、支持手動和自動降級。自動降級是當後端返回500錯誤次數在一段時間內達到一定阈值(不包含503)。手動降級是從控制界面操作。
降級方案
存儲
使用varnish作為存儲。有效的節約了物理內存,並保持了較好的性能。
更新
使用crond腳本從nginx的access日志中分析出請求url,然後向varnish發請求,從而更新varnish的緩存。緩存的異步更新,減少對nginx的壓力。
降級
支持手動降級和自動降級。降級後,nginx自動從varnish中提取數據,並返回給用戶。
流程圖
流程描述
1、用戶請求到nginx時,nginx會判斷當前是否是降級狀態。如果屬於降級狀態,直接從varnish中獲取數據。非降級狀態,把請求轉到php-fpm。
2、當crond腳本請求varnish進行緩存數據更新時,如果當前varnish處於降級狀態,則不進行緩存更新。如果沒有處在降級狀態,則把請求轉到nginx,獲取數據。然後把獲取的數據緩存到varnish中。
3、varnish會自動監控後端nginx的狀態。如果檢測到nginx已經處於降級狀態,則varnish也會自動進入降級狀態。
安裝部署
vanish安裝到/home/varnish 目錄下。安裝步驟如下:
首先,安裝libpcre。
sudo yum install pcre pcre-devel
其次,安裝varnish。
./configure --prefix=/home/varnish
make
sudo -u admin make install
sudo -u admin mkdir -p /home/varnish/vcache/
sudo chown admin:admin -R /home/varnish
sudo -u admin touch /home/varnish/vcache/varnish_cache.data
sudo chmod 777 /home/varnish/vcache/varnish_cache.data
再次,修改varnish配置文件和部署相關腳本。點擊下載文件壓縮包。配置文件名為default.vcl
最後,啟動varnish。啟動腳本也在壓縮包中,名稱為 varnishctl
sudo /home/admin/varnish/sbin/varnishctl start
注意:啟動後可以通過varnishlog命令查看是否運行正常。如果出現以下字樣,說明運行正常。http的返回狀態為200
$/home/varnish/bin/varnishlog
0 Backend_health - default Still healthy 4--X-RH 4 2 4 0.002698 0.001722 HTTP/1.1 200 OK
部署lua腳本
lua腳本在/home/admin/nginx/data/lua目錄下。 確保目錄下有如下幾個個腳本。
pc_get_downgrade_data.lua
init.lua
pc_status_stat.lua
pc_get_status.lua
pc_set_satus.lua
這幾個腳本在下載的壓縮包中有。
修改nginx配置文件
首先,在http域增加
init_by_lua_file 'lua/init.lua';
lua_shared_dict pc_status 1m;
lua_shared_dict pc_auto_status 1m;
#varnish config
upstream varnish{
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=5s;
}
最後,在server域宏增加如下配置。
location @php {
include fastcgi_params;
}
location @var {
proxy_pass http://varnish$str_params;
}
location ~* ^(.+\.php)(.*)$ {
#check downgrade status, then get data from varnish
set $str_params $uri;
content_by_lua_file lua/pc_get_downgrade_data.lua;
}
location /hl_get_auto_status {
if ($white_ip = 0) {
return 403;
}
content_by_lua_file lua/pc_get_auto_status.lua;
}
location /hl_get_status {
if ($white_ip = 0) {
return 403;
}
content_by_lua_file lua/pc_get_status.lua;
}
location /hl_set_status {
if ($white_ip = 0) {
return 403;
}
content_by_lua_file lua/pc_set_status.lua;
}
log_by_lua_file lua/pc_status_stat.lua;
部署crond腳本
腳本varnish_crond.php。在crond中增加執行命令。每分鐘執行一次。
來自crond的請求,user-agent數據為varnish_crond。把user-agent為varnish_crond請求特殊處理。保證能正常請求,並返回相關數據。
降級管理
varnish降級
只要讓varnish配置中指定的監控腳本check.php返回500錯誤即可。varnish監控到指定腳本不可用,自動會進入降級狀態。
當腳本返回200狀態後,varnish自動又會恢復正常。
nginx降級
設置降級
curl -H"Host:demo.bo56.com"-i http://127.0.0.1/hl_set_status?status=1
恢復正常
curl -H"Host:demo.bo56.com" -i http://127.0.0.1/hl_set_status?status=0
查看降級狀態
curl -H"Host:demo.bo56.com" -i http://127.0.0.1/hl_get_status
如果返回的值為1表示降級