WEB缓存系统之varnish代理以及健康状态检测配置

时间:2022-09-04 09:32:55

  前文我们聊了下varnish的缓存项修剪配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12666406.html;今天我来说一下varnish作为代理服务器反向代理多主机的配置;前边的所有操作都是针对后端主机只有一台的情况来说varnish的配置;在生产环境中,我们的web站点服务器不应该只有一台;默认情况下才安装好varnish的主机,在default.vcl中只可以指定一台后端主机的地址和端口;如果我们后端主机是多台的情况下,我们需要加载varnish的模块directors;然后用backend+后端主机名称(这个名称是我们自定义的,只要是一合法名称即可),来分别把每个主机的地址和端口配置好即可;

  示例:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上每个红框中的内容表示一台后端server;以上配置表示定义两台后端主机,其名称分别为webserver1和webserver2;

  把主机定义好后,这里还需要用在vcl_init状态引擎中配置初始化一个组,然后把这两台主机加到对应的组中;

  示例:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上配置表示用directors模块中的round_robin()方法初始化一个组对象,取名叫webserver;然后把对应两台主机加入到这个初始化组对象中;这意味着这个组里有两个成员,一个是webserver1,一个是webserver2;directors.round_robin()用这个方法初始化组对象表示往后端调度的算法是轮询,即没有权重;要想有权重,需要用directors.random()方法;如果需要做会话保持,需要用到directors.hash()方法;

  示例:初始化组对象用randomf方法

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:用random方法就在后面加权重;

  示例:初始化组对象用hash方法来保持会话

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:hash方法也是支持权重的;

  到此我们就把两台后端主机加入到webserver组中了;现在我们可以编译加载我们的配置文件,然后用varnishadm工具连接到控制管理shell中查看后端主机列表;

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29 Type 'help' for command list.
Type 'quit' to close CLI session. varnish> vcl.list
200
active 0 boot varnish> vcl.load test default.vcl
200
VCL compiled. varnish> vcl.list
200
active 0 boot
available 0 test varnish> vcl.use test
200
VCL 'test' now active varnish> backend.list
200
Backend name Refs Admin Probe
webserver1(192.168.0.10,,80) 2 probe Healthy (no probe)
webserver2(192.168.0.99,,80) 2 probe Healthy (no probe) varnish> quit
500
Closing CLI connection
[root@test_node1-centos7 ~]#

  提示:可以看到我们编写的vcl把多台主机加入到webserver组的配置生效了;从上面的配置看,后端主机有两台,一台是webserver1,一台是webserver2;

  测试:用curl命令访问192.168.0.99:8000 看看是否把用户请求分别调度到后端个server上去了?

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:从上面的结果看,好像没有把用户的请求调度到server1上去;原因是我们没有配置说明把所有未命中缓存的请求发送到后端主机上去,它默认是把第一次匹配backend 关键字+名称的配置当作默认主机;所以这里我们怎么访问都调度到192.168.0.10这台主机上去;

  示例:在vcl_recv中调用我们之前定义的组,明确说明把未命中缓存的请求发送到该组上;

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上红框中的内容表示把用户请求发送到我们定义好的组上的主机;

  测试:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:从上面的结果看,我们定义的主机上基于轮询的方式在往后端调度;这里测试需要把varnish上的缓存项给修剪掉,然后再次请求才可以看到把请求调度到不同主机上;

以上就是varnish代理多主机的配置方法,总结如下:

  1)首先我们要导入directors模块;

  2)用backend关键字来定义后端主机,起一名称,用花括号引入一段上下文,里面用.host指定后端主机的IP地址,用.port指定后端主机端口;

  3)在vcl_init状态引擎中初始化一个组对象,然后用组对象的add_backend(server)把对应主机加入到该组;

  4)在vcl_recv状态引擎中使用我们初始化好的组对象;用set req.backend_hint = 组对象中的backend();表示把为能命中的用户请求发送到该组上,至于用轮询还是加权轮询还是hash,取决于我们初始化组对象用到的方法;

  了解了varnish代理多台主机的配置后,接下来我们再来说说varnish对后端主机做健康状态监测的配置;对于varnish来讲,对后端主机做健康状态监测的原理是请求后端主机特定的资源,如果能够在指定的超时时长内正确响应我们就认为后端主机上健康状态的,如果不能正确的响应我们就认为该后端主机上不健康的;在varnish中对后端主机做健康状态监测需要用.probe 来引入一段上下文配置,明确的说明怎么对后端做健康状态监测(或者用probe关键字+名称来引入一段公有的健康状态监测机制,后端多台主机可以用.probe +名称引用);比如请求后端主机的那个url或者用.request来指定向后端主机发送的请求的报文;对后端主机的响应多少次我们认为是健康的,监测频度,超时时长等等信息;

  示例:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上红框中的配置就表示对webserver1这台主机做健康状态监测;其中.window表示基于最近的多少次检查来判读其健康状态;.threshold表示最近.window中定义的检查次数至少有多少次是成功的,我们就认为后端主机上健康的;.interval表示检查的频度,多久检查一次;.timeout表示超长时长;综上所述,该配置就表示对webserver1这台主机做健康状态监测,如果每隔2秒,超时时长为1秒,请求该主机上的/index.html资源,在最近5次中有4次是成功的,我们就认为后端主机上健康的;

  当然以上是对一台主机做健康状态检查的配置。如果是多台主机,监测的方式都是一样的,我们可以把对健康状态监测的配置单独用probe + 名称来定义监测机制;然后在个server中用.probe +名称来应用我们定义的健康状态监测的配置;

  示例:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上配置就表示定义了一个健康状态监测的配置其名称为webserver_check,然后在个后端server的配置中用.probe来对webserver_check调用;意思就表示两台主机都用同样的监测配置;

  当然除了以上对rul请求外,我们也可使用向后端主机发送指定一的请求报文的形式来定义健康状态监测机制;

  示例:

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:以上配置表示对于server1的健康状态监测是向server1发送特定的请求首部,如果每隔2秒超时时长为1秒,在5次请求中有4次是200的响应码,我们就认为该主机上健康的,否则不健康;对于server2主机的健康状态监测是通过项该主机上的特定资源/index.html发起请求,如果每个2秒超时1秒的情况下,5次请求中有4次都是200的响应码,我们就认为该主机上健康的,否则不健康;如果不指定.expected_response默认值就是200;

  测试:编译加载default.vcl 看看我们配置的健康状态监测是否正确

[root@test_node1-centos7 ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-693.el7.x86_64,x86_64,-sfile,-smalloc,-hcritbit
varnish-4.0.5 revision 07eff4c29 Type 'help' for command list.
Type 'quit' to close CLI session. varnish> vcl.load check_cfg default.vcl
200
VCL compiled. varnish> vcl.use check_cfg
200
VCL 'check_cfg' now active varnish>

  提示:上面load过程没有保存,说明我们配置后端服务器健康状体检查的配置没有问题;接下来测试把后端主机服务宕机,在管理shell中使用backend.list查看对应主机是否会变为sick?

WEB缓存系统之varnish代理以及健康状态检测配置

  提示:通过上面的测试结果看,我们把后端主机192.168.0.10这台主机的httpd服务给停了,然后在看后端主机情况,立刻webserver1的状态就变为了sick,我们接着又把服务给启动起来,再看后端服务器状态,可看到当检查到第四次是正常的响应后,状态就变成health;说明我们配置后端主机健康状态监测是没有问题的;

WEB缓存系统之varnish代理以及健康状态检测配置的更多相关文章

  1. WEB缓存系统之varnish基础入门(一)

    前文我们聊了下http协议里的缓存控制机制以及varnish架构组件介绍,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12620538.html:今天我们来聊 ...

  2. WEB缓存系统之varnish状态引擎

    前文我们聊了下varnish的VCL配置以及语法特点,怎样去编译加载varnish的vcl配置,以及命令行管理工具varnishadm怎么去连接varnish管理接口进行管理varnish,回顾请参考 ...

  3. WEB缓存系统之varnish缓存项修剪

    前文我们聊了下varnish的状态引擎和不同类型的变量对应该使用在那个状态引擎中,以及每个状态引擎的对应处理事务:回顾请参考https://www.cnblogs.com/qiuhom-1874/p/ ...

  4. 如何编写LVS对Real Server的健康状态检测脚本

    简介:Linux 虚拟服务器(Linux Virtual Server. LVS),是一个由章文松开发的*软件.利用KVS可以实现高可用的.可伸缩缩的Web, Mail, Cache和Medial等 ...

  5. Tengine笔记3:Nginx的反向代理和健康状态检查

    通常代理服务器只用于处理内部网络对Intenet的请求,客户端必须通过代理服务器把本来要发送到Web服务器上的请求通过代理服务器分发给Web服务器,Web服务器响应时再通过代理服务器把响应发给客户端: ...

  6. WEB服务健康状态检测

    #!/bin/sh #date:2015-12-07 #filename:check_web.sh #作者:lixingli #Email:1162572407@qq.com #version:v1. ...

  7. kubernetes之健康状态检测

    1.说明 容器探针: kubelet 对容器执行的定期诊断 探针执行方式: LivenessProbe: 判断容器是否存活 running状态, 如果不健康kubelet就会杀掉pod,根据重启策略R ...

  8. 企业级缓存系统varnish应用

    场景 随着公司业务快速发展,公司的电子商务平台已经聚集了很多的忠实粉丝,公司也拿到了投资,这时老板想通过一场类似双十一的活动,进行一场大的促销,届时会有非常多的粉丝访问网站,你的总监与市场部门开完会后 ...

  9. [转载]WEB缓存技术概述

    [原文地址]http://www.hbjjrb.com/Jishu/ASP/201110/319372.html 引言 WWW是互联网上最受欢迎的应用之一,其快速增长造成网络拥塞和服务器超载,导致客户 ...

随机推荐

  1. java轻量级IOC框架Guice

    Google-Guice入门介绍(较为清晰的说明了流程):http://blog.csdn.net/derekjiang/article/details/7231490 使用Guice,需要添加第三方 ...

  2. windows10搭建django1.10.3+Apache2.4

    很多教程都是在linux上搭建,windows上似乎天生不太适合,但是我还是愿意试试这个坑. 首先 交代一下自己的环境 python3.5.2 64位 django 1.10.3 apache 2.4 ...

  3. C 结构体小结

    看了三天结构体,是时候总结一下了. 关于结构体的声明: struct Student { ]; char sex; int age; ]; }; /*然后定义一个Student 类型的 student ...

  4. WPF如何实现拖拽打开文件(将文件拖进窗体打开)

    在WPF中的实现和WinForm中的实现99%相似,将要实现接受拖拽释放的控件添加DragEnter事件和Drop事件,本例中控件Grid grid作为接受控件,添加事件操作如下: private v ...

  5. rollback的作用

    #pragma mark - 以队列的形式添加 // 以队列的形式添加数据FMDB比较常用的添加方式 // FMDB不支持多个线程同时操作,所以一般以串行的方式实现相关操作 - (IBAction)i ...

  6. UIImage扩展用代码直接改变图片大小

    以下内容属于转载 在iOS中,uiimage没有用于修改大小的属性,要在代码中改变uiimage图片的大小,需要扩展UIImage类,如下: 头文件: #import<UIKit/UIKit.h ...

  7. office365的开发者训练营,免费,在微软广州举办

    本活动在微软官网的地址: https://www.microsoft.com/china/events/detail_1707   先上活动内容:   Office 365每月有超过1亿的商业活跃用户 ...

  8. Docker镜像拉不下来&quest;试试这些

    DaoCloud 加速器1.0(永久免费) DaoCloud是国内第一家Dock Hub加速器提供商 注意,加速器 2.0 需要使用 DaoCloud 自己的云服务器才可以使用.官方宣称会继续支持加速 ...

  9. 开源通用爬虫框架YayCrawler-页面的抽取规则定义

    本节我将向大家介绍一下YayCrawler的核心-页面的抽取规则定义,这也是YayCrawler能够做到通用的主要原因之一.如果我要爬去不同的网站的数据,尽管他们的网站采用的开发技术不同.页面的结构不 ...

  10. Android 通过浏览器打开应用

    在很多应用的web站,其实都有这样一个功能,就是直接在网页中打开应用,接下来的就来探讨一下这个功能的实现,有些地方也我还没弄明白,还请懂的大神指点. 首先,得说一点不好消息,在微信中,这样的方式是行不 ...