一、实验准备

服务器A:haproxy服务器(主)

服务器B:haproxy服务器(备)

服务器C:LNMP服务器、varnish服务器

服务器D:LNMP服务器、varnish服务器

二、实验要求

前端负载均衡器实现keepalived高可用。并且实现对于图片和静态资源的请求,代理到后端webserver缓存varnish服务上,对于动态请求。直接代理到厚点web服务,后端健康检测基于/index.html(手动创建),监测连续三次监测通过,视为OK,连续5次监测失败,视为fall。

三、实验步骤

1、前端负载均衡器实现VIP的漂移

keepalived(主)
global_defs {
   notification_email {
root@localhost   
}
   notification_email_from root@magedu.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id zuozuo_LVS
}
vrrp_instance VI_1 {
    state MASTER     //
    interface eth1
    virtual_router_id 70
    priority 100    //优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass zuozuo
    }
    virtual_ipaddress {
172.17.110.70/16    //VIP
    }
}
keepalived(备)
global_defs {
   notification_email {
	root@localhost   
}
   notification_email_from root@magedu.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id zuozuo_LVS
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth1
    virtual_router_id 70
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass zuozuo
    }
    virtual_ipaddress {
	172.17.110.70/16    //VIP
    
    }
}

2、前端负载均衡器实现请求的分离

global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
 log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     40000
    user        haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
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
	bind 0.0.0.0:1080
	stats enable
	stats hide-version
	stats uri /haproxyadmin
	stats auth admin:admin   //登录检测
	stats admin if TRUE
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  static
    mode http
    bind *:6000   //标明端口
    acl url_static  path_beg    -i /static /p_w_picpaths /javascript /stylesheets
    acl url_static  path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
 
 frontend server
	bind  *:80
	default_backend  server
#---------------------------------------------------------------------
# static backend for serving up p_w_picpaths, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin  
    option httpchk GET /index.html
    server      static1  172.17.252.63:6000 check
    server      static2  172.17.253.59:6000 check
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend  server
    balance     roundrobin
    option httpchk GET /index.html
    server  server1 172.17.252.63:80 check inter 3000  rise 3 fall 5
    server  server2 172.17.253.59:80 check inter 3000  rise 3 fall 5

3、varnish实现缓存策略

vcl 4.0; //必须要写,注明版本
import directors;
probe check1 {  //制定健康检测策略
        .url = "/index.html";
        .timeout=1s;
        .interval=2s;
        .window=5;
        .threshold=3;
      }
backend server1 {
.host = "172.17.252.63";   //lnmp服务器
.port = "80";
.probe = check1;
}
backend server2 {
        .host = "172.17.253.59";
        .port = "80";
        .probe = check1;
}
sub vcl_init {   //初始化
    new web_cluster = directors.random();
    web_cluster.add_backend(server1,10);
    web_cluster.add_backend(server2,20);
}

 acl  purgers {    # 定义可访问来源IP
         "127.0.0.1";
         "172.17.0.0"/16;
 }

sub vcl_recv {
	 if (req.method == "GET" && req.http.cookie) {  
        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);
   }
} 
sub vcl_hash {  //对访问的URL进行hash
     hash_data(req.url);
}
sub vcl_backend_response { # 自定义缓存文件的缓存时长,即TTL值
    if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
        set beresp.ttl = 3600s;  
    }
    if (bereq.url ~ "\.(html|css|js)$") {
        set beresp.ttl = 7200s;
    }
     set beresp.grace = 30m;

        return(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;
        unset resp.http.Via;
}