玩转 Varnish 缓存代理
2016-02-23 10:56
260 查看
Varnish 是互联网架构中重要的缓存代理组件。Varnish 一般跑在流量入口处,作为最前端一道防御,非常重要。
虽然 Varnish 并不像 Nginx 那么流行。Varnish 就像 Nginx 一样稳定高效,如果使用得当,能极大提升整体服务性能、并且降低资源消耗。
类似 Varnish 的缓存代理
应用层缓存 Redis,Memcache
数据库缓存
延迟一般情况下对用户体验、商业业务的影响很大。所有互联网公司都在努力降低延迟,提升用户体验。
CDN 有些情况下会大量回源,比如清空 CDN 缓存的时候,应用架构本身需要能抗 100% 流量的能力。
请求头的修改
返回头的修改
2. 内容在 Varnish 状态的暴露
缓存的命中与否
3. 负载均衡
Varnish 也支持后端服务器的轮询之类的简单负载均衡,但是慎用。
4. 后端保护和容错
这个功能可能有些人没有注意到,但是确实非常有用的功能,在后端挂掉的时候,只读页面仍然会成功返回给客户。
5. 访问控制
可以根据规则路由或者屏蔽某些访问,比如:
简单密码保护:Basic Auth
6. 多个后端合并
定义多个后端
根据域名、URL或者其他规则路由到不同的后端,这些规则可以是用户 IP, 甚至是用户 Cookie。
7. 根据规则进行缓存
实时请求日志
可以通过 grep 进行过滤查看你需要的信息
将动态请求和静态请求进行区分;将不同缓存级别的 URL 进行区分。这也有利于根据 URL 进行缓存清理。
虽然 Varnish 并不像 Nginx 那么流行。Varnish 就像 Nginx 一样稳定高效,如果使用得当,能极大提升整体服务性能、并且降低资源消耗。
常见互联网架构中的多级缓存
将内容推送到用户身边的 CDN 缓存类似 Varnish 的缓存代理
应用层缓存 Redis,Memcache
数据库缓存
为什么缓存代理很重要
一些事实:内容的变动比不变少得多;用户内容最终一致的容忍性。基于这 2 个事实,可以节约大量重复计算和资源。延迟一般情况下对用户体验、商业业务的影响很大。所有互联网公司都在努力降低延迟,提升用户体验。
CDN 有些情况下会大量回源,比如清空 CDN 缓存的时候,应用架构本身需要能抗 100% 流量的能力。
Varnish 的几个功能
1. HTTP Header 的修改请求头的修改
unset req.http.cookie; set req.http.X-EOOD = "EOOD";
返回头的修改
unset beresp.http.Set-Cookie; set beresp.http.Cache-Control = "public, max-age=31536000";
2. 内容在 Varnish 状态的暴露
缓存的命中与否
if (obj.hits > 0) { set resp.http.X-Cache = "HIT"; } else { set resp.http.X-Cache = "MISS"; }
3. 负载均衡
Varnish 也支持后端服务器的轮询之类的简单负载均衡,但是慎用。
4. 后端保护和容错
这个功能可能有些人没有注意到,但是确实非常有用的功能,在后端挂掉的时候,只读页面仍然会成功返回给客户。
set req.grace = 48h;
5. 访问控制
可以根据规则路由或者屏蔽某些访问,比如:
req.http.User-Agent req.http.X-Forwarded-For req.http.referer ...
简单密码保护:Basic Auth
if (! req.http.Authorization ~ "Basic XXXXXXX") { error 401 "Restricted"; }
6. 多个后端合并
定义多个后端
backend ads { .host = "ads.eood.cn"; .connect_timeout = 1s; .first_byte_timeout = 30s; .between_bytes_timeout = 5s; }
backend blog { .host = "blog.eood.cn"; .connect_timeout = 1s; .first_byte_timeout = 30s; .between_bytes_timeout = 5s; }
根据域名、URL或者其他规则路由到不同的后端,这些规则可以是用户 IP, 甚至是用户 Cookie。
sub vcl_recv {
if (req.http.host ~ "ads" || req.url ~ "^/ads/") { set req.backend = ads; ... } else if(eq.http.host ~ "blog") { set req.backend = blog; } }
7. 根据规则进行缓存
set beresp.ttl = 120s;
Varnish 运维常用命令
请求 URL 热点排名, 根据热点优化缓存策略varnishtop -i rxurl
实时请求日志
varnishlog
可以通过 grep 进行过滤查看你需要的信息
varnishlog -c | grep 'google'
Varnish 的注意事项
防止连接粘滞,假如你有多个不同的后端,不添加这个会导致混乱,估计很多人踩过这个坑:sub vcl_pipe { set bereq.http.connection = "close"; }
URL 规划
一般缓存代理或者 CDN 都是可以通过配置 URL 规则实现不同 URL 模式使用不同的缓存策略,所以 URL 规划非常重要。将动态请求和静态请求进行区分;将不同缓存级别的 URL 进行区分。这也有利于根据 URL 进行缓存清理。
相关文章推荐
- Xcode模拟器正常显示图片,真机无法显示,找不到图片
- Dianping River Plugin for Elasticsearch
- GitHub for Windows提交失败“failed to sync this branch”
- nginx+tomcat集群配置(4)--rewrite规则和多应用根目录设定思路
- js获得桌面size
- Oracle 分区表的新增、修改、删除、合并。普通表转分区表方法
- Ubuntu 软件源sources.list
- Jenkins进阶系列之——02email-ext邮件通知模板
- win32 ios android 获取系统时间
- 【备查】adb命令
- 1073 家族【解题报告】
- iOS8 【xcode6中添加pch全局引用文件】
- List of Algorithms
- android特殊字符
- String,StringBuffer,StringBuilder的一些面试题
- STL容器list&vector间的复制
- 计算输入的字符的字节数
- iOS-SQLite3和FMDB使用
- Nginx源码分析:核心模块剖析及常见问题
- 新技能get√丨抢了那么多红包,你知道算法是怎么实现的吗