varnish入门理解
来源:互联网 发布:网络大电影收益来源 编辑:程序博客网 时间:2024/04/29 01:42
简介
Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,开源的软件。但是也有企业版,有更多的功能。
我们知道,在计算机界,缓存为王。我们访问百度时候,有没有觉得在访问时候相当的快,这就是CDN缓存的结果。以前,常用squid来进行缓存,但是squid已经是过去时了。varnish和squid的关系,相当于现在的nginx和Apache的关系,squid已经是负重前行。。。跟我来认识这个新式缓存软件吧!
缓存原理
varnish是按照访问的URL来进行缓存。
Varnish 与一般服务器软件类似,分为 master 进程和 child 进程。Master 进程读入存储配置文件,调用合适的存储类型,然后创建 / 读入相应大小的缓存文件,接着 master 初始化管理该存储空间的结构体,然后 fork 并监控 child 进程。Child 进程在主线程的初始化的过程中,将前面打开的存储文件整个 mmap 到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。Child 进程分配若干线程进行工作,主要包括一些管理线程和很多 worker 线程。
接着,开始真正的工作,varnish 的某个负责接收新 HTTP 连接线程开始等待用户,如果有新的 HTTP 连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker 线程读入 HTTP 请求的 URI,查找已有的 object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。
分配缓存的过程是这样的:它根据所读到 object 的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个 object 的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据 LRU 机制,把最旧的 object 释放掉。
释放缓存的过程是这样的:有一个超时线程,检测缓存中所有 object 的生存期,如果超初设定的 TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。
整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的 object 都考虑是在内存中,如果系统内存不足,系统会自动将其换到 swap 空间,而不需要 varnish 程序去控制。
缓存思想
实际生产中,要考虑如何提高命中率。
varnish配置
软件配置文件:/etc/varnish/varnish.params
缓存配置文件:/etc/varnish/default.vcl
varnish的管理命令:varnishadm
varnish的的软件配置文件/etc/varnish/varnish.params,其中指定了VARNISH_ADMIN_LISTEN_ADDRESS和VARNISH_ADMIN_LISTEN_PORT,从字面意思来看,是管理监听地址和管理监听端口,不错,这个套接字就是管理varnish的套接字。
配置文件中还有一个监听端口,VARNISH_LISTEN_PORT=6081,这个是varnish对外监听web请求的端口,可是为什么是6081,而不是80 端口呢?因为varnish作为缓存服务器,常常是放在nginx反代的后面,这样不面对互联网,因此就不需要监听在80端口了。
varnish的缓存配置文件是以vcl结尾的文件,在配置文件/etc/varnish/varnish.params中指定默认的配置文件是VARNISH_VCL_CONF=/etc/varnish/default.vcl, 和其他软件不同的是,此缓存配置文件是需要编译成二进制文件后方可以使用。这就涉及到了varnish的管理命令了。
管理命令varnishadm
varnishadm默认连接的就是本机的6082端口。
varnishadm -S /etc/varnish/secret -T [ADDRESS:]PORT
连接进去输入help会看到各种指令。
其中和配置文件相关:
vcl.list vcl.load:装载,加载并编译;,也可以使用在外部命令:varnish_reload_vclvcl.use:激活;vcl.discard:删除;vcl.show [-v] <configname>:查看指定的配置文件的详细信息;
运行时参数:
param.show -l:显示列表;param.show <PARAM>param.set <PARAM> <VALUE>
缓存存储:
storage.list
后端服务器:
backend.list
修改缓存配置后,如何生效?
1、使用varnishadm连接到varnish,注意尽量不要退出,否则将会不见了那些编译好的编译列表 varnishadm -S /etc/varnish/secret -T [ADDRESS:]PORT
默认只需要varnishadm即可
2、对指定的缓存配置文件,默认是default.vcl进行编译
格式:vcl.load default.vcl
其中complier_name是自定义名称,例如此处 vcl.load test1 default.vcl
3、指定使用编译好的complier_name vcl.use test1
4、可以使用vcl.list来查看编译好的那些complier_name和其正在使用情况。
配置案例
1:强制对某类资源的请求不检查缓存:
(1)编辑默认缓存配置文件
vi /etc/varnish/default.vclvcl_recv { if (req.url ~ "(?i)^/(login|admin)") { //(?i忽略大小写) return(pass); }}
(2)、使用varnishadm来管理缓存
(1)编译/etc/varnish/default.vclvcl.load test1 default.vcl(2)指定使用哪个编译结果vcl.use test1
(3)、使用curl -I ip/login/index.html来查看是否成功
2、varnish对后端web服务器负载均衡
使用前需要导入:import directors;
注意,定义多个后端主机时候,要对其后端主机有引用,否则会导致编译不成功。
(1)vi /etc/varnish/default.vcl
import directors; # load the directorsbackend imgsrv1 { .host = "192.168.10.11"; .port = "80";}backend imgsrv2 { .host = "192.168.10.12"; .port = "80";} backend appsrv1 { .host = "192.168.10.21"; .port = "80";}backend appsrv2 { .host = "192.168.10.22"; .port = "80";}sub vcl_init { //相当于awk命令中的BEGIN,在接收报文前,执行此函数,与其对应的END是vcl_fini{}块 new imgsrvs = directors.random(); imgsrvs.add_backend(imgsrv1,10); imgsrvs.add_backend(imgsrv2,20); new staticsrvs = directors.round_robin();//轮询不支持权重 appsrvs.add_backend(appsrv1); appsrvs.add_backend(appsrv2); new appsrvs = directors.hash(); appsrvs.add_backend(appsrv1,1); appsrvs.add_backend(appsrv2,1); }sub vcl_recv { if (req.url ~ "(?i)\.(css|js)$" { set req.backend_hint = staticsrvs.backend(); } if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$" { set req.backend_hint = imgsrvs.backend(); } else { set req.backend_hint = appsrvs.backend(req.http.cookie);做会话绑定 }}
(2)使用varnishadm来管理缓存
(1)编译/etc/varnish/default.vclvcl.load test1 default.vcl(2)指定使用哪个编译结果vcl.use test1
(3)测试是否成功
更加复杂的配置还要继续探究了。比如日志,状态监测等。
有什么错误,请指出,共同进步^_^
- varnish入门理解
- Varnish 入门
- Varnish 入门
- Varnish 入门
- 深入理解Varnish缓存命中率
- Varnish
- Varnish
- Varnish
- varnish
- varnish
- Varnish
- varnish
- varnish
- varnish
- Varnish
- varnish
- varnish
- varnish
- C++模板实现双向链表
- spark2.2.0源码学习过程记录:Day1 Day2
- Java并发编程的暗自努力(一)初步介绍
- hexo+github搭建个人博客(超详细教程)
- java 基础之入门第一个坑 错误:找不到或无法加载主类
- varnish入门理解
- Redis数据库存储类型
- 关于VLAN和VXLAN的理解
- c++总结 1
- PHP多文件上传函数
- 动态语言
- OpenSSL是什么?
- Jensen不等式证明过程
- 鸟哥的私房菜基础篇读书笔记