1. 程式人生 > >Varnish 實戰項目

Varnish 實戰項目

均衡 vrrp fresh hit 指定版本 client stat heal authent

技術分享

實現基於Keepalived+Haproxy+Varnish+LNMP企業級架構

原理:緩存,又稱加速器,用於加速運行速度較快的設備與較慢設備之間的通信。基於程序的運行具有局部性特征其能實現加速的功能
技術分享

一、環境準備

1.1 相關配置

機器名稱 IP配置 服務角色 備註
haproxy-server-master VIP:172.17.120.120 RIP:172.17.66.66 負載均衡器主服務器 配置keepalived
haproxy-server-backup VIP:172.17.120.120 RIP:172.17.251.66 負載均衡器從服務器 配置keepalived
varnish 192.168.37.111 緩存服務器 開啟代理功能
rs01 192.168.37.222 後端服務器 開啟lnmp的web服務
rs02 192.168.37.100 後端服務器 開啟lnmp的web服務

1.2 安裝服務

  我們需要在相應的機器上安裝我們的服務:
1)haproxy-server-master&haproxy-server-backup 上:

    yum install haproxy -y
    yum install keepalived -y

2)varnish 上:
  varnish服務器請用centos7來做。

    yum install varnish -y

3)rs01&rs02 上:
  安裝配置LNMP。詳情見我之前的博客——Nginx詳解以及LNMP的搭建

1.3 關閉防火墻及selinux

    iptables -F && setenforing

  
  本步驟完成。

二、配置 Haproxy

  我們需要把兩個機器的Haproxy都設置好。我們去修改一下Haproxy的配置文件——/etc/haproxy/haproxy.cfg
  global段和default段都是設置好的,我們就不需要修改,下面是我們需要修改的部分:
1)frontend段

frontend  web
        bind    *:80
        default_backend         varnish-server

2)backend段

backend varnish-server
    balance     roundrobin
    server  varnishsrv 192.168.37.111:6081 check inter 3000 rise 3 fall 5

3)listen段

listen admin
        bind :9527
        stats enable
        stats uri  /haproxyadmin
        stats auth admin:admin
        stats refresh 20s
        stats admin if TRUE

  第一臺機器設置好了以後,直接使用scp命令發到第二臺機器即可。
  然後把兩臺機器的服務都開啟:

    service haproxy start

  本步驟完成。

三、配置keepalived

3.1 配置 haproxy-server-master (主服務器)

  配置文件為/etcc/keeplalived/keepalived.conf,我們編輯以下三段即可:
1)全局段——設置發送郵件

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from [email protected]
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id keepalived_haproxy
}

2)編輯健康監測腳本
  該腳本作用是對haproxy進行健康監測,每隔2s監測一次haproxy進程。

vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 2
        fall 2
        rise 2
        weight -4
}

3)定義主從和VIP

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 170
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass keer
    }
    virtual_ipaddress {
        172.17.120.120
    }
    track_script {
        chk_haproxy
    }
}

3.2 配置 haproxy-server-backup (從服務器)

  從服務器和主服務器的配置很是相似,我們可以直接使用scp命令把主服務器的配置文件拷過來,然後,我們只需要把第二段刪掉,同時修改一下第三段的主從和優先級即可:

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 170
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass keer
    }
    virtual_ipaddress {
        172.17.120.120
    }
}

  本步驟完成。

四、配置Varnish

4.1 修改Management進程配置文件

  Management進程的配置文件為/etc/varnish/varnish.params。我們先來修改一下這個文件,主要是修改端口和緩存類型及大小:

    VARNISH_ADMIN_LISTEN_PORT=6082
    VARNISH_STORAGE="file,/data/cache,1G"

技術分享

4.2 修改Varnish總配置文件

  Varnish的總配置文件為/etc/varnish/default.vcl,我們來修改一下這個配置文件:
1)第一段
① 定義一個健康監測:

vcl 4.0;        #指定版本
import directors;       #加載後端的輪詢模塊
probe backend_healthcheck {     #設置名為backend_healthcheck的健康監測
    .url = "/index.html";
    .window = 5;      #窗口
    .threshold = 2;   #門檻
    .interval = 3s;
    .timeout  = 1s;
}

② 設置後端server:

backend web1 {
    .host = "192.168.37.222";
    .port = "80";
    .probe = backend_healthcheck;
}
backend web2 {
    .host = "192.168.37.100";
    .port = "80";        
    .probe = backend_healthcheck;
}

③ 配置後端集群事件

sub vcl_init {
    new img_cluster = directors.round_robin();
    img_cluster.add_backend(web1);
    img_cluster.add_backend(web2);
}

acl purgers {    # 定義可訪問來源IP,權限控制
        "127.0.0.1";
        "172.17.0.0"/16;
}

2)第二段——定義引擎
技術分享
① 定義vcl_recv引擎
  定義不認識的頭部請求直接扔後端的pass

sub vcl_recv {
    if (req.method == "GET" && req.http.cookie) {
        return(hash);    //處理完recv 引擎,給下一個hash引擎處理
    }
    if (req.method != "GET" &&
        req.method != "HEAD" &&
        req.method != "PUT" &&
        req.method != "POST" &&
        req.method != "TRACE" &&
        req.method != "OPTIONS" &&
        req.method != "PURGE" &&
        req.method != "DELETE") {
            return (pipe);   //除了上邊的請求頭部,通過通道直接扔後端的pass
    }

  定義index.php通過特殊通道給後端的server,不經過緩存

    if (req.url ~ "index.php") {
        return(pass);
    }

  定義刪除緩存的方法

    if (req.method == "PURGE") {   //PURGE請求的處理的頭部,清緩存
        if (client.ip ~ purgers) {
          return(purge);
        }
    }

  為發往後端主機的請求添加X-Forward-For首部

    if (req.http.X-Forward-For) {    //為發往後端主機的請求添加X-Forward-For首部
        set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
    } else {
        set req.http.X-Forward-For = client.ip;
    }
        return(hash);
}

② 定義vcl_hash 引擎,後沒有定義hit和Miss的路徑,所以走默認路徑

sub vcl_hash {
     hash_data(req.url);
}

③ 定義要緩存的文件時長

sub vcl_backend_response {     //自定義緩存文件的緩存時長,即TTL值
    if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
        set beresp.ttl = 30d;
    }
    if (bereq.url ~ "\.(html|css|js)$") {
        set beresp.ttl = 7d;
    }
    if (beresp.http.Set-Cookie) { //定義帶Set-Cookie首部的後端響應不緩存,直接返回給客戶端
    set beresp.grace = 30m;  
        return(deliver);
    }
}

④ 定義deliver 引擎

sub vcl_deliver {
    if (obj.hits > 0) {    //為響應添加X-Cache首部,顯示緩存是否命中
        set resp.http.X-Cache = "HIT from " + server.ip;
    } else {
        set resp.http.X-Cache = "MISS";
    }
        unset resp.http.X-Powered-By;   //取消顯示php框架版本的header頭
        unset resp.http.Via;   //取消顯示varnish的header頭
}

  
  本步驟完成。

五、開啟服務的順序

1)先開啟後端server事先搭建好的lnmp web服務

    systemctl start nginx
    systemctl start php-fpm
    systemctl start mariadb

2)再開啟varnish緩存服務器

    service varnish start

3)開啟主從的keepalived,提供VIP

    service keepalived start

4)開啟haproxy服務

    service haproxy start

  本步驟完成。

六、測試

1)配置完成後,client訪問,http://172.17.120.120/ ,成功訪問web
技術分享

2)訪問http://172.17.120.120:9527/haproxy?admin ,haproxy的web監測頁面,正常
技術分享

3)當主haproxy 宕機時,VIP自動漂移到從上,且服務正常使用;
在主haproxy 上,server stop haproxy,VIP會漂到從上。
技術分享

4)varnish 緩存服務器上,確實生成了緩存文件
技術分享
  F12打開網頁的調試頁面,查看確實緩存了:
技術分享

5)測試清緩存的功能,PURGE 發送頭部信息
技術分享

6)後端有一臺server 宕機,服務照常使用
  我們停掉一臺後端服務器:

    systemctl stop nginx

技術分享
  然後我們再去瀏覽器查看一下:
技術分享

  bing~實驗完成


  以上~如果有不足之處還請大家多多指教喏?(?>?<?)?

Varnish 實戰項目