缓存varnish的管理及配置详解

一 工作原理

在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用。常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键。而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server。严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器。同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在相同的服务器成本下提供更好的缓存效果,Varnish更是作为CDN缓存服务器的可选服务之一。

Varnish主要有以下几点特性:
 1.缓存位置:可以使用内存也可以使用磁盘。如果要使用磁盘的话推荐SSD做RAID1
 2.日志存储:日志也存储在内存中。存储策略:固定大小,循环使用
 3.支持虚拟内存的使用。
 4.有精确的时间管理机制,即缓存的时间属性控制。
 5.状态引擎架构:在不同的引擎上完成对不同的缓存和代理数据进行处理。可以通过特定的配置语言设计不同的控制语句,以决定数据在不同位置以不同方式缓存。类似于netfilter中的钩子,在特定的地方对经过的报文进行特定规则的处理。
 6.缓存管理:以二叉堆格式管理缓存数据,做到数据的及时清理。

二 基本架构

1. 状态引擎

2.内部处理流程

三 配置详解

1. 简单安装

[[email protected] ~]# yum install varnish -y

2. 配置详解

[[email protected] ~]# cd /etc/varnish

配置default.vcl配置文件

[[email protected] varnish]# cat default.vcl
# 使用varnish版本4的格式.
vcl 4.0;
# 加载后端轮询模块
import directors;
#######################健康检查策略区域###########################
# 名为www_probe的健康检查策略
probe www_probe {
 .request =
 "GET /html/test.html HTTP/1.1"    # 健康检查url为/html/test.html 协议为http1.1
# "Host: www.xiaxiaodie.com"        # 访问的域名为www.xiaxiaodie.com
 "Connection: close";        # 检查完关闭连接
#其他参数 如 超时时间 检查间隔 等 均使用默认
}
##################################################################
#######################配置后端区域################################
backend backend_15 {
 .host = "172.18.67.15";
 .port = "80";
 .probe = www_probe; # 使用名为www_probe的健康检查策略
}
backend backend_16 {
 .host = "172.18.67.16"
 .port = "80";
 .probe = www_probe; # 使用名为www_probe的健康检查策略
}
#默认后端
backend default {
 .host = "172.18.67.15"
 .port = "80";
}
###################################################################
# 配置后端集群事件
sub vcl_init {
# 后端集群有4种模式 random, round-robin, fallback, hash
 # random 随机
 # round-robin 轮询
 # fallback 后备
 # hash 固定后端 根据url(req.http.url) 或 用户cookie(req.http.cookie) 或 用户session(req.http.sticky)(这个还有其他要配合)
 # 把backend_15 和 backend_16配置为轮询集群 取名为www_round_robin
 new www_round_robin = directors.round_robin();
 www_round_robin.add_backend(backend_15);
 www_round_robin.add_backend(backend_16);
 # 把backend_15 和 backend_16配置为随机选择集群 取名为www_random
 new www_random = directors.random();
 www_random.add_backend(backend_15,10);  # 设置backend_15后端的权重为10
 www_random.add_backend(backend_16,5);   # 设置backend_16后端的权重为5
 # 把backend_15 和 backend_16配置为固定后端集群 取名为www_hash 在recv调用时还需要添加东西 看recv例子
 new www_hash = directors.hash();
 www_hash.add_backend(backend_15,1);        # 设置backend_15后端的权重为1
 www_hash.add_backend(backend_16,1);        # 设置backend_16后端的权重为1
}
#定义允许清理缓存的IP
acl purge {
# For now, I‘ll only allow purges coming from localhost
 "127.0.0.1";
 "localhost";
}
# 请求入口 这里一般用作路由处理 判断是否读取缓存 和 指定该请求使用哪个后端
sub vcl_recv {
 # 域名为 www.xiaxiaodie.com 的请求 指定使用名为www_round_robin的后端集群  在集群名后加上 .backend() 如只使用单独后端 直接写后端名字即可 如 = backend_16;
 if (req.http.host ~ "node2") {
  set req.backend_hint = www_round_robin.backend();
 }
 # 使用固定后端集群例子 使用名为www_hash的集群
 if (req.http.host ~ "3g.xiaxiaodie.com") {
 set req.backend_hint = www_hash.backend(req.http.cookie);  # 根据用户的cookie来分配固定后端 可以指定其他分配规则
 }
 # 其他将使用default默认后端
 # 把真实客户端IP传递给后端服务器 后端服务器日志使用X-Forwarded-For来接收
 if (req.restarts == 0) {
  if (req.http.X-Forwarded-For) {
   set req.http.X-Forwarded-For = req.http.X-Forwarded-For + ", " + client.ip;
  } else {
   set req.http.X-Forwarded-For = client.ip;
  }
 }
 # 匹配清理缓存的请求
 if (req.method == "PURGE") {
  # 如果发起请求的客户端IP 不是在acl purge里面定义的 就拒绝
  if (!client.ip ~ purge) {
   return (synth(405, "This IP is not allowed to send PURGE requests."));
  }
  # 是的话就执行清理
  return (purge);
 }
 # 如果不是正常请求 就直接穿透没商量
 if (req.method != "GET" &&
  req.method != "HEAD" &&
  req.method != "PUT" &&
  req.method != "POST" &&
  req.method != "TRACE" &&
  req.method != "OPTIONS" &&
  req.method != "PATCH" &&
  req.method != "DELETE") {
   /* Non-RFC2616 or CONNECT which is weird. */
  return (pipe);
  }
 # 如果不是GET和HEAD就跳到pass 再确定是缓存还是穿透
 if (req.method != "GET" && req.method != "HEAD") {
  return (pass);
 }
 # 缓存通过上面所有判断的请求 (只剩下GET和HEAD了)
 return (hash);
}
# pass事件
sub vcl_pass {
# 有fetch,synth or restart 3种模式. fetch模式下 全部都不会缓存
return (fetch);
}
# hash事件(缓存事件)
sub vcl_hash {
# 根据以下特征来判断请求的唯一性 并根据此特征来缓存请求的内容 特征为&关系
 # 1. 请求的url
 # 2. 请求的servername 如没有 就记录请求的服务器IP地址
 # 3. 请求的cookie
 hash_data(req.url);
 if (req.http.host) {
 hash_data(req.http.host);
 } else {
 hash_data(server.ip);
 }
 # 返回lookup , lookup不是一个事件(就是 并非指跳去sub vcl_lookup) 他是一个操作 他会检查有没有缓存 如没有 就会创建缓存
 return (lookup);
}
# 缓存命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
sub vcl_hit {
 # 可以在这里添加判断事件(if) 可以返回 deliver restart synth 3个事件
 # deliver  表示把缓存内容直接返回给用户
 # restart  重新启动请求 不建议使用 超过重试次数会报错
 # synth    返回状态码 和原因 语法:return(synth(status code,reason))
 # 这里没有判断 所有缓存命中直接返回给用户
 return (deliver);
}
# 缓存不命中事件 在lookup操作后自动调用 官网文档说 如没必要 一般不需要修改
sub vcl_miss {
 # 此事件中 会默认给http请求加一个 X-Varnish 的header头 提示: nginx可以根据此header来判断是否来自varnish的请求(就不用起2个端口了)
 # 要取消此header头 只需要在这里添加 unset bereq.http.x-varnish; 即可
 # 这里所有不命中的缓存都去后端拿 没有其他操作 fetch表示从后端服务器拿取请求内容
 return (fetch);
}
# 返回给用户的前一个事件 通常用于添加或删除header头
sub vcl_deliver {
 # 例子
 # set resp.http.*    用来添加header头 如 set resp.http.xiaxiaodie = "haha"; unset为删除
 # set resp.status     用来设置返回状态 如 set resp.status = 404;
 # obj.hits        会返回缓存命中次数 用于判断或赋值给header头
 # req.restarts    会返回该请求经历restart事件次数 用户判断或赋值给header头
 # 根据判断缓存时间来设置xiaxiaodie-Cache header头
 if (obj.hits > 0) {
  set resp.http.xiaxiaodie_Cache = "cached";
 } else {
 set resp.http.xiaxiaodie_Cache = "uncached";
 }
 #取消显示php框架版本的header头
 unset resp.http.X-Powered-By;
 #取消显示nginx版本、Via(来自varnish)等header头 为了安全
 unset resp.http.Server;
 unset resp.http.X-Drupal-Cache;
 unset resp.http.Via;
 unset resp.http.Link;
 unset resp.http.X-Varnish;
 #显示请求经历restarts事件的次数
 set resp.http.xiaxiaodie_restarts_count = req.restarts;
 #显示该资源缓存的时间 单位秒
 set resp.http.xiaxiaodie_Age = resp.http.Age;
 #显示该资源命中的次数
 set resp.http.xiaxiaodie_hit_count = obj.hits;
 #取消显示Age 为了不和CDN冲突
 unset resp.http.Age;
 #返回给用户
 return (deliver);
}
#处理对后端返回结果的事件(设置缓存、移除cookie信息、设置header头等) 在fetch事件后自动调用
sub vcl_backend_response {
 #后端返回如下错误状态码 则不缓存
 if (beresp.status == 499 || beresp.status == 404 || beresp.status == 502) {
  set beresp.uncacheable = true;
 }
 #如请求php或jsp 则不缓存
 if (bereq.url ~ "\.(php|jsp)(\?|$)") {
  set beresp.uncacheable = true;
 #php和jsp以外的请求
 } else {
 #如请求html 则缓存5分钟
  if (bereq.url ~ "\.html(\?|$)") {
   set beresp.ttl = 300s;
   unset beresp.http.Set-Cookie;
  #其他缓存1小时 如css js等
  }else{
  set beresp.ttl = 1h;
  unset beresp.http.Set-Cookie;
  }
 }
 #开启grace模式 表示当后端全挂掉后 即使缓存资源已过期(超过缓存时间) 也会把该资源返回给用户 资源最大有效时间为6小时
 set beresp.grace = 6h;
 #返回给用户
 return (deliver);
}

