实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构

Varnish知识储备:

常见的状态引擎之间的默认处理流程为:

dabe73fb5fe8a36c7bc5847fc0c5323c.png

①如果缓存命中:默认流程

用户请求–>vcl_recv–>vcl_hash–>vcl_hit–>vcl_deliver–>响应给用户

②如果缓存未命中:默认流程

用户请求–>vcl_recv–>vcl_hash–>vcl_miss–>vcl_backend_fetch–>后端服务器接受请求发送响应报文–>vcl_backend_response–>vcl_deliver

或:非默认流程

用户请求–>vcl_recv–>vcl_hash–>vcl_miss–>vcl_pass–>vcl_backend_fetch–>后端服务器接受请求发送响应报文–>vcl_backend_response–>vcl_deliver–>响应给用户

③如果不能从缓存中进行响应:默认流程

用户请求–>vcl_recv–>vcl_hash–>vcl_pass–>vcl_backend_fetch–>后端服务器接受请求发送响应报文–>vcl_backend_response–>vcl_deliver–>响应给用户

④如果请求报文无法理解:默认流程

用户请求–>vcl_recv–>vcl_pipe–>交给后端服务器

说明:如果配置文件中没有指明状态引擎之间的跳转,那么对应使用以上默认的流程

-----------------------------------------------------------------------------

vcl的内建变量的分类:

a1199a1abb40abe2e9972c63ff9d9672.jpg

req.*:由客户端发来的http请求相关的变量。比如req.method 表示客户端的请求方法。

bereq.* :varnish主机在向后端真实服务器发送http请求报文时的相关变量。

beresp.*:由后端真实服务器发来的http响应报文中的某些首部信息相关的变量,一般是在vcl_backend_response或vcl_backend_fenth引擎中调用。

resp.*:由varnish响应给客户端的响应报文相关的变量。

obj.* :对存储在缓存空间中的缓存对象属性的引用变量,obj开头的变量都是只读的。

obj.hits: 某个缓存对象的缓存的命中次数。

client.,server.,storage.*:可用在所有面向客户端一侧的引擎中。

用户还可自定义:使用set及unset,具体用法在实验中有体现

---------------------------------------------------------------------------------------

实验:实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构:

要求:

1.修改/etc/varnish/default.vcl配置文件内容

2、定义后端服务器组,以及检测机制和配置后端集群事件

3、配置检测机制为http检测,配置后端两台web server,算法为轮询。

4、配置varnish入口函数vcl_recv,定义GET请求类型被缓存

5、配置vcl_deliver函数,设定缓存头部信息

6、配置后端缓存文件类型,对图片缓存30天,对静态文件缓存7天

7、配置Varnish程序功能的配置文件,使其以文件形式缓存,大小为1G,监听端口为6081

----------------------------------------------------------------------------- 

一、环境准备:

两台haproxy(一台master,一台backup,VIP:172.17.111.10)(对varnish实现负载均衡)

两台varnish(IP分别为:172.17.111.234    172.17.111.222)

两台后端服务器(已实现lnmp)(IP分别为:172.17.253.100    172.17.253.211)

 

二、安装步骤:

1、在用作haproxy负载均衡的机器上安装keepalived和haproxy

  yum install keepalived

  yum install haproxy

2、在用作varnish的服务器上安装varnish

  yum install varnish


三、修改配置文件及启动服务

         

1、对主haproxy操作:主要代码如下

①vim /etc/keepalived/keepalived.conf  实现高可用

-----------------------------------------------------------------------------

#具体代码含义请参看博客:http://13150617.blog.51cto.com/13140617/1979652

-------------------------------------------------------------------------------------------

! Configuration File for keepalived

global_defs {

   notification_email {

     root@localhost    #收件人

   }

   notification_email_from Alexandre.Cassen@firewall.loc

   smtp_server 127.0.0.1  #发件的服务器

   smtp_connect_timeout 30

   router_id LVS_DEVEL2

}

    vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 14

    priority 100       #优先级

    advert_int 1

 authentication {

        auth_type PASS

        auth_pass 111111

    }

    virtual_ipaddress {

        172.17.111.10 #VIP

    }

启动服务:systemctl start keepalived

 

②vim /etc/haproxy/haproxy.cfg  实现负载均衡

-----------------------------------------------------------------------------

#具体代码含义请参看博客:http://13150617.blog.51cto.com/13140617/1980419

-------------------------------------------------------------------------------------------

global

    log         127.0.0.1 local2

    chroot         /var/lib/haproxy

    pidfile        /var/run/haproxy.pid

    maxconn        4000

    user          haproxy

    group         haproxy

     daemon

     stats socket /var/lib/haproxy/stats

