varnish簡介
arnish 是一款高性能且開源的反向代理服務器和 HTTP 加速器,其採用全新的軟件體系機構,和現在的硬件體系緊密配合,與傳統的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等諸多優點,很多大型的網站都開始嘗試使用 varnish 來替換 squid,這些都促進 varnish 迅速發展起來。
varnish緩存方式:(也可以緩存到內存和磁盤)
緩存數據的存儲方式:在緩存空間中固定分配大小的空間,如果要緩存一個數據根據緩存數據的大小來緩存到最接近緩存數據大小的空間。 如果緩存空間慢了將使用用LRU機制來置換內存空間(LRU是Least Recently Used 近期最少使用算法。內存管理的一種頁面置換算法,對於在內存中但又不用的數據塊(內存塊)叫做LRU,Oracle會根據哪些數據屬於LRU而將其移出內存而騰出空間來加載另外的數據。)
varnish釋放緩存方式:由varinish管理緩存超時週期線程TTL(TTL值如果超過設置的值將釋放緩存空間),如果釋放的空閒空間有連續的,就會自動合併成一起成爲大的空閒空間,避免了空間浪費和空間碎片(內存合併機制)。
實驗地圖:
1 web1, web2配置
# yum install httpd # yum install httpd
# service httpd start # service httpd start
# vim /var/www/html/index.html # vim /var/www/html/index.html
hello 1 hello 2
varnish:
# yum install varnish
配置:
# cp /etc/varnish/default.vcl /etc/varnish/one.vcl //先備份
# vim /etc/varnish/test1.vcl
backend web1 {
.host = "192.168.0.108"; 後端服務器的地址
.port = "80"; 監聽端口
.probe = { 監控檢測機制
.url = "/index.html"; 以url來檢測
.interval = 2s; 每隔2秒鐘檢測一次
.window = 8; 從正常到失敗檢測8次
.threshold = 2; 8此中有兩次是監控就說明是監控的
}
}
backend web2 { //同上
.host = "192.168.0.109";
.port = "80";
.probe = {
.url = "/index.html";
.interval = 2s;
.window = 8;
.threshold = 2;
}
}
director webservers round-robin { //定義後端服務器組webservers,並指明訪問機制:這裏指定的是 round-robin輪詢機制
{ .backend = web1; } 指定後端server
{ .backend = web2; }
}
acl purgers { //定義清除單個緩存的控制列表(允許的用戶)
"127.0.0.1";
"192.168.0.0"/24;
}
sub vcl_recv { //指定接收客戶端的一些訪問機制
set req.backend = webservers; // 應用後端server
if (req.restarts == 0) { // 如果請求重啓次數爲0
if (req.http.x-forwarded-for) { //如果存在x-forwarded-for
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip; //則在x-forwarded-for後面添加客戶端IP
} else {
set req.http.X-Forwarded-For = client.ip; //否則設置x-forwarded-for等於客戶端IP
}
}
if (req.url ~ "^/test1.html$") { //如果是請求test1.html則跳過直接去後端server請求
return(pass);
}
if (req.request == "PURGE"){ //定義清除單個緩存的返回信息的說明
if (client.ip !~ purgers) {
error 405 "Method not allower.";
}
return (lookup); //如果客戶請求爲 PURGE且客戶端IP非purgers 則響應Method not allower.
}
return (lookup); // 如果客戶端請求爲PURGE則直接查找緩存
}
sub vcl_hit { //如果在緩存中能查到,直接清除緩存並響應"Purged
if (req.request == "PURGE") {
purge;
error 200 "Purged";
}
return (deliver);
}
sub vcl_miss { //如果緩存中沒有查到,則直接返回not in Purged
if (req.request == "PURGE") {
purge;
error 404 "not in Purged";
}
return (fetch);
}
sub vcl_fetch { //這裏定義得不嚴謹(爲了方便測試,週期性緩存時間最多5秒)
set beresp.ttl = 5s;
}
sub vcl_deliver { // 設置響應客戶端機制
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT via" + " " + server.hostname; //如果緩存命中次數大於0 則在響應首部 添加varnish服務器的主機名稱,
} else {
set resp.http.X-Cache = "MISS via" + " " + server.hostname; //如果沒有命中緩存,則在響應首部 添加X-Cache = "MISS via" + " " + server.hostname
}
return (deliver);
}
啓動varnish服務:
1、 service varnish start
2、 # varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
vcl.load ning one.vcl 編輯生效配置
vcl.use ning 應用配置
檢測是否在響應頭添加了指定信息