plaintext,backend default {, .host = "127.0.0.1";, .port = "8080";,},,sub vcl_recv {, if (req.url ~ "^/static/") {, return (lookup);, }, else {, return (pass);, },},,sub vcl_hit {, set req.http.XCache = "HIT";, return (deliver);,},,sub vcl_miss {, set req.http.XCache = "MISS";, return (fetch);,},
“,,这个配置将会缓存所有以”/static/”开头的URL,其他请求将直接传递给后端服务器。你可以根据你的需求调整这个规则。高命中率的Varnish缓存配置分享
Varnish简介
Varnish是一款高性能的开源反向代理服务器和HTTP缓存服务器,其功能与Squid服务器相似,但具有更高的性能、更快的速度以及更便捷的管理,Varnish的设计架构充分利用了现代计算机系统的特点,如多层次的内存和硬盘缓存机制,Varnish由PoulHenning Kamp开发,他是FreeBSD内核的开发者之一,自2006年发布以来,Varnish经过多年的发展和改进,现已成为许多大型网站的首选缓存解决方案。
Varnish的优势
1、高稳定性:Varnish在处理相同负荷时,比Squid更加稳定,减少了故障几率。
2、快速访问:由于采用“Visual Page Cache”技术,所有缓存数据直接从内存读取,而Squid则从硬盘读取,因此Varnish的访问速度更快。
3、高并发支持:Varnish的TCP连接释放比Squid快,因此在高并发情况下能够支持更多的TCP连接。
4、灵活管理:Varnish可以通过管理端口使用正则表达式批量清除部分缓存,而Squid无法做到这一点。
5、多核利用:Varnish通过fork形式打开多进程来处理请求,从而合理使用所有CPU核心。
Varnish的劣势及解决方案
1、缓存数据易丢失:Varnish进程崩溃或重启会导致缓存数据从内存中完全释放,给后端服务器带来压力。
解决方案:建议使用Varnish的内存缓存方式,并在其后增加多台Squid服务器作为第二层缓存,以弥补Varnish缓存在内存中重启会释放的问题。
2、资源浪费:如果单个URL的请求通过负载均衡分散到不同的Varnish服务器上,会造成缓存穿透和资源浪费。
解决方案:在负载均衡上做URL哈希,让单个URL请求固定请求到一台Varnish服务器上。
Varnish配置详解
配置文件结构
Varnish的配置主要通过VCL(Varnish Configuration Language)实现,这是一种简单的域专用语言,用于定义缓存策略,VCL文件通常保存为.vcl
文件,需要编译成二进制格式后才能被Varnish调用。
常用配置指令
1、backend:定义后端服务器。
“`vcl
backend default {
.host = "127.0.0.1";
.port = "8080";
}
“`
2、sub vcl_recv:自定义接收请求时的处理逻辑。
“`vcl
sub vcl_recv {
if (req.url ~ "^/static/") {
return(pipe);
}
}
“`
3、sub vcl_fetch:自定义从后端服务器获取数据时的处理逻辑。
“`vcl
sub vcl_fetch {
set obj.ttl = 1h;
}
“`
4、sub vcl_hit:自定义缓存命中时的处理逻辑。
“`vcl
sub vcl_hit {
set obj.ttl = 1h;
}
“`
5、sub vcl_miss:自定义缓存未命中时的处理逻辑。
“`vcl
sub vcl_miss {
return(fetch);
}
“`
高命中率的配置策略
1、静态资源缓存:应尽量缓存静态资源,如图片、CSS、JavaScript文件等,这些资源不经常变化,且占用大量带宽。
2、动态资源缓存:对于公共资源的动态内容也应进行缓存,但私有内容的动态资源不建议缓存。
3、缓存控制:利用HTTP头中的CacheControl和Expires字段来控制缓存时间,设置较长的过期时间可以减少缓存未命中的概率。
4、负载均衡:通过合理的负载均衡策略,确保每个URL请求都落在固定的Varnish服务器上,避免缓存资源的浪费。
FAQs
1、如何衡量缓存系统的优劣性?
衡量缓存系统的优劣性主要有两个指标:文档命中率和字节命中率,文档命中率是指从文档数量角度来衡量缓存的命中率;字节命中率则是从字节大小的角度来衡量,计算公式如下:
文档命中率 = get_hits / (get_hits + get_misses)
字节命中率 = 命中的字节数 / (命中的字节数 + 未命中的字节数)
2、如何提高Varnish的命中率?
要提高Varnish的命中率,可以采取以下措施:
尽量缓存静态资源和公共资源的动态内容。
设置合适的缓存时间,利用HTTP头中的CacheControl和Expires字段。
通过合理的负载均衡策略,确保每个URL请求都落在固定的Varnish服务器上,避免缓存资源的浪费。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1102119.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复