zoukankan      html  css  js  c++  java
  • Varnish 实战项目

    实现基于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 root@keer.com
       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~实验完成


      以上~如果有不足之处还请大家多多指教喏٩(๑>◡<๑)۶

  • 相关阅读:
    robotframework笔记9
    robotframework笔记8
    Spring预处理
    WebStrom快捷键
    json死循环问题
    java线程与缓存
    oss文件删除策略
    Eclipse自动编译问题
    将 JAR 转为 EXE – EXE4J 的使用教程(第一期)(转载)
    将 JAR 转为 EXE – JSMOOTH 的使用教程(第二期)(转载)
  • 原文地址:https://www.cnblogs.com/keerya/p/7833724.html
Copyright © 2011-2022 走看看