配置varnish.params配置文件

[[email protected] varnish]# vim varnish.params
# Varnish environment configuration description. This was derived from
# the old style sysconfig/defaults settings
# Set this to 1 to make systemd reload try to switch VCL without restart.
RELOAD_VCL=1
# Main configuration file. You probably want to change it.
VARNISH_VCL_CONF=/etc/varnish/default.vcl
# Default address and port to bind to. Blank address means all IPv4
# and IPv6 interfaces, otherwise specify a host name, an IPv4 dotted
# quad, or an IPv6 address in brackets.
# VARNISH_LISTEN_ADDRESS=192.168.1.5
VARNISH_LISTEN_PORT=80
# Admin interface listen address and port
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
# Shared secret file for admin interface
VARNISH_SECRET_FILE=/etc/varnish/secret
# Backend storage specification, see Storage Types in the varnishd(5)
# man page for details.
VARNISH_STORAGE="malloc,256M"
# User and group for the varnishd worker processes
VARNISH_USER=varnish
VARNISH_GROUP=varnish
# Other options, see the man page varnishd(1)
#DAEMON_OPTS="-p thread_pool_min=5 -p thread_pool_max=500 -p thread_pool_timeout=300"

3.简单管理工具

[[email protected] varnish]# varnishadm -S secret -T 127.0.0.1:6082
200       
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-327.el7.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-4.0.4 revision 386f712
Type ‘help‘ for command list.
Type ‘quit‘ to close CLI session.
help
200       
help [<command>]
ping [<timestamp>]
auth <response>
quit
banner
status
start
stop
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
param.show [-l] [<param>]
param.set <param> <value>
panic.show
panic.clear
storage.list
vcl.show [-v] <configname>
backend.list [<backend_expression>]
backend.set_health <backend_expression> <state>
ban <field> <operator> <arg> [&& <field> <oper> <arg>]...
ban.list

