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

简介:

实现基于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
















本文转自lc0108131451CTO博客,原文链接:http://blog.51cto.com/13150617/1981813 ,如需转载请自行联系原作者



相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
30天前
|
设计模式 架构师 前端开发
JavaEE企业级分布式高级架构师课程
本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发/分布式架构设计等主流核心技术。
22 1
JavaEE企业级分布式高级架构师课程
|
8月前
|
运维 负载均衡 关系型数据库
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
【运维知识进阶篇】用Ansible Roles重构LNMP架构(Linux+Nginx+Mariadb+PHP),实现4个项目一键部署
112 0
|
5月前
|
存储 人工智能 架构师
基于 TOGAF 和 WAF 的企业级架构
基于 TOGAF 和 WAF 的企业级架构
65 0
基于 TOGAF 和 WAF 的企业级架构
|
6月前
|
关系型数据库 MySQL Linux
Linux环境下LNMP架构实战案例
Linux环境下LNMP架构实战案例
|
7月前
|
存储 架构师
企业级业务架构设计:方法论与实践 学习笔记
最近在项目中涉及到这一领域,也借着这个契机做一次对企业级业务架构设计的深入学习。
377 0
|
8月前
|
负载均衡 算法 网络协议
Haproxy架构扩展
Haproxy架构扩展
67 0
|
8月前
|
NoSQL Java 测试技术
破防了!阿里用17个真实企业级项目阐述Java系统分析与架构设计
最近,有小伙伴问我,有没有能够在短时间内快速增长软件项目的系统分析与架构设计能力的方法。 想了很久还是决定把这份用17个真实企业级项目阐述的《Java系统分析与架构设计》手册分享出来。 这份手册按照一个完整的软件项目周期: 立项→业务需求→软件需求分析→架构设计→模块设计→代码开发→软件测试→项目部署→系统维护 深入浅出地讲解了需求分析技术、软件开发架构设计、关系型物理表设计、Redis应用实战、MongoDB 开发与应用、Web服务器与数据库的集群部署等内容。
107 0
|
8月前
|
运维 负载均衡 关系型数据库
【运维知识进阶篇】Ansible实现一套完整LNMP架构
【运维知识进阶篇】Ansible实现一套完整LNMP架构
139 0
|
8月前
|
运维 应用服务中间件 网络安全
【运维知识进阶篇】集群架构-Nginx高可用Keepalived(二)
【运维知识进阶篇】集群架构-Nginx高可用Keepalived(二)
117 0
|
8月前
|
缓存 运维 网络协议
【运维知识进阶篇】集群架构-Nginx高可用Keepalived
【运维知识进阶篇】集群架构-Nginx高可用Keepalived
124 0