varnish:緩存、加速器,反向HTTP代理
varnish通過可以基於文件系統接口進行訪問的共享內在區域來記錄日誌(shared memory log),共享內存日誌大小默認一般爲90MB,
分爲兩部分:前一部分爲計數器,後一部分請求相關的數據
管理進程:編譯VCL並應用新配置;監控vanish;初始化varnish;CLI接口;
Child/cache:
Acceptor:接收新的連接請求;
worker threads:處理用戶請求;
Expiry:清理緩存中的過期對象;
vcl: Varnish Configuration Language
緩存策略配置接口;
基於“域”的簡單編程語言;
varnish如何存儲緩存對象:
file: 單個文件;不支持持久機制;
malloc: 內存;使用malloc()庫調用在varnish啓動時向內在申請指定大小的空間
persistent:基於文件的持久存儲;
malloc-syntax: malloc[,size]
file-syntax: file[,path[,size[,granularity]]]
安裝:yum install varnish epel源
配置文件:
配置進程相關參數:/etc/varnish/varnish.params
配置緩存功能:/etc/varnish/default.vcl
命令行工具:varnishadm -S /etc/varnish/secret -T IP:PORT 6082
緩存處理的步驟:接收請求 --> 解析請求 (提取請求的URL及各種首部)--> 查詢緩存 --> 新鮮度檢測 --> 創建響應報文 --> 發送響應 --> 記錄日誌
請求處理流程:
(1)請求的爲可緩存:
a.命中:通過本地緩存響應
b.未命中:到後端服務器取得相應內容;
可緩存對象:先緩存再響應
緩存:定義緩存時間;自定義緩存鍵
不可緩存:不緩存直接響應
(2)請求的爲不可緩存:直接到後端服務器取得相應內容
配置vcl使用:
1.定義在vcl_deliver中,向響應給客戶端的報文添加一個自定義首部X-Cache;
if (obj.hits>0) {
set resp.http.X-Cache = "HIT"; "HIT via" + " # " + server.ip;顯示後端響應的服務器IP
} else {
set resp.http.X-Cahce = "MISS";
}
2.強制對某資源的請求,不檢查緩存#以login、admin開頭的不予緩存;
vcl: backend, backend的調用,健康狀態檢測的定義,負載均衡的實現,根據資源類型不同完成分發,控制哪些內容不查或查詢緩存
3.backend server定義
backend name {
.attribute = "value";
}
常用選項:
.host: BE主機的IP;
.port:BE主機監聽的PORT;
.probe: 對BE做健康狀態檢測;
.max_connections:並連接最大數量;
4.backend server的健康狀態檢查定義:
.url: 判定BE健康與否要請求的url;
.expected_response:期望響應狀態碼;默認爲200;
.interval = 1s;間隔多長時間
.window = 8;基於最近多少次探測來做健康判斷
.threadhold = 4;基於多少次探測成功多少次
.timeout = 2s;超時時間
例如:多個backend server基於不同的資源類型請求來調度,並做健康狀態檢測,實現動靜分離
5.實現負載均衡:
import directors; #加載負載均衡
sub vcl_init {
new mycluster = directors.round_robin(); 定義負載均衡器名稱:new NAME ,指明調度方法
mycluster.add_backend(websrv1);
mycluster.add_backend(websrv2);
}
vcl_recv {
set req.backend_hint = mycluster.backend();
}
調度算法:fallback, random, round_robin, hash