四 访问测试

[[email protected] varnish]# systemctl start varnish.service

时间: 2024-10-13 09:40:31

缓存varnish的管理及配置详解的相关文章

Varnish工作原理及配置详解

1.基本概念 在当前主流的Web架构中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server.严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器.同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方案,以在

Spring声明式事务管理与配置详解

转载:http://www.cnblogs.com/hellojava/archive/2012/11/21/2780694.html 1.Spring声明式事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之前对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. 总结如下: Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource.TransactionMa

centos之dhcp服务部署、管理、配置详解

DHCP全称:Dynamic Host Configuration Protocol 动态主机设置协议是一个局域网的网络协议,使用UDP协议工作,主要有两个用途:用于内部网或网络服务供应商自动分配IP地址:给用户用于内部网管理员作为对所有计算机作中央管理的手段. 功能:通常被应用在大型的局域网络环境中,主要作用是集中的管理.分配IP地址,使网络环境中的主机动态的获得IP地址.Gateway地址.DNS服务器地址等信息,并能够提升地址的使用率. DHCP协议采用客户端/服务器模型,主机地址的动态分

华为防火墙实现远程管理的方式及配置详解

关于网络设备或是服务器,管理人员几乎很少会守着设备进行维护及管理,最普遍.应用最广泛的就是--远程管理.下面简单介绍一下华为防火墙管理的几种方式. 博文大纲:一.华为防火墙常见的管理方式:二.各种管理方式配置详解:1.通过Console线进行管理:2.通过Telnet方式管理:3.通过Web方式登录设备:4.配置SSH方式登录设备: 一.华为防火墙常见的管理方式 提到管理,必然会涉及到AAA的概念,我们首先来了解一下--AAA. AAA概述 AAA是验证.授权和记账三个英文单词的简称.是一个能够

缓存varnish配置详解

一 工作原理 在当前主流的Web服务架构体系中,Cache担任着越来越重要的作用.常见的基于浏览器的C/S架构,Web Cache更是节约服务器资源的关键.而最近几年由FreeBSD创始人之一Kamp开发的varnish更是一个不可多得的Web Cache Server.严格意义上说,Varnish是一个高性能的反向代理软件,只不过与其出色的缓存功能相比,企业更愿意使用其搭建缓存服务器.同时,由于其工作在Web Server的前端,有一部分企业已经在生产环境中使用其作为旧版本的squid的替代方

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

Varnish常用配置详解

实现负载均衡 varnish所支持的调度方式有以下几种: 1.round-robin        #加权轮询,因为每个backend都有它的权重 2.random             #随机 3.dns                #基于DNS名称解析之后进行调度 例: 定义多个backend directorNAME  scheduler {     .retries = 2;     {          .backend = b1;          .weight = 2;   

redis服务部署及配置详解

Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务器. Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为"全

HAproxy负载均衡动静分离实现及配置详解

 HAproxy负载均衡动静分离实现及配置详解 HAproxy的介绍 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理.HAProxy运行在时下的硬件上,完全可以支持数以万计的并发连接.并且它的运行模式使得它可以很简单安全的整合进您当前的架构中, 同时可以保护你的web服务器不被暴露到网络上. HAProxy实现了一种事件驱动.单一进程