天天看點

Varnish 緩存

Centos 6.5  varnish

源碼編譯需要安裝以下的依賴:

1

2

3

4

5

<code>報錯:</code>

<code>.</code><code>/autogen</code><code>.sh</code>

<code>.</code><code>/autogen</code><code>.sh: line 47: libtoolize: </code><code>command</code> <code>not found</code>

<code>安裝依賴:</code>

<code> </code><code>yum </code><code>install</code> <code>libtool*</code>

<code> </code><code>configure: error: requires an X</code><code>/Open-compatible</code> <code>Curses library</code>

<code> </code><code>yum </code><code>install</code> <code>ncurses-devel -y</code>

<code> </code><code>configure: error: neither libedit nor another readline compatible library found</code>

<code> </code><code>yum </code><code>install</code> <code>libedit-devel -y</code>

rpm包安裝所需的依賴:

1、安裝varnish所需lib,

<code> </code><code>rpm --nosignature -i http:</code><code>//repo</code><code>.varnish-cache.org</code><code>/redhat/varnish-4</code><code>.0</code><code>/el6/x86_64/varnish/varnish-libs-4</code><code>.0.0-1.el6.x86_64.rpm</code>

2、安裝jemalloc,庫檔案可到此連結處下載下傳:ftp-hk.tmapy.cz/fedora/epel/6/x86_64/jemalloc-3.6.0-1.el6.i686.rpm

<code>rpm --nosignature -i http:</code><code>//ftp-hk</code><code>.tmapy.cz</code><code>/fedora/epel/6/x86_64/jemalloc-3</code><code>.6.0-1.el6.x86_64.rpm</code>

#可以去下載下傳合适自己的varnish版本軟體包

<code>http:</code><code>//repo</code><code>.varnish-cache.org</code><code>/redhat/varnish-4</code><code>.0</code><code>/el6/x86_64/varnish/</code>

3、開始安裝,

<code>rpm --nosignature -i http:</code><code>//repo</code><code>.varnish-cache.org</code><code>/redhat/varnish-4</code><code>.0</code><code>/el6/x86_64/varnish/varnish-4</code><code>.0.0-1.el6.x86_64.rpm</code>

安裝完成後,啟動varnish:

<code>service varnish start</code>

HTTP 請求的類型有幾種,下面是主要的幾種: 

GET : 請求指定的頁面資訊,并傳回實體主體。 

HEAD: 隻請求頁面的首部。 

POST: 請求伺服器接受所指定的文檔作為對所辨別的URI的新的從屬實體。 

pass和pipe都從後端伺服器取資料,它們之間有什麼不同呢?  

答:當vcl_recv調用 pass 函數時,pass将目前請求直接轉發到後端伺服器。而後續的請求仍然

通過varnish處理。 

例如,建立了HTTP連接配接之後,用戶端順序請求 a.css 、a.png兩個檔案,“目前請求”指的是第一個

請求,即a.css,a.css被直接轉發到後端伺服器,不被緩存。而後續的a.png則再由varnish來做

處理,varnish會判斷a.png 如何處理。 

總結:一個連接配接中除了目前請求,其它請求仍然按照正常情況由varnish處理。 

而pipe模式則不一樣,當vcl_recv判斷 需要調用 pipe 函數時,varnish會在用戶端和伺服器之

間建立一條直接的連接配接 ,之後用戶端的所有請求都直接發送給伺服器,繞過varnish,不再由varnish

檢查請求,直到連接配接斷開。 

Request 

1、調用 pass 函數,從後端伺服器調用資料。 

2、調用 pipe 函數,建立用戶端和後端伺服器之間的直接連接配接,從後端伺服器調用資料。 

3、調用lookup函數,從緩存中查找應答資料并傳回,如果查找不到,則調用pass函數從後端伺服器

調用資料 。 

varnish vcl配置檔案:

vcl_recv 接受請求

vcl_hash 緩存政策

vcl_fetch 不緩存

vcl_hit 命中

vcl_miss 未命中

<code>if</code> <code>(req.request !=</code><code>"GET"</code> <code>&amp;&amp; req.request != </code><code>"HEAD"</code> <code>&amp;&amp; req.request != </code><code>"PUT"</code> <code>&amp;&amp; req.request != </code><code>"POST"</code> <code>&amp;&amp; req.request !=</code><code>"TRACE"</code> <code>&amp;&amp; req.request != </code><code>"OPTIONS"</code> <code>&amp;&amp; req.request != </code><code>"DELETE"</code><code>) {</code>

<code>return</code> <code>(pipe);</code>

<code>}</code>

#如果不是get和head,那就是post。post屬于發送資料給伺服器,需要伺服器接受資料并處理,屬于動态。

<code>if</code> <code>(req.request != </code><code>"GET"</code> <code>&amp;&amp; req.request != </code><code>"HEAD"</code><code>) {</code>

<code>return</code> <code>(pass);</code>

#認證資訊

<code>if</code> <code>(req.http.Authorization || req.http.Cookie) {</code>

<code>return</code> <code>(lookup);</code>

6

7

<code>hash_data(req.url);</code>

<code>if</code> <code>(req.http.host) {</code>

<code>hash_data(req.http.host);</code>

<code>} </code><code>else</code> <code>{</code>

<code>hash_data(server.ip);</code>

<code>return</code> <code>(</code><code>hash</code><code>);</code>

#sub vcl_deliver 傳回引擎,用戶端提示是否命中

<code>sub vcl_deliver {</code>

<code>    </code><code>if</code> <code>(obj.hits &gt; 0) {</code>

<code>       </code><code>set</code> <code>resp.http.X-Cache = </code><code>"Hit"</code><code>; </code>

<code>    </code><code>} </code><code>else</code> <code>{</code>

<code>       </code><code>set</code> <code>resp.http.X-Cache = </code><code>"Miss"</code><code>;</code>

<code>    </code><code>}</code>

緩存時間的計算方法

預設的緩存時間計算方法如下:

. 先根椐max-age确定緩存時間

看傳回頭中的Cache-Control頭中,有沒有指定s-maxage或max-age資訊,另外,如果後端是一個緩存伺服器,它還會指定一個age頭,表明已經緩存過的時間,這樣需要減去age頭指定的時間,計算出對應的緩存時間。

例1 隻有max-age,沒有age

CacheControl: max-age=86400

緩存時間:86400秒,即一天

例2 同時有max-age和age資訊

Age: 6400

緩存時間:86400 - 6400 = 80000秒

本文轉自青衫解衣 51CTO部落格,原文連結:http://blog.51cto.com/215687833/1913365

繼續閱讀