• 如何衡量缓存系统的优劣性
1:缓存命中率:
在memcached服务器中,get_hits的值表示缓存命中的次数,get_misses的值表示没有命中的次数,那么命中率的计算公式就是:命中率=get_hits/(get_hits+get_misses)
终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要到原服务器取,就是没有命中。取数据的过程与用户访问是同步进行的,所以即使是重新取的新数据,用户也不会感觉到有延时。 命中率=命中数/(命中数+没有命中数), 缓存命中率是判断加速效果好坏的重要因素之一。
 
 
2:命中率有两种衡量指标
文档命中率:从命中的文档数量角度来衡量
字节命中率:从命中的字节大小角度来衡量
  • 应该让哪些资源被缓存
1:静态资源中的公共资源缓存
2:静态资源中的私有资源不缓存
3:动态资源中的公共资源缓存
4:动态资源中的私有资源不缓存
HTTP/1.0 响应首部
Expires
HTTP/1.1 响应首部
Cache-Control:max-age=60
  •  

(三)varnish进


  • 安装
RPM包
yum install -y varnish
 
编译安装
wget http://varnish-cache.org/_downloads/varnish-4.0.5.tgz
  • 官方文档
http://varnish-cache.org
  • varnish存储类型
1)Malloc 通过malloc获取内存,及分配内存。
2)Mmap file 创建大文件,通过二分法分段映射成1G以内的大块。
  • varnish配置文件讲解
default.vcl :主配置文件
 
varnish.params :服务器参数配置文件

(四)varnish配置文件详解


  • 配置varnish进程参数的配置文件/etc/varnish/varnish.params,在启动varnish的时候,就会调用这个文件,可以在/usr/lib/systemd/system/varnish.service文件中看到,启动是确实调用了这个参数文件
 
# 指定重新reload varnish的时候,重新reload一下VCL配置文件
RELOAD_VCL=1
 
# 指定VCL的配置文件
VARNISH_VCL_CONF=/etc/varnish/default.vcl
 
# 指定varnish作为反代时候监听的地址和端口
# 在企业级情况下,varnish通常是面向的Nginx或haproxy这样的反代负载均衡器,可以实现端口映射的功能,不一定是80端口
# 监听的地址为192.168.1.5,默认是注释的,表明监听本机的所有的IP地址
# VARNISH_LISTEN_ADDRESS=192.168.1.5
VARNISH_LISTEN_PORT=7000
 
# 指定varnishadm的shell登入接口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
 
# 指定shell接口使用的密钥文件
VARNISH_SECRET_FILE=/etc/varnish/secret
 
 
# 指定varnish存储的类型,以及大小,这里使用默认的内存缓存,大小为256M即可, 也可以使用file的存储
# VARNISH_STORAGE="file,/var/lib/varnish/varnish_storage.bin,1G"
VARNISH_STORAGE="malloc,256M"
 
# 指定varnish进程的属主和属组
VARNISH_USER=varnish
VARNISH_GROUP=varnish
 
# 指定运行时的参数,使用-p选项来指定,thread_pools=6:表示启用6个线程池,thread_pool_min=5:表示每个线程池里面最少5个线程,thread_pool_max=500:表示每个线程池里面最大500个线程,thread_pool_timeout=300:表示线程的请求超时时长
DAEMON_OPTS="-p thread_pools=6 -p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"
  • 请求过程和响应过程分析
请求处理流程
(1)请求的为可以缓存对象
1:缓存命中:通过本地缓存响应客户端
2:缓存未命中:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象,可以缓存的对象先缓存再响应给客户端,不可以缓存的对象,不缓存直接响应给客户端
 
(2)请求的为不可以缓存对象
1:varnish扮演为客户端的角色,发送请求报文,向后端服务器请求资源对象
  • 在编写vcl配置文件中,常用的对象分类
1:req.:由客户发来的http请求相关
req.http.:拿到请求报文各个首部值
例如:req.http.Cookie 拿到请求报文中的Cookie首部的值
 
 
2:resp.:由varnish响应给client的http响应报文
resp.http. :响应报文的各个首部
例如:set resp.http.X-Cache = "HIT from " + server.hostname 给X-Cache首部赋值
 
 
3:bereq.:由varnish向backend主机发出的http请求 (backend request:后端主机的请求报文)
bereq.http. :向backend主机发送的请求报文的对象
 
 
4:beresp.:由backend主机发来的http响应报文
beresp.http. :由backend主机发来的http的响应报文的对象
 
 
5:obj. :存储在缓存空间中的缓存对象属性
  • 在编写vcl配置文件中,常用的对象,已经对象的意义说明
1:req
req.method:请求的方法
req.url:请求的URL
 
2:bereq
bereq.http.HEADERS:varnish的请求报文首部
bereq.request:请求方法
bereq.url:请求的URL
bereq.proto:协议版本
bereq.backend:指明要调用的后端主机
 
3:beresp
beresp.proto:后端主机响应给varnish的协议版本
beresp.status:响应状态码
beresp.backend.name:后端主机的主机名
beresp.http.HEADERS:后端主机响应报文的首部
beresp.ttl:后端主机响应内容ttl值
 
4:obj
obj.hits:对象在缓存中命中的次数
obj.ttl:对象的ttl值
 
5:server:
server.ip:主机的IP
server.hostname:主机名
 
vcl 4.0;
 
# 导入调度器模块
import directors;
 
#############################(一)################################
# 指定调度到后端的主机
backend web1 {
.host = "192.168.23.21";
.port = "8000";
.probe = {
# 指定做健康状态检查的URL,既然给了这个URL,一定需要让后端主机的站点目录里面有这个URL,如果没有varnish将不会将请求调度到这台主机上
.url = "/health.html";
# 指定检查的超时时长
.timeout = 2s;
# 检查每次检查的时间间隔
.interval = 4s;
# 指定一个检测多少次
.window = 5;
# 指定最少成功多少次认为后端主机有效
.threshold = 1;
}
}
 
backend web2 {
.host = "192.168.23.22";
.port = "8000";
.probe = {
# 指定做健康状态检查的URL
.url = "/health.html";
# 指定检查的超时时长
.timeout = 2s;
# 检查每次检查的时间间隔
.interval = 4s;
# 指定一个检测多少次
.window = 5;
# 指定最少成功多少次认为后端主机有效
.threshold = 1;
}
}
 
 
#############################(二)################################
 
# 定义负载均衡调度器
sub vcl_init {
# 创建一个调度器对象,directors.round_robin()指定了轮询调度算法
new static = directors.round_robin();
static.add_backend(web1);
static.add_backend(web2);
}
 
 
 
#############################(三)################################
# 第一个子历程,当收到请求处理的子历程
sub vcl_recv {
 
# 指定varnish接受到的请求,如果缓存没有命中,直接全部发往后端的static主机组
set req.backend_hint = static.backend();
 
 
# 如何请求方法是pri,直接返回synth子历程
if (req.method == "PRI") {
/* We do not support SPDY or HTTP/2.0 */
return (synth(405));
}
 
 
# 如果不是一下七中方法的任意一个,直接返回pipe子历程
if (req.method != "GET" &&
req.method != "HEAD" &&
req.method != "PUT" &&
req.method != "POST" &&
req.method != "TRACE" &&
req.method != "OPTIONS" &&
req.method != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
 
 
# 如果不是get或者head方法,我们就不用去查缓存,直接交由后端主机处理就是
if (req.method != "GET" && req.method != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
 
 
# 如果客户端的请求报文中的http首部包含认证信息或cookie信息,也直接交由后端主机处理,这是保密的静态内容
# 由于在haproxy对于动态请求都会在用户的浏览器中设置cookie信息,因此,下面这项先将其注释掉,以免请求都不能查询缓存
#if (req.http.Authorization || req.http.Cookie) {
# /* Not cacheable by default */
# return (pass);
#}
 
 
 
 
 
 
# 否则其他的请求都通过hash子历程处理
return (hash);
}
 
 
#############################(四)################################
 
# 对后端主机响应的响应报做修改
sub vcl_backend_response {
 
# 如何发往后端主机的请求报文的http首部中没有s-maxage参数,那么做两个if判断
# 1:如果请求的是css样式代码,设置响应回来的资源对象的ttl值为7200s,并且删除Set-Cookie参数
# 2:如果请求的是jpg图片,设置响应回来的资源对象的ttl值为7200s,并且删除Set-Cookie参数
# 其他的请求都交由deliver子历程处理
if (beresp.http.cache-control !~ "s-maxage"){
# 这里要写为bereq.url,如果写成beresp.url会报错
if (bereq.url ~ "(?i)\.css$") {
 
set beresp.ttl = 7200s;
unset beresp.http.Set-Cookie;
 
}
 
if (bereq.url ~ "(?i)\.js$") {
 
set beresp.ttl = 7200s;
unset beresp.http.Set-Cookie;
 
}
 
if (bereq.url ~ "(?i)\.jpg$") {
 
set beresp.ttl = 7200s;
unset beresp.http.Set-Cookie;
 
}
}
 
return (deliver);
}
 
#############################(五)################################
 
 
# 这一条子历程是最后一个子历程
# 在deliver子历程中可以修改响应报文http的首部
sub vcl_deliver {
 
# 如果客户端的请求被缓存命中,那么加一个http的首部参数,明确告诉用户请求的资源是从缓存加载的
if (obj.hits>0)
{
 
set resp.http.X-Cache = "HIT from " + server.hostname;
 
}else{
 
set resp.http.X-Cache = "MISS from " + server.hostname;
 
}
 
}

(五)varnish工具介绍(对于缓存服务器,修改了配置,千万不能重启,重启就会清空所有的内存)


  • varnishadm
# 获取帮助
varnishadm -h
 
# 登入到varnishadm的命令行接口
varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
 
# 获取命令帮助
help
 
# 装载指定的配置文件
vcl.load <configname> <filename>
例如:vcl.load config1 default.vcl
 
# 使用指定的配置文件
vcl.use <configname>
例如:vcl.use config1
 
# 删除配置文件
vcl.discard <configname>
例如:vcl.discard boot
 
# 列出所有可用的配置文件
vcl.list:
例如:vcl.list
 
# 显示配置文件的内容
vcl.show [-v] <configname>
例如:vcl.show config1
 
# 列出后端可用的主机
backend.list
  • varnishstat
查看varnish服务器的状态信息

Varnish是一款高性能的开源HTTP加速器的更多相关文章

  1. 龙芯将两款 CPU 核开源,这意味着什么?

    10月21日,教育部计算机类教学指导委员会.中国计算机学会教育专委会将2016 CNCC期间在山西太原举办“面向计算机系统能力培养的龙芯CPU高校开源计划”活动,在活动中,龙芯中科宣布将GS132和G ...

  2. 基于Ubuntu14.04下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  3. 基于CentOS6.5下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    不多说,直接上干货! 为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物 ...

  4. 【转帖】龙芯将两款 CPU 核开源,这意味着什么?

    龙芯将两款 CPU 核开源,这意味着什么? https://www.oschina.net/news/78316/loongson-open-source-two-cpu-core 文章挺不错的 也讲 ...

  5. 【万字长文】Dubbo 入门总结 ,一款高性能的 Java RPC 框架

    这篇文章是我学习整理 Dubbo 的一篇文章,首先大部分内容参考了官网 + 某硅谷的视频,内容讲解进行了重新编排,40多张图片,也都是我修改重制的,虽然一万多字,但是其实也可以看出来,更多的内容集中在 ...

  6. Web 项目可能会用到的20款优秀的开源工具

    开源的应用程序和它们的源代码可以免费获得,因为版权是属于任何进行过修改或者提交代码的人.大多数提供开源软件的公司都可以建立行业标准,因此可以获得有利的竞争优势. 很多的开源应用程序和工具都有很强的替代 ...

  7. 8个实用的SVG工具,20 个有用的 SVG 工具,五款超实用的开源SVG工具

    8个实用的SVG工具 [导读] 你还在为没有好用的SVG工具而发愁吗?开发人员的福音来啦!小编为大家收集罗列了8款实用的SVG工具,让我们一起来看看吧! SVG可缩放矢量图形(Scalable Vec ...

  8. 五款超实用的开源 SVG 工具

    英文链接:Idrsolutions SVG(Scalable Vector Graphics)是基于 XML 的矢量图像格式,用户可灵活运用图像进行搜索.索引.脚本以及压缩(来自:湖北教育考试网).S ...

  9. BeetleX高性能通讯开源组件

    net core高性能通讯开源组件BeetleX https://www.cnblogs.com/smark/p/9617682.html BeetleX beetleX是基于dotnet core实 ...

随机推荐

  1. 04.flume+kafka环境搭建

    1.flume下载 安装 测试 1.1 官网下载,通过xshell从winser2012传到cent0s的/opt/flume目录中,使用rz命令 1.2 解压安装 tar -zxvf apache- ...

  2. 图 ADT接口 遍历运算 常规运算 邻接矩阵实现

    Graph.h   (图的结构, 遍历, 常规操作接口) /*定义图的最大定点数, 它要大于等于具体图的顶点树n*/ #define MaxVertexNum 12 /*定义图的最大边数,它要大于等于 ...

  3. Vue2.5入门-1

    vue如何引用和使用,实例和挂在点的介绍 <!DOCTYPE html> <html> <head> <title>vue 入门</title&g ...

  4. Makefile:如何写目标依赖

    本文并不是Makefile的教程,仅是本人学习时的感悟. Makefile的基本格式 目标:依赖文件(or 目标) [tab]命令 目标: 是要生成的或操作的命令的索引 依赖: 是生成目标依赖的文件或 ...

  5. 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd

    学习pwd命令 man pwd查看 pwd命令用于显示当前工作目录,是Linux下最常用的命令之一.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 环境变量OLDPWD表示 ...

  6. html 第一行不缩进,第二行缩进,文字对齐

    <p style="text-indent: -7rem;margin-left: 7rem;"> <img src="images/记录要求.png& ...

  7. MySql数据的插入-replace into

    一.新的数据插入方式:REPLACE INTO mysql中常用的插入方式:INSERT INTO 如果要插入不重复的数据的方式:REPLACE INTO 二.二者比较: replace into 首 ...

  8. 简单的Slony-I设置实例

    磨砺技术珠矶,践行数据之道,追求卓越价值 回到上一级页面: PostgreSQL集群方案相关索引页     回到顶级页面:PostgreSQL索引页 参考如下链接: http://lets.postg ...

  9. (EX)CRT总结

    (EX)CRT总结 这个东西是联赛的时候搞的,早就忘了,写篇博客复习一下 中国剩余定理(crt) 给定\(a\).\(m\) \[ x\equiv a_1(mod\;m_1)\\ x\equiv a_ ...

  10. 基于ejabberd实现各个客户端消息同步

    先上图再说(左侧是web端,右侧是ios端)              要实现上面的功能,如果所有设备都在线的话,那么carboncopy(xmpp xep-0280协议)这个模块是可以实现接收到的消 ...