1. 程式人生 > >使用varnish的緩存功能實現後端服務器的負載均衡及資源的定向分發

使用varnish的緩存功能實現後端服務器的負載均衡及資源的定向分發

else cluster 圖片格式 服務器組 調度 模塊 dfa pipe host

結構拓撲圖:
技術分享圖片
使用varnish軟件實現後端兩臺web服務器的負載均衡並實現客戶端請求內容的定向分發。
準備基礎環境:

在三臺後端服務器上安裝httpd服務,其中一臺作為圖片服務器提供服務,另兩臺作為靜態文本服務器。
yum install -y httpd
systemctl start httpd
systemctl enable httpd
關閉防火墻
systemctl stop firewalld
設置selinux為disabled
三臺服務器做同樣設置
在圖片服務器的/var/www/html目錄下上傳幾個jpg格式的圖片
在兩臺web服務器上各創建10個測試頁面
for i in {1..10};do echo "<h1>Test Page $i on Web2</h1>"  /var/www/html/test$i.html;done
for i in {1..10};do echo "<h1>Test Page $i on Web3</h1>"  /var/www/html/test$i.html;done
在緩存服務器上安裝varnish軟件
yum install -y varnish
systemctl start varnish
systemctl enable varnish

這裏安裝的是varnish4.0的版本,在安裝完成後/etc/varnish目錄下默認會生成3個配置文件
secret:安全認證文件,我們在登陸varnish的CLI管理界面的時候可以使用此文件進行驗證
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
varnish.params:這個文件中主要記錄著主進程的配置信息,監聽的socket,使用的存儲類型,各主程序的工作特性等等

例如:
VARNISH_VCL_CONF=/etc/varnish/default.vcl  //默認調用的vcl配置參數文件
VARNISH_LISTEN_PORT=6081  //主進程監聽的端口號,通常我們在實際生產環境中可以將端口號更改成80,直接使用客戶端瀏覽器進行訪問
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1   //進入CLI控制臺模式使用的地址,默認只允許監聽在本地地址。
VARNISH_ADMIN_LISTEN_PORT=6082  //進入CLI控制臺監聽的端口號
 VARNISH_SECRET_FILE=/etc/varnish/secret  //使用的登陸安全驗證文件 
 VARNISH_STORAGE="malloc,256M"      //緩存使用哪種存儲機制

default.vcl文件:配置緩存系統的緩存機制,指明線程中各緩存功能的工作機制
配置default.vcl文件:

首先定義緩存引擎的緩存機制,將參數定義到vcl_revc域中
if (req.method == "PRI") {
          return (synth(405));      
          }
          if (req.method != "GET" &&    //如果http請求報文信息不是下列信息,則表示緩存服務器不理解請求報文,直接將報文送到pipe模塊進行丟棄或直接發送給後端服務器
          req.method != "HEAD"  &&
          req.method != "PUT"  &&
          req.method != "POST"  &&
          req.method != "TRACE"  &&
          req.method != "OPTIONS" &&
          req.method != "DELETE") {
          return (pipe);
          }
          if (req.method != "GET" && req.method != "HEAD") {
          return (pass);      //http請求報文為GET或者是HEAD信息,直接將請求發往後端服務器,不做本地緩存查詢
          }
          if (req.http.Authorization || req.http.Cookie) {
          return (pass);    //http報文含有認證或者用戶的Cookie敏感信息,則直接將請求發送到後端服務器,不在本地緩存查詢。
          }
          return (hash);      //以上都不是則查找緩存並返回客戶端緩存信息

接下來定義三臺主機:

import directors;                //在正文定義調度模塊
backend websrv1 {           //圖片服務器
      .host = "192.168.153.8";
      .port = "80";
      .probe = {                     //定義健康狀態檢測
      .url = "/test1.html";
          }
  }
  backend websrv2 {          //web1服務器
      .host = "192.168.153.9";
      .port = "80";
      .probe = {
      .url = "/test1.html";
          }
  }
  backend websrv3 {         //web2服務器
      .host = "192.168.153.10";
      .port = "80";
  }

sub vcl_init {                 //我們在vcl_init域中將兩臺web服務器設置成集群方式
         new mycluster=directors.round_robin();     //使用directors.round_robin()的調度方式,這裏註意我們要使用調度方式必須要在配置文件正文定義調用使用的****directors模塊
          mycluster.add_backend(websrv2);
          mycluster.add_backend(websrv3);
               }

接下來我們返回到vcl_revc域中定義內容分發以及調用主機集群

 if (req.url ~ "(?i)^/login" || req.url ~ "(?i)^/admin") {
                  return(pass);     //http報文含有登陸認證信息直接將請求發送給後端服務器,不在本地緩存中查找
          }
          if (req.url ~ "(?i)\.(jpg|png|gif)$") {
             set req.backend_hint = websrv1;     //所有圖片格式的請求發送給websrv服務器,並將返回的資源緩存到本地
          } else {
                  set req.backend_hint = mycluster.backend();  //其它請求發送到兩臺web服務器組成的集群服務中並肩服務器返回的結果緩存到本地
          }

完整的vcl_revc定義為
技術分享圖片

在vcl_backend_response域中定義緩存時長,不定義的話會使用默認值
sub vcl_backend_response {
      if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
          set beresp.ttl = 30d;
      }
      if (bereq.url ~ "\.(html|css|js)$") {
          set beresp.ttl = 7d;
     }
 }

技術分享圖片
這裏我們為了驗證客戶端獲取的資源是否為緩存資源,可以調用變量來驗證

 sub vcl_deliver {
     if (obj.hits>0) {
         set resp.http.X-Cache = "HIT form " + server.ip;   //顯示為緩存資源並返回給客戶端緩存服務器的IP信息
         } else {
         set resp.http.X-Cache = "Miss form" + server.ip;      //顯示為非緩存資源並返回給客戶端緩存服務器的IP信息
         }
 }

配置完成後還需要再CLI命令行處進行配置文件的編譯並調用。
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 進入CLI控制臺
vcl.load one default.vcl 將default.vcl配置文件編譯成第一版vcl緩存配置模板
vcl.use one 使用one模板

技術分享圖片
最後使用客戶端進行驗證
技術分享圖片
在瀏覽器的調試臺查看資源調用信息
技術分享圖片
訪問web服務
技術分享圖片
技術分享圖片
註意這裏因為緩存服務器的算法調用,我們請求test2.html將從第一臺服務器調取資源,然後請求test3.html則會從第二臺服務器調取資源,反復請求同一個資源在緩存時效之內除了第一次外剩下的所有請求都將從緩存服務器獲取。

技術分享圖片
技術分享圖片
此時配置完畢

使用varnish的緩存功能實現後端服務器的負載均衡及資源的定向分發