項目實戰5—企業級緩存系統varnish應用與實戰


 

企業級緩存系統varnish應用與實戰

  環境背景:隨着公司業務快速發展,公司的電子商務平台已經聚集了很多的忠實粉絲,公司也拿到了投資,這時老板想通過一場類似雙十一的活動,進行一場大的促銷,屆時會有非常多的粉絲訪問網站,你的總監與市場部門開完會后,確定活動期間會有平常10倍以上的訪問請求,總監要求大幅增加網站容量,除了去擴容服務器之外,還有沒有其他辦法呢?

總項目流程圖,詳見 http://www.cnblogs.com/along21/p/8000812.html

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

原理:

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

 

1、環境准備

 

機器名稱

IP配置

服務角色

備注

haproxy-server-master

VIP:172.17.100.100

DIP:172.17.1.6

負載均衡器

主服務器

配置keepalived

haproxy-server-backup

VIP:172.17.100.100

DIP:172.17.11.11

負載服務器

從服務器

配置keepalived

varnish

RIP:192.168.30.2

緩存服務器

開啟代理功能

rs01

RIP:192.168.30.107

后端服務器

開啟lnmp的web

rs02

RIP:192.168.30.7

后端服務器

開啟lnmp的web

2、在兩個 haproxy上設置

全局段和默認段不用修改,就不寫了

vim /etc/haproxy/haproxy.cfg

vim /etc/haproxy/haproxy.cfg
① frontend 前端設置
frontend  web
        bind :80
acl staticfile path_end .jpg .png .bmp .htm .html .css .js
use_backend varnish-server if staticfile
default_backend appsrvs
② backend 后端設置
backend varnish-server
        balance     roundrobin
        server varnishsrv 192.168.30.2:6081 check inter 3000 rise 3 fall 3
backend appsrvs
balance roundrobin
server appsrv1 192.168.30.107:80 check inter 3000 rise 3 fall 3
server appsrv2 192.168.30.7:80 check inter 3000 rise 3 fall 3

③ 可以加個web狀態監測頁面,可要可不要
listen admin
bind  :9527
stats enable
stats hide-version
stats uri /haproxy?admin
stats realm  HAProxy\ Statistics
stats auth along:along
stats refresh 20s
stats admin if TRUE

3、設置keepalived

(1)在主haproxy-master

① 全局段,主要是設置發郵件的
global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from root@along.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id keepalived_haproxy
}
② 編輯一個健康監測腳本,每2秒監測一次haproxy進程
vrrp_script chk_haproxy {
        script "killall -0 haproxy"
        interval 2
        fall 2
        rise 2
        weight -4
}
③ 定義主從和VIP
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 191
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass along
    }
    virtual_ipaddress {
        172.17.100.100
    }
track_script {     //調用上邊的腳本
chk_haproxy
}
}

 

(2)在從haproxy-backup 上,和主差不多,只需修改主從和優先級

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 191
    priority 98
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass along
    }
    virtual_ipaddress {
        172.17.100.100
    }
}

4、設置varnish

(1)設置配置,管理Management進程的配置文件,配置進程的

vim /etc/varnish/varnish.params 修改端口和緩存類型及緩存大小

VARNISH_ADMIN_LISTEN_PORT=6082

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

 

(2)設置總配置文件,配置緩存系統的

vim /etc/varnish/default.vcl

(a)第一段

① 設置一個健康監測
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.30.107";
    .port = "80";
    .probe = backend_healthcheck;
}
backend web2 {
    .host = "192.168.30.7";
    .port = "80";
    .probe = backend_healthcheck;
}

③ 配置后端集群事件
sub vcl_init {
    new web_cluster = directors.round_robin();   //把web1和web2 配置為輪詢集群,取名為web_cluste
    web_cluster.add_backend(web1);
    web_cluster.add_backend(web2);
}
acl purgers {    # 定義可訪問來源IP,權限控制
        "127.0.0.1";
        "172.17.0.0"/16;
}

(b)第二段,定義引擎

① 定義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頭
}

5、開啟服務的順序

① 先開啟后端server事先搭建好的lnmp web服務

systemctl start nginx

systemctl start php-fpm

systemctl start mariadb

 

② 再開啟varnish緩存服務器

service varnish start

 

③ 開啟主從的keepalived,提供VIP

service keepalived start

 

④ 開啟haproxy服務

service haproxy start

 

6、測試

(1)配置完成后,client訪問,http://172.17.100.100/ ,成功訪問web

 

(2)訪問http://172.17.100.100:9527/haproxy?admin ,haproxy的web監測頁面,正常

 

(3)當主haproxy 宕機時,VIP自動漂移到從上,且服務正常使用

在主haproxy 上,server stop haproxy,VIP會漂到從上

(4)varnish 緩存服務器上,確實生成了緩存文件

F12打開網頁的調試頁面,查看確實緩存了

 

(5)測試清緩存的功能,PURGE 發送頭部信息

 

(6)后端有一台server 宕機,服務照常使用

systemctl stop nginx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM