varnish基础

varnish概念


初步认识

首先来跟我学习,v~a~r~n~i~s~h~~ ,学会了没有~

当然还有很重要的一个概念,它是高性能缓存服务器,举个例子。

好比我们要去买东西,所有的我们需要的东西是在超市厂家生产出来的,我们需要的话去超市厂家取。这代表离服务器端近

在好比我们要去超市买东西,这个超市厂家负责送货到家门口楼下的超市,那我们肯定选择离我们自己近的。这就是代表离客户端近

而缓存的功能就是把客户端经常需要“买”的东西送到客户端门口,毕竟web的存在就是为了给客户端提供服务的,所以缓存是一个非常重要的概念。那怎么把数据送到客户端门口呢,我们最常接触的就是浏览器缓存,比如你访问过一个网站,第一次打开需要加载,但是如果你打开了第二个页面感觉又想回到上一个页面直接返回就可以,此时并不需要重新加载,这就是缓存的一种。

缓存运行时遵从的理念

时间局部性:一个数据被访问过之后,被统计接下来被访问的概率。

空间局部性:一个数据被访问时,周边数据被访问的概率。

这些称为缓存的热区,那空间满了怎么办?使用LRU算法,根据时间最近和频率最少使用来清理缓存。

还有需要注意的一点是,以上所有的数据都是经过客户端一段时间的访问来统计出来的,而且要知道缓存是重启失效的,所以你懂得,没事可以把服务器经常关机或者重启试试,肯定特别刺激。

varnish程序选项以及配置


调用方式看下图;

 

 

VCL语法格式:

/etc/varnish/default.vcl

  • 必须以VCL 4.0;开始;
  • //,  # ,/* foo */  全部为注释;
  • 根据不同的需求把不同的配置写进不同的配置段;
    • sub vcl_recv {

      }

    • sub vcl_backend_response {

      }

    • sub vcl_deliver {

      }

  • 终止语句return()没有返回值;
  • 不支持循环;
  • 众多内置变量,便令的可调用位置和state engine 有密切关系;
  • 支持众多操作符,=赋值 ==等值比较 ~模式匹配 !取反  &&逻辑与  || 逻辑或;
  • “域”专用语言只能用在特定的“域”上;

/etc/varnish/varnish.params

  • RELOAD_VCL=1  ##启动时会不会自动加载VCL配置文件,1为确认;
  • VARNISH_VCL_CONF=/etc/varnish/default.vcl  ##默认加载的缓存策略文件;
  • VARNISH_SECRET_FILE=/etc/varnish/secret  ##秘钥文件存储位置;
  • VARNISH_USER=varnish   ##所属用户
  • VARNISH_GROUP=varnish  ##所属组

VCL配置文件重载:varnish_reload_vcl  

缓存存储机制:

  • .malloc[,size]:内存存储,size用来定义缓存空间大小,重启失效。
  • .file,path[,size]:文件存储,重启失效。
  • .persistent,path,size:文件存储,重启有效,但是实验阶段不稳定不建议使用。

内置变量机制:

req.*:request,表示由客户端发来的请求报文相关;
bereq.*:由varnish发往BE(后端主机)的httpd请求相关;
bereq.http.HEADERS
bereq.request:请求方法;
bereq.url:请求的url;
bereq.proto:请求的协议版本;
bereq.backend:指明要调用的后端主机;
req.http.Cookie:客户端的请求报文中Cookie首部的值; 
req.http.User-Agent ~ "chrome"
beresp.*:由BE主机响应给varnish的响应报文相关;
resp.*:由varnish响应给client相关;
beresp.*, resp.*:
beresp.http.HEADERS
beresp.status:响应的状态码;
reresp.proto:协议版本;
beresp.backend.name:BE主机的主机名;
beresp.ttl:BE主机响应的内容的余下的可缓存时长;
obj.*:存储在缓存空间中的缓存对象的属性;只读;
obj.hits:此对象从缓存中命中的次数;
obj.ttl:对象的缓存时长
obj.grace :缓存时长宽限期
下面图为变量应用的位置以及是否可执行读或写;

 


使用两个centos7.3实验演示,看起来清晰一点。

centos 1 192.168.150.161 安装httpd

centos 2 192.168.150.160 安装varnish

编辑centos 1 httpd配置文件;

[root@localhost: script]# vim /var/www/html/index.html 

<h1> centos7.3 httpd test page </h1>

systemcel start httpd ##启动服务;

编辑centos 2 varnish 配置文件 ;

[root@localhost: script ]# vim /etc/varnish/varnish.params ##程序选项文件,配置varnish服务进程的工作特性,例如监听地址端口以及缓存机制;

......

13 # VARNISH_LISTEN_ADDRESS=192.168.1.5 ##监听在哪个地址,这里注释了代表监听在本机所有的IP;

14 VARNISH_LISTEN_PORT=80 ##监听本机的哪个端口默认为6081;

15

16  # Admin interface listen address and port ##配置管理员选项;

17 VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 ##监听在本机那个IP;

18 VARNISH_ADMIN_LISTEN_PORT=9877 ##监听在本机那个端口;

.....

24 # man page for details.

25 VARNISH_STORAGE="file,/data/varnish,1g" ##默认存在缓存中这里配置为存在磁盘,文件目录,以及文件大小,目录需要手动创建并且需要设置varnish用户为属主与属组;

......

[root@localhost: script ]# /etc/varnish/default.vcl ##配置各Child/Cache线程的缓存策略,先把httpd配置为后端主机;

......

15 # Default backend definition. Set this to point to your content server.

16 backend default { ##定义后端主机;

17   .host ="192.168.150.161"; ##默认是127.0.0.1,改为httpd服务器IP;

18   .port = "80"; ##默认为8080,改为80;

19   }

20

21 sub vcl_recv {

22

22

23   if (req.method != "GET" &&   ##设置默认策略,请求方法如果不是GET,HEAD,PUT,POST,TRACE,IPTIONS,DELETE,其中一个,则跳转至pipe,避免有比较老的系统不能访问网站;

24     req.method != "HEAD" &&

25     req.method != "PUT" &&

26     req.method != "POST" &&

27     req.method != "TRACE" &&

28     req.method != "OPTIONS" &&

29     req.method != "DELETE") {

30   return (pipe);

31   }

32

33   if (req.method != "GET" && req.method != "HEAD") {  ##如果请求方法不是GET,HEAD则跳转至pass;

34     return (pass);

35   }

36   if (req.http.Authorization || req.http.Cookie) {   ##如果请求中有认证相关的信息或者cookie信息则跳转至pass;

37     return (pass);

38   }

39   return (hash);

40  }

 

[root@station103: varnish]# mkdir /data/varnish -pv ##创建缓存文件目录

systemctl start varnish ##启动服务

使用浏览器访问192.168.150.160 基本框架已经搭好。

 

 

配置centos 1

[root@localhost: varnish]# mkdir /var/www/html/{login,admin} -pv

[root@localhost: varnish]# echo 1111 >   /var/www/html/login/index.html

[root@localhost: varnish]# echo 1111 >   /var/www/html/admin/index.html

配置centos 2 

[root@localhost: varnish]# vim /etc/varnish/default.vcl

sub vcl_recv {   

  if (req.url ~ "(?i)^/(login|admin)") {  ##表示如果访问的是login或者admin任何文件则去硬盘中找;
    return(pass);
  }

}

[root@localhost: varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:9877   ##交互式登录 -S 指定秘钥文件  -T 指定本机127.0.0.1以及自己配置的端口;

vcl.load test1 default.vcl    ##从default.vcl配置文件中装载进缓存,命名为 test1,需要注意,这里是装载进的缓存,重启失效。使用vcl.show test1 可以查看配置 加 -v显示详细配置;
200
VCL compiled.

vcl.list   ##查看所有列表,test1已经存在 但是非活动状态;

200
active 0 boot
available 0 test1

vcl.use test1  ##启用test1 
200
VCL 'test1' now active

查看访问网页 http://192.168.150.160/login/因为有关键字,摁F12,可以看到并没有缓存

 

[root@station103: varnish]# vim /etc/varnish/default.vcl

sub vcl_deliver {   ## 定义

  if (obj.hits>0) {    ##如果访问记录大于等于1次;
    set resp.http.X-Cache = "HIT via " + server.ip;    ## 自定义首部 为HIT vai + IP,空格要自己加 看起来整齐一点;
  } else {   ##否则;
    set resp.http.X-Cache = "MISS via " + server.ip;   ## 自定义首部为 MISS via ;
  }

}

记得自己要去 varnish交互式界面同步 ;

vcl.load test2 default.vcl  
200
VCL compiled.


vcl.use test2   ##生效新的配置test2
200
VCL 'test2' now active

第一次访问 MISS 

 

第二次刷新 已经显示HIT;

       

清缓存

ban(banning)为禁用缓存 使用方法一样 ;

vim /etc/varnish/default.vcl

acl purgers {   ##首先要定义组
  "127.0.0.1"/8;
  "192.168.150.160"/16;
}

sub vcl_recv {  

  if (req.method == "PURGE") {  ##如果请求方法是PURGE;
    if (!client.ip ~ purgers) {  ##基于上面的基础 如果请求的IP 为定义的acl控制purgers组内的IP;
      return(synth(405,"Purging not allowed for " + client.ip));  ##返回值为405 中间加上内容 后面加上访问者IP;
    }
  return(purge);  ##跳转至PURGE;
  }  ##这样如果客户端请求过有缓存的话使用purge方法请求一次会清空缓存;在访问就会MISS

}

 使用curl 方法指定请求方法来访问验证试验结果;

[root@station103: /root]# curl -I http://192.168.150.160/index.html   ##先请求 为HIT 代表有之前有缓存;
HTTP/1.1 200 OK
Date: Sat, 01 Jul 2017 11:35:42 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 62 52
Age: 112
Via: 1.1 varnish-v4
X-Cache: HIT via 192.168.150.160   ##显示为HIT
Connection: keep-alive

[root@station103: /root]# curl -X PURGE http://192.168.150.160/imdex.html<!DOCTYPE html>   ##使用PURGE 方法请求;
<html>
<head>
<title>405 Purging not allowed for 192.168.150.160</title>
</head>
<body>
<h1>Error 405 Purging not allowed for 192.168.150.160</h1>   ##返回值为我们设定的405 以及IP ;
<p>Purging not allowed for 192.168.150.160</p>
<h3>Guru Meditation:</h3>
<p>XID: 65584</p>
<hr>
<p>Varnish cache server</p>
</body>
</html>


[root@station103: /root]# curl -I http://192.168.150.160/index.html   ##再次请求发现MISS;
HTTP/1.1 200 OK 
Date: Sat, 01 Jul 2017 11:38:10 GMT
Server: Apache/2.4.6 (CentOS) PHP/5.4.16
Last-Modified: Sat, 01 Jul 2017 02:56:40 GMT
ETag: "25-55338aedeff49"
Content-Length: 37
Content-Type: text/html; charset=UTF-8
X-Varnish: 65586
Age: 0
Via: 1.1 varnish-v4
X-Cache: MISS via 192.168.150.160  ##MISS 代表缓存已清空
Connection: keep-alive

 定义多个虚拟主机;

[root@station103: varnish]# vim /etc/varnish/default.vcl

13 vcl 4.0;
14
15 import directors;  ##首先一定要调用这个模块,否则不能定义;
16
......
22 backend web1 {   ##定义backend主机1
23   .host ="192.168.150.161";
24   .port = "80";
25 }
26 backend web2 { ##定义backend主机2; 
27    .host ="192.168.150.152";  
28   .port = "80";
29 }
30 sub vcl_init { ##初始化组
31·        new web = directors.round_robin();  ##定义web为组名,directors为模块, round_robin为调度方法;
32    web.add_backend(web1);  ##添加主机1至web组,是可以加权重的,如果加权重是这样写(web1,2)主机名字后面逗号隔开写上权重;
33    web.add_backend(web2);  ##添加主机2至web组;
34 }
35
36
37 sub vcl_recv {
38
39    set req.backend_hint = web.backend();  ##调用组

40 }

此时添加了一个主机 centos 3 IP为192.168.150.152

安装httpd 

[root@localhost ~]# mkdir /var/www/html/{login,admin} -pv

[root@localhost ~]# echo centos7.3 httpd test page2 > /var/www/html/login/index.html

[root@localhost ~]# systemctl start httpd

centos 1 

[root@localhost: /root]# echo centos7.3 httpd test page1 > /var/www/html/login/index.html

因为需要测试,所以不能使用有缓存的文件,特地创建一个login目录,(之前有设置过权限)内容不统一,方便查看测试效果。

轮询效果实现;

 

 loading.....

转载于:https://www.cnblogs.com/MYue/p/7102052.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引入Spring集成

在本文中&#xff0c;我们介绍Spring Integration 。 如果您以前没有使用过Spring Integration&#xff0c;那么可能会帮助您复习Gregor Hohpe的Enterprise Integration Patterns 。 我还将推荐Josh Long 撰写的这篇出色的介绍性文章 。 上下文设置 简而言之&#xff0c; 企业…

PAT 1024. 科学计数法 (20)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法&#xff0c;其满足正则表达式[-][1-9]"."[0-9]E[-][0-9]&#xff0c;即数字的整数部分只有1位&#xff0c;小数部分至少有1位&#xff0c;该数字及其指数部分的正负号即使对正数也必定明确给出。 现以科…

Mac上Hive环境搭建

本文介绍在Mac上搭建Hive环境。 建议首先配置好Hadoop&#xff0c;搭建与配置可以参考我之前的博文Mac Hadoop的安装与配置。 当然你也可以选择使用Docker搭建环境&#xff0c;本文不作介绍。 安装 对于MacOs&#xff0c;推荐使用HomeBrew安装hive&#xff0c;一步到位。 $ bre…

mysql+创建备份账户_mysql 添加用户,授予权限,数据库备份等 (转载)

一&#xff0c;连接MySQL格式&#xff1a;mysql -h 远程主机地址 -u 用户名 -p 回车输入密码进入&#xff1a;mysql -u root -p 回车Enter password: ,输入密码就可以进入mysql> 进入了退出命令:>exit 或者ctrlD二&#xff0c;MySQL管理与授权1.修改密码&#xff1a;格式…

分代缓存和转换

康拉德&#xff08;Konrad&#xff09;最近在我们公司的技术室中分享了有关如何完成缓存的有趣文章&#xff0c;这是一个大型的波兰社交网络nk.pl。 算法中的核心概念之一是分代缓存 &#xff08;请参阅此处或此处 &#xff09;。 基本思想是&#xff0c;对于缓存键&#xff0c…

css精灵

○ css 精灵&#xff08;Sprites&#xff09;技术利用photoshop将图片整合&#xff0c;然后用background-images&#xff0c;background-position&#xff0c;background-repeat技术&#xff0c;对图片进行精确定位。 ○ 优点&#xff1a;减少http请求数量&#xff0c;减少服务…

基于Jenkins+Gitlab的自动化部署实战

故事背景 一个中小型企业&#xff0c;是典型的互联网公司&#xff0c;当初期的时候可能运维只能标配到2~3人&#xff0c;此时随着公司的发展&#xff0c;项目会逐渐增多。前期部署项目可能都是手动的&#xff0c; 俗称“人肉部署”&#xff0c;这简直是无比的痛苦&#xff0c;不…

cmd如何刷新MySQL数据库_怎样在cmd中用命令操作MySQL数据库 需要技巧

用命令来操作MySQL是工作必备的&#xff0c;今天我就来分享一下cmd命令操作MySQL数据库的方法&#xff0c;希望有帮助。工具/材料电脑xampp操作方法01首先&#xff0c;启动MySQL服务才行哦。这里我是用xampp集成的数据库&#xff0c;方便&#xff0c;点击‘start’。02如图&…

Java顺序IO性能

许多应用程序将一系列事件记录到基于文件的存储中&#xff0c;以供以后使用。 从日志记录和审核&#xff0c;直到在事件源设计或其紧密相关的CQRS中保留事务重做日志&#xff0c;这都可以是任何东西。 Java具有多种方法&#xff0c;可以通过这些方法将文件顺序写入或重新读取。…

text段,data段,bss段,堆和栈

.bss段和.data段的区别 text段,data段,bss段,堆和栈转载于:https://www.cnblogs.com/jingzhishen/p/6203107.html

[BZOJ3529][Sdoi2014]数表

[BZOJ3529][Sdoi2014]数表 试题描述 有一张Nm的数表&#xff0c;其第i行第j列&#xff08;1 < i < n&#xff0c;1 < j < m&#xff09;的数值为能同时整除i和j的所有自然数之和。给定a&#xff0c;计算数表中不大于a的数之和。输入 输入包含多组数据。输入的第一行…

ZK的实际应用:MVVM –表单绑定

这是我们从头开始构建ZK应用程序的第二集。 上一篇文章涉及使用MVVM将数据加载和呈现到表中。 在本文中&#xff0c;我们将向您介绍ZK MVVM的表单绑定。 目的 我们将构建一个“添加”功能&#xff0c;使我们能够将新条目保存到清单中。 单击“添加”时出现表格 单击“保存”…

群晖按装mysql_如何连接群晖里的MYSQL数据库

匿名用户1级2018-08-27 回答一、连接远程数据库&#xff1a;1、显示密码如&#xff1a;MySQL 连接远程数据库(192.168.5.116)&#xff0c;端口“3306”&#xff0c;用户名为“root”&#xff0c;密码“123456”C:/>mysql -h 192.168.5.116 -P 3306 -u root -p1234562、隐藏密…

ZK的实际应用:MVVM –以编程方式更新视图

在前两篇文章中&#xff0c;我们使用ZK的MVVM功能来&#xff1a; 将数据加载到表中 使用表单绑定保存数据 我们已经看到&#xff0c;用注解NotifyChange&#xff08;&#xff09;装饰方法时&#xff0c;在执行完成后&#xff0c;将向Binder通知VM属性的更改&#xff0c;以便B…

给你一个笑脸

今日冬至&#xff0c;愿你笑靥如初 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>Document</title> </head> <body> <canvas id"mycanvas" width"800px&qu…

mysql安装与配置的截图_windows下MySQL5.6版本安装及配置过程附有截图和详细说明...

随着MYSQL版本的更新以及电脑系统的变化&#xff0c;我们给大家整理了各种电脑环境下安装MYSQL的图解过程&#xff0c;希望我们整理的内容能够帮助到大家&#xff1a;mysql安装图解总结https://www.jb51.net/article/142398.htm编辑者&#xff1a;Vocabulary下面详细介绍5.6版本…

mysql 更新日的数据类型_[每日更新-MySQL基础]5.常用的数据类型-整数和字符串

1. 数据类型在学习PHP的时候我们已经讲过数据类型了&#xff0c;所谓数据类型就是数据的格式。每一种数据类型在计算机中存储的方式会有差异&#xff0c;占用的存储容量也有区别&#xff0c;所以选择合适的数据类型可以节约我们的存储成本&#xff0c;也方便我们的程序运行和…

Hello World with Spring 3 MVC

在2005年&#xff0c;我对Martin Fowler的这篇文章对Spring进行了介绍。从那时起&#xff0c;我就修改了许多IoC框架&#xff0c;包括Guice &#xff0c; PicoContainer &#xff0c; NanoContainer等。虽然我很喜欢与IoC一起工作&#xff0c;但我必须说Spring在过去的5年中&am…

ansible 安装

1、简介 ansible是新出现的自动化运维工具&#xff0c;基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的&#…

JS原型详解

参考的别人家的博客http://www.cnblogs.com/ljchow/archive/2010/06/08/1753526.html ###JS原型####JS原型&#xff0c;就是原型对象&#xff0c;简称原型。不仅构造函数有&#xff0c;普通函数也有* 普通函数&#xff1a;javascript function puTong(){ }; alert(puTong.proto…