varnish安裝,配置維護

一、安裝準備工作
1.建立varnish用戶以及用戶組,並且創建Varnish緩存目錄和日誌目錄:
useradd    -s /sbin/nologin varnish
mkdir /data/varnish/cache
mkdir /data/varnish/log
chown -R varnish:varnish    /data/varnish/cache
chown -R varnish:varnish    /data/varnish/log

2.安裝pcre,ncurses-devel
 
cd ./pcre-8.20

./configure --prefix=/usr/local/pcre

     make && make install

    yum install ncurses-devel

3.安裝varnish
cd varnish-3.0.0
export PKG_CONFIG_PATH=/usr/local/pcre/lib/pkgconfig
其中,“PKG_CONFIG_PATH”是指定varnish查找pcre庫的路徑,如果pcre安裝在了其它路徑下,在這裏指定相應的路徑即可,Varnish默認查找的pcre庫路徑爲/usr/local/lib/ pkgconfig
./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings
make
make install

配置varnish配置文件,如下是我的範例
##############通過backend定義後端主機##############
backend wiki {
             .host = "192.168.137.111";
             .port = "80";
             .connect_timeout = 1s;
             .first_byte_timeout = 5s;
             .between_bytes_timeout = 2s;

}

backend server82 {
             .host = "192.168.137.111";
             .port = "82";
}

backend server83 {
             .host = "192.168.137.111";
             .port = "83";
}

backend server84 {
             .host = "192.168.137.111";
             .port = "84";
}


###############定義一個名字爲server的director
director server random {
  {.backend = server82; .weight=5;}
  {.backend = server83; .weight=5;}
  {.backend = server84; .weight=5;}
}

###############設置清理緩存規則varnish允許那些IP通過PURGE方法清除緩存
acl purge {
                "localhost";
                "127.0.0.1";
  "192.168.137.0"/26;
}

#################非允許IP發送PURGE清理緩存時將返回405狀態
sub vcl_recv {
                if (req.request == "PURGE") {
                                if (!client.ip ~ purge) {
                                                error 405 "Not allowed.";
      return(lookup);
                                }
                }

                if (req.http.host ~ "^wiki.wangqiao.cn") {
                                set req.backend = wiki;
                }
  else
                if(req.http.host ~ "^server.wangqiao.cn") {
    set req.backend = server;
  }
  else
  if(req.http.host ~ "^(.*).wangqiao.cn" || req.http.host ~ "^(.*).wangqiao.com") {
                                set req.backend = server;
                }
  else
  {
                                error 404 "Wang Qiao Cache Server";
                }

###########清除url中有jpg|png|gif等文件的cookie
  if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") {
                         unset req.http.cookie;
  }

##########判斷req.http.X-Forwarded-For ,如果前端有多重反向代理,這樣可以獲取客戶端IP地址                
  if (req.http.x-forwarded-for) {
    set req.http.X-Forwarded-For =
      req.http.X-Forwarded-For + ", " + client.ip;
  } else {
    set req.http.X-Forwarded-For = client.ip;
  }
####################如果請求的類型不是GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE時,進入pipe模式    
                 if (req.request != "GET" &&
                         req.request != "HEAD" &&
                         req.request != "PUT" &&
                         req.request != "POST" &&
                         req.request != "TRACE" &&
                         req.request != "OPTIONS" &&
                         req.request != "DELETE") {
                            return (pipe);
                         }
########如果請求的類型不是GET與HEAD,則進入pass模式。                    
                    if (req.request != "GET" && req.request != "HEAD") {
                            return (pass);
                     }    
########請求以.cgi和.php結尾帶有?的url時不進行緩存直接從後端服務器讀取內容                    
                     if (req.http.Authorization || req.http.Cookie) {
                            return (pass);
                     }
                    
                     if (req.request == "GET" && req.url ~ "\.(cgi|php)($|\?)") {
                             return (pass);
                            }
                         return (lookup);

}



sub vcl_pipe {
                return (pipe);
}
sub vcl_pass {
             return (pass);
}
#######如果請求的類型是PURGE方法,varnish會將此請求的緩存週期設置爲0,也就是使這個url的緩存失敗從而刷新varnish緩存的目的
sub vcl_hit {
                if (req.request == "PURGE") {
                                set obj.ttl = 0s;
                                error 200 "Purged.";
                }
}
sub vcl_miss {
  return (fetch);
}

###############定義不同的緩存時間###

sub vcl_fetch {
  if (req.request == "GET" && req.url ~ "\.(png|xsl|xml|pdf|ppt|doc|docx|chm|rar|zip|bmp|jpeg|swf|ico|mp3|mp4|rmvb|ogg|mov|avi|wmv|swf|txt|png|gif|jpg|css|js)$")
  {
    set beresp.ttl = 1d;
  }

                if (req.request == "GET" && req.url ~ "\.(html|htm)$") {
                                set beresp.ttl = 1d;
                }


  if (req.request == "GET" && req.url ~ "^/upload(.*)$") {
    set beresp.ttl = 300s;
  }
#################當url中包含server時不進行緩存
                if (req.url ~ "^/services/") {
    return (deliver);
  }
##########定義在什麼狀態下進入restart模式  
  if (beresp.status == 500 || beresp.status == 501 || beresp.status == 502 || beresp.status == 503 || beresp.status == 504 || beresp.status == 404) {
    return (restart);
  }
###########定義不緩存含有那些HTTP頭請求
  if (beresp.http.Pragma ~ "no-cache" ||
    beresp.http.Cache-Control ~ "no-cache" ||
    beresp.http.Cache-Control ~ "private") {
    return (deliver);
  }
}

###########添加一個header標識,以判斷緩存是否命中
sub vcl_deliver {
    set resp.http.x-hits = obj.hits;
    if (obj.hits > 0) {
     set resp.http.X-Cache = "HIT form wangqiao";
    } else {
     set resp.http.X-Cache = "MISS from wangqiao";
  }
    return(deliver);
}

##############定義hash值並處理壓縮內容
sub vcl_hash {
         hash_data(req.url);
         if (req.http.host) {
                 hash_data(req.http.host);
         } else {
                 hash_data(server.ip);
         }

         if (req.http.Accept-Encoding) {
                                if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
                                remove req.http.Accept-Encoding;
                                remove req.http.Cookie;
                                } else if (req.http.Accept-Encoding ~ "gzip") {
                                                set req.http.Accept-Encoding = "gzip"; }
                                else if (req.http.Accept-Encoding ~ "deflate") {
                                                set req.http.Accept-Encoding = "deflate";
                                }
                                else {
                                                remove req.http.Accept-Encoding;
                                                }
                                }

         return (hash);
}


VCL內置函數
1vcl_recv函數
 用於接收和處理請求,當請求到達併成功接收後被調用,通過判斷請求的數據來決定如何處理請求。
 此函數一般以如下幾個關鍵字結束:
q pass:表示進入pass模式,把請求控制權交給vcl_pass函數。
q pipe:表示進入pipe模式,把請求控制權交給vcl_pipe函數。
q error code [reason]:表示返回“code”給客戶端,並放棄處理該請求,“code”是錯誤標識,例如200405等,“reason”是錯誤提示信息。
 (2vcl_pipe函數
 此函數在進入pipe模式時被調用,用於將請求直接傳遞至後端主機,在請求和返回的內容沒有改變的情況下,將不變的內容返回給客戶端,直到這個鏈接關閉。
 此函數一般以如下幾個關鍵字結束:
q error code [reason]
q pipe
3vcl_pass函數
 此函數在進入pass模式時被調用,用於將請求直接傳遞至後端主機,後端主機應答數據後送給客戶端,但不進行任何緩存,在當前連接下每次都返回最新的內容。
 此函數一般以如下幾個關鍵字結束:
q error code [reason]
q pass
4lookup
表示在緩存裏查找被請求的對象,並且根據查找的結果把控制權交給函數vcl_hit或者函數vcl_miss
 (5vcl_hit函數
 在執行lookup指令後,如果在緩存中找到請求的內容,將自動調用該函數。
 此函數一般以如下幾個關鍵字結束:
q deliver:表示將找到的內容發送給客戶端,並把控制權交給函數vcl_deliver
q error code [reason]
q pass
6vcl_miss函數
 在執行lookup指令後,如果沒有在緩存中找到請求的內容時自動調用該方法,此函數可以用於判斷是否需要從後端服務器取內容。
 此函數一般以如下幾個關鍵字結束:
q fetch:表示從後端獲取請求的內容,並把控制權交給vcl_fetch函數。
q error code [reason]
q pass
7vcl_fetch函數
 在從後端主機更新緩存並且獲取內容後調用該方法,接着,通過判斷獲取的內容來決定是否將內容放入緩存,還是直接返回給客戶端。
 此函數一般以如下幾個關鍵字結束:
q error code [reason]
q pass
q deliver
8vcl_deliver函數
 在緩存中找到請求的內容後,發送給客戶端前調用此方法。此函數一般以如下幾個關鍵字結束:
q error code [reason]
q deliver
9vcl_timeout 函數
 此函數在緩存內容到期前調用。一般以如下幾個關鍵字結束:
q discard:表示從緩存中清除該內容。
q fetch
10vcl_discard函數
 在緩存內容到期後或緩存空間不夠時,自動調用該方法,一般以如下幾個關鍵字結束:
q keep:表示將內容繼續保留在緩存中。
q discard

4.啓動varnish
/usr/local/varnish/sbin/varnishd -n /data/varnish/cache -u varnish -g varnish -f /usr/local/varnish/vcl.conf -a 0.0.0.0:80 -s file,/data/varnish/cache/vcache_cache.data,50M -w 10,51200,10 -t 3600 -T 127.0.0.1:3500 -P /var/run/varnishd.pid
命令參數 參數含義  
-a address:port 表示varnishhttpd的監聽地址及其端口  
-b address:port 表示後端服務器地址及其端口  
-d 表示使用debug調試模式  
-f file 指定varnish服務器的配置文件  
-p param=value 指定服務器參數,用來優化varnish性能  
-P file Varnish進程PID文件存放路徑  
-n dir 指定varnish的工作目錄  
-s kind[,storageoptions] 指定varnish緩存內容的存放方式,常用的方式有:“-s file,<dir_or_file>,<size>”。  
10 其中“<dir_or_file>”指定緩存文件的存放路徑,“<size>”指定緩存文件的大小  
11 -t 指定缺省的TTL值  
12 -T address:port 設定varnishtelnet管理地址及其端口  
13 -w int[,int[,int]] 設定varnish的工作線程數,常用的方式有:  
14 -w min,max  
15 -w min,max,timeout  
16 例如:-w5,51200,30,這裏需要說明下,在varnish2.0版本以後,最小啓動的線程數不能設定過大,設置過大,會導致varnish運行異常緩慢。
17  -V 顯示varnish版本號和版權信息

varnish得到日常維護

訪問日誌寫入文件
 /usr/local/varnish/bin/varnishncsa -n /data/varnish/cache -w /var/log/varnish.log &

獲得Varnish詳細的系統運行日誌
/usr/local/varnish/bin/varnishlog -n  /data/varnish/cache| grep CLI

清除緩存
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 ban.url index.html

列出最近清除的詳細URL列表
/usr/local/varnish/bin/varnishadm -T 127.0.0.1:3500 ban.list

通過查看網頁頭來查看命中情況
查看Varnish服務器連接數與命中率
/usr/local/varnish/bin/varnishstat -n /data/varnish/cache

其中幾個比較重要的選是
cache-hit :代表緩存命中次數
miss-hit   :代表未命中次數
worker threads :代表當前工作線程的數量
expired objects :代表過期對象的個數
LRU nuked objects :代表緩存可使用的內存以達上線而不得不移除的對象個數
LRU moved objects :代表LRU策略被移動的對象個數
Total header bytes :代表緩存的請求頭對象的大小
Total body bytes :代表緩存的請求體對象大小

如果有不對的地方,請各位大神指出,小弟不甚感激!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章