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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

实现基于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 ,如需转载请自行联系原作者



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
数据采集 运维 监控
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
构建企业级Selenium爬虫:基于隧道代理的IP管理架构
|
5月前
|
消息中间件 运维 监控
企业级短信验证码服务架构设计与最佳实践
随着移动互联网的发展,短信验证码成为用户身份验证的重要手段。本文从企业级应用角度出发,探讨如何构建高可用、高并发和安全可靠的短信验证码服务。通过多通道冗余、故障自动切换和服务降级保障高可用性;利用异步处理与消息队列应对高并发;借助多层防刷、内容审核和数据加密提升安全性。同时,提供了详细的架构设计、核心模块代码示例以及监控运维方案,帮助读者理解并实现一个完整的短信验证码系统。
311 2
|
5月前
|
存储 SQL 分布式计算
19章构建企业级大数据平台:从架构设计到数据治理的完整链路
开源社区: 贡献者路径:从提交Issue到成为Committer 会议演讲:通过DataWorks Summit提升影响力 标准制定: 白皮书撰写:通过DAMA数据治理框架认证 专利布局:通过架构设计专利构建技术壁垒
|
2月前
|
存储 消息中间件 安全
企业级实时消息推送系统的架构设计,一文即懂!
如果你是技术负责人,该如何搭建一套能解决这些问题的企业级统一消息推送平台?今天我们就从核心挑战出发,拆解一套可落地的统一推送服务架构方案。
407 0
|
4月前
|
人工智能 监控 数据可视化
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
本文将基础的单应用扩展成多应用,并实现工作流组件,包括:多应用模块设计、工作流模块设计、LangGraph实现图应用、前端Vue-Flow组件使用、工作流转LLM工具设计思路、关联工作流登技巧。
279 3
企业级LLMOps落地指南:蜂巢架构×可视化编排实战
|
4月前
|
消息中间件 人工智能 安全
企业级AI应用需要系统工程支撑,如何通过MCP大模型架构实现全链路实战解构?
本文三桥君深入探讨了MCP大模型架构在企业级AI应用中的全链路实战解构。从事件驱动、统一中台、多端接入、API网关、AI Agent核心引擎等九个核心模块出发,系统阐述了该架构如何实现低耦合高弹性的智能系统构建。AI专家三桥君提出从技术、内容、业务三个维度构建评估体系,为企业级AI应用提供了从架构设计到落地优化的完整解决方案。
283 0
|
7月前
|
缓存 监控 安全
301重定向进阶指南:从基础配置到企业级架构优化
本文深入探讨网站重定向的高级技巧与企业级实现,涵盖正则表达式重定向、权重无损迁移、分布式系统适配等核心内容。通过解析301/302状态码区别及应用场景,结合Nginx、Apache配置示例,帮助开发者优化大规模网站重定向逻辑。同时,文章介绍CDN边缘重定向、微服务架构下的规则管理以及容灾设计,确保高性能与安全性。最后提供全链路监控方案和经典案例分析,助你规避流量损失风险,提升SEO表现。
296 38
|
7月前
|
监控 应用服务中间件 区块链
301重定向的终极指南:从基础配置到企业级架构设计
本文全面解析301重定向技术,从基础配置到企业级架构设计。涵盖HTTP状态码语义、浏览器与爬虫处理差异,提供分层架构模型及高可用配置示例。深入探讨亿级URL处理策略、流量压力测试数据,结合HTTP/2优化与Core Web Vitals提升方案。同时关注隐私合规性、故障排查工具及前沿技术融合,如机器学习预测和区块链存证。最后通过实际案例分析,展示重定向工程的商业价值与未来趋势。
215 14
|
7月前
|
人工智能 自然语言处理 物联网
如何成为企业级大模型架构师?
企业级大模型架构师需要掌握从 底层算力、模型训练、微调优化、推理部署、企业集成 到 安全合规 的全栈能力。这里提供一个完整的 企业级大模型架构师成长体系。
825 4
|
9月前
|
JavaScript 前端开发 Java
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器
Jeesite5 是一个基于 Spring Boot 3.3 和 Vue3 的企业级快速开发平台,集成了众多优秀开源项目,如 MyBatis Plus、Bootstrap、JQuery 等。它提供了模块化设计、权限管理、多数据库支持、代码生成器和国际化等功能,极大地提高了企业级项目的开发效率。Jeesite5 广泛应用于企业管理系统、电商平台、客户关系管理和知识管理等领域。通过其强大的功能和灵活性,Jeesite5 成为了企业级开发的首选框架之一。访问 [Gitee 页面](https://gitee.com/thinkgem/jeesite5) 获取更多信息。
473 0
Jeesite5:Star24k,Spring Boot 3.3+Vue3实战开源项目,架构深度拆解!让企业级项目开发效率提升300%的秘密武器