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

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
EMR Serverless StarRocks,5000CU*H 48000GB*H
简介:

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



相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
设计模式 架构师 前端开发
JavaEE企业级分布式高级架构师课程
本课程主要面向1-5年及以上工作经验的Java工程师,大纲由IT界知名大牛 — 廖雪峰老师亲自打造,由来自一线大型互联网公司架构师、技术总监授课,内容涵盖深入spring5设计模式/高级web MVC开发/高级数据库设计与开发/高级响应式web开发/分布式架构设计等主流核心技术。
131 1
JavaEE企业级分布式高级架构师课程
|
22天前
|
设计模式 测试技术 持续交付
架构视角下的NHibernate:设计模式与企业级应用考量
【10月更文挑战第13天】随着软件开发向更复杂、更大规模的应用转变,数据访问层的设计变得尤为重要。NHibernate作为一个成熟的对象关系映射(ORM)框架,为企业级.NET应用程序提供了强大的支持。本文旨在为有一定经验的开发者提供一个全面的指南,介绍如何在架构层面有效地使用NHibernate,并结合领域驱动设计(DDD)原则来构建既强大又易于维护的数据层。
35 2
|
26天前
|
存储 SQL 分布式计算
湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
【10月更文挑战第7天】湖仓一体架构深度解析:构建企业级数据管理与分析的新基石
41 1
|
6月前
|
关系型数据库 应用服务中间件 PHP
|
5月前
|
安全 Java API
基于Spring Boot的企业级应用架构设计
基于Spring Boot的企业级应用架构设计
|
6月前
|
移动开发 供应链 Java
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin。 企业级云MES全套源码,支持app、小程序、H5、台后管理。 生产调度:MES系统可以根据生产订单和资源状况,自动计算生产计划和调度,从而优化生产线的运作。
163 0
企业级智能制造MES系统源码,技术架构:springboot + vue-element-plus-admin
|
2月前
|
存储 弹性计算 SDN
企业级 ECS 集群的构建需要综合考虑多个因素,通过不断的比较和对比不同的方案,选择最适合企业自身需求和发展的架构。
【9月更文挑战第5天】在数字化商业环境中,构建企业级ECS(弹性计算服务)集群对提升业务稳定性、扩展性和性能至关重要。本文将比较传统物理服务器与ECS架构,分析云服务商选择(如AWS和阿里云)、实例配置(CPU/内存)、网络架构(SDN vs 传统)及存储方案(本地存储 vs 云存储),帮助企业根据自身需求选出最优方案,实现高效稳定的ECS集群部署。
69 18
|
4月前
|
Kubernetes Cloud Native 微服务
企业级容器部署实战:基于ACK与ALB灵活构建云原生应用架构
这篇内容概述了云原生架构的优势,特别是通过阿里云容器服务Kubernetes版(ACK)和应用负载均衡器(ALB)实现的解决方案。它强调了ACK相对于自建Kubernetes的便利性,包括优化的云服务集成、自动化管理和更强的生态系统支持。文章提供了部署云原生应用的步骤,包括一键部署和手动部署的流程,并指出手动部署更适合有技术背景的用户。作者建议在预算允许的情况下使用ACK,因为它能提供高效、便捷的管理体验。同时,文章也提出了对文档改进的建议,如添加更多技术细节和解释,以帮助用户更好地理解和实施解决方案。最后,展望了ACK未来在智能化、安全性与边缘计算等方面的潜在发展。水文一篇,太忙了,见谅!
|
4月前
|
监控 Java 持续交付
使用Java构建企业级微服务架构的策略与挑战
使用Java构建企业级微服务架构的策略与挑战
下一篇
无影云桌面