玩轉 Varnish 緩存代理

jopen 9年前發布 | 17K 次閱讀 Varnish 緩存服務器

Varnish 是互聯網架構中重要的緩存代理組件。Varnish 一般跑在流量入口處,作為最前端一道防御,非常重要。

雖然 Varnish 并不像 Nginx 那么流行。Varnish 就像 Nginx 一樣穩定高效,如果使用得當,能極大提升整體服務性能、并且降低資源消耗。

常見互聯網架構中的多級緩存

  1. 將內容推送到用戶身邊的 CDN 緩存
  2. 類似 Varnish 的緩存代理
  3. 應用層緩存 Redis,Memcache
  4. 數據庫緩存
  5. </ol>

    為什么緩存代理很重要

    1. 一些事實:內容的變動比不變少得多;用戶內容最終一致的容忍性。基于這 2 個事實,可以節約大量重復計算和資源。
    2. 延遲一般情況下對用戶體驗、商業業務的影響很大。所有互聯網公司都在努力降低延遲,提升用戶體驗。
    3. CDN 有些情況下會大量回源,比如清空 CDN 緩存的時候,應用架構本身需要能抗 100% 流量的能力。
    4. </ol>

      Varnish 的幾個功能

      1. HTTP Header 的修改

      請求頭的修改

      unset req.http.cookie;
      set req.http.X-EOOD = "EOOD";

      返回頭的修改

      unset beresp.http.Set-Cookie;
      set beresp.http.Cache-Control = "public, max-age=31536000";

      2. 內容在 Varnish 狀態的暴露

      緩存的命中與否

      if (obj.hits > 0) {
      set resp.http.X-Cache = "HIT";
      } else {
      set resp.http.X-Cache = "MISS";
      }

      3. 負載均衡

      Varnish 也支持后端服務器的輪詢之類的簡單負載均衡,但是慎用。

      4. 后端保護和容錯

      這個功能可能有些人沒有注意到,但是確實非常有用的功能,在后端掛掉的時候,只讀頁面仍然會成功返回給客戶。

      set req.grace = 48h;

      5. 訪問控制

      可以根據規則路由或者屏蔽某些訪問,比如:

      req.http.User-Agent
      req.http.X-Forwarded-For
      req.http.referer
      ...

      簡單密碼保護:Basic Auth

      if (! req.http.Authorization ~ "Basic XXXXXXX") {
      error 401 "Restricted";
      }

      6. 多個后端合并

      定義多個后端

      backend ads {
      .host = "ads.eood.cn";
      .connect_timeout = 1s;
      .first_byte_timeout = 30s;
      .between_bytes_timeout = 5s;
      }

      backend blog {
      .host = "blog.eood.cn";
      .connect_timeout = 1s;
      .first_byte_timeout = 30s;
      .between_bytes_timeout = 5s;
      }

      根據域名、URL或者其他規則路由到不同的后端,這些規則可以是用戶 IP, 甚至是用戶 Cookie。

      sub vcl_recv {

      if (req.http.host ~ "ads" || req.url ~ "^/ads/") {
      set req.backend = ads;
      ...
      } else if(eq.http.host ~ "blog") {
      set req.backend = blog;
      }
      }

      7. 根據規則進行緩存

      set beresp.ttl = 120s;

      Varnish 運維常用命令

      請求 URL 熱點排名, 根據熱點優化緩存策略

      varnishtop -i rxurl

      實時請求日志

      varnishlog

      可以通過 grep 進行過濾查看你需要的信息

      varnishlog -c | grep 'google'

      Varnish 的注意事項

      防止連接粘滯,假如你有多個不同的后端,不添加這個會導致混亂,估計很多人踩過這個坑:

      sub vcl_pipe {
      set bereq.http.connection = "close";
      }

      URL 規劃

      一般緩存代理或者 CDN 都是可以通過配置 URL 規則實現不同 URL 模式使用不同的緩存策略,所以 URL 規劃非常重要。
      將動態請求和靜態請求進行區分;將不同緩存級別的 URL 進行區分。這也有利于根據 URL 進行緩存清理。

      最后

      Varnish 是網站應用或者移動應用必不可少的緩存模塊。如果你還沒開始使用,就立刻把他加入到現有架構中吧。

      來自:http://blog.eood.cn/varnish-cache

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!