defaults

    mode                   http

    log                    global

    option                  httplog

    option                  dontlognull

    option http-server-close

    option forwardfor           except 127.0.0.0/8

    option                  redispatch

    retries                  3

    timeout http-request         10s

    timeout queue              1m

    timeout connect            10s

    timeout client          1m

    timeout server          1m

    timeout http-keep-alive 10s

    timeout check           10s

     maxconn                  3000

listen stats

        mode http                     #基于http协议

        bind 0.0.0.0:1080               #监听1080端口

        stats enable                   #开启统计报告服务

        stats hide-version               #隐藏统计报告版本信息

        stats uri /haproxyadmin           #统计报告访问url

        stats realm Haproxy\ Statistics     #页面登陆信息

        stats auth admin:admin            #验证账号信息

        stats admin if TRUE              #验证模式

 

frontend  http-in

     bind *:80  

     default_backend       cache

backend cache

    balance    roundrobin    #负载均衡算法

    server     cache1 172.17.111.222:6081  check

    server     cache2 172.17.111.234:6081  check

 

启动服务:systemctl start haproxy  (打开了80和1080端口)

---------------------------------------------------------------------------- 

2、对从haproxy操作:

      ①vim /etc/keepalived/keepalived.conf

          配置基本同上面主的,只需要修改下面两行,然后启动服务

           state BACKUP

           priority 90

      ②vim /etc/haproxy/haproxy.cfg

         配置完全同上面主的,配置完成后启动服务

---------------------------------------------------------------------------- 

3、两台varnish上进行同样的操作: 

  ①vim /etc/varnish/default.vcl

     vcl 4.0;  #版本

     import directors; #导入模块

     probe backend_healthcheck {   #定义健康状态检测

        .url = "/index.html";  #检测的页面

        .window = 5;        #窗口

        .threshold = 1;      #门槛,1表示至少有一个正常工作

        .interval = 3s;      #检测频度

          .timeout = 1s;       #超时时长

}

 

backend web1 {                       #定义后端服务器

        .host = "172.17.253.211";

        .port = "80";

        .probe = backend_healthcheck;  #健康状态检测

}

backend web2 {                       #定义后端服务器

        .host = "172.17.253.100";

        .port = "80";

        .probe = backend_healthcheck;  #健康状态检测

 

sub vcl_init {  #初始化

  new web_cluster = directors.round_robin(); #定义后端服务器组,使用轮询算法

        web_cluster.add_backend(web1);  #引用上面定义的服务器

        web_cluster.add_backend(web2);

}

sub vcl_recv {                 #定义入口函数

     if(req.url ~ "index.php"){  #不缓存index.php页面,直接跳到pass

           return (pass);

     }

       if(req.method == "GET"){   #请求方法为GET的就缓存

               return (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); #如果不属于以上列出的方法,那么就通过管道直接传递到后端服务器

    }

     return (hash);

}

sub vcl_hash{                 #定义hash

        hash_data(req.url);  #对请求的url进行hash处理

}

sub vcl_backend_response {         #自定义缓存文件时长,即TTL值

       if(bereq.url ~ "\.(jpg|jpeg|gif|png)$"){

         set beresp.ttl = 30d;  #缓存图片30天

        }

       if(bereq.url ~ "\.(html|css|js)$"){

         set beresp.ttl = 7d;   #缓存静态页面7天

        }

       return (deliver);

}

sub vcl_deliver {         #为响应添加首部,显示缓存是否命中

       if(obj.hits > 0){

          set resp.http.X-Cache = "HIT from " + server.ip; #命中

        }

       else{

          set resp.http.X-Cache = "MISS";            #没命中

        }

    unset resp.http.Via;   #取消显示varnish版本号

}


②vim /etc/varnish/varnish.params

 VARNISH_STORAGE="file,/var/lib/varnish/bin,1G" #以文件形式缓存,大小为1G

 VARNISH_LISTEN_PORT=6081                #监听端口为6081


 启动服务:systemctl start varnish (打开了6081端口)

 

四、检测:

访问http://172.17.111.10:1080/haproxyadmin 登陆查看两台varnish的状态是否正常

edb1d9decd2496889ea4b40d097cde9e.jpg 

访问http://172.17.111.10/ 按ctrl+F12可查看浏览器的抓包信息

a26ada9264c53e030466f7ee00547c63.jpg

然后ctrl+F5强制刷新几次页面,页面情况如下:

index.php页面信息:

d3ffdc11d03bad7f5e26c8c20d26682f.jpg

.jpg图片信息:

0ea155cd94e99c54ce43bb5c05007136.jpg


欢迎浏览,如有疑问,欢迎留言。

j_0080.gif