玩转 Varnish 缓存代理-阿里云开发者社区

开发者社区> boxti> 正文

玩转 Varnish 缓存代理

简介:
+关注继续查看

Varnish 是互联网架构中重要的缓存代理组件。Varnish 一般跑在流量入口处,作为最前端一道防御,非常重要。

虽然 Varnish 并不像 Nginx 那么流行。Varnish 就像 Nginx 一样稳定高效,如果使用得当,能极大提升整体服务性能、并且降低资源消耗。

常见互联网架构中的多级缓存

  1. 将内容推送到用户身边的 CDN 缓存
  2. 类似 Varnish 的缓存代理
  3. 应用层缓存 Redis,Memcache
  4. 数据库缓存

为什么缓存代理很重要

  1. 一些事实:内容的变动比不变少得多;用户内容最终一致的容忍性。基于这 2 个事实,可以节约大量重复计算和资源。
  2. 延迟一般情况下对用户体验、商业业务的影响很大。所有互联网公司都在努力降低延迟,提升用户体验。
  3. CDN 有些情况下会大量回源,比如清空 CDN 缓存的时候,应用架构本身需要能抗 100% 流量的能力。

Varnish 的几个功能

1. HTTP Header 的修改

请求头的修改


  1. unset req.http.cookie;
  2. set req.http.X-EOOD = "EOOD";

返回头的修改


  1. unset beresp.http.Set-Cookie;
  2. set beresp.http.Cache-Control = "public, max-age=31536000";

2. 内容在 Varnish 状态的暴露

缓存的命中与否


  1. if (obj.hits > 0) {
  2. set resp.http.X-Cache = "HIT";
  3. } else {
  4. set resp.http.X-Cache = "MISS";
  5. }

3. 负载均衡

Varnish 也支持后端服务器的轮询之类的简单负载均衡,但是慎用。

4. 后端保护和容错

这个功能可能有些人没有注意到,但是确实非常有用的功能,在后端挂掉的时候,只读页面仍然会成功返回给客户。


  1. set req.grace = 48h;

5. 访问控制

可以根据规则路由或者屏蔽某些访问,比如:


  1. req.http.User-Agent
  2. req.http.X-Forwarded-For
  3. req.http.referer
  4. ...

简单密码保护:Basic Auth


  1. if (! req.http.Authorization ~ "Basic XXXXXXX") {
  2. error 401 "Restricted";
  3. }

6. 多个后端合并

定义多个后端


  1. backend ads {
  2. .host = "ads.eood.cn";
  3. .connect_timeout = 1s;
  4. .first_byte_timeout = 30s;
  5. .between_bytes_timeout = 5s;
  6. }
  7. backend blog {
  8. .host = "blog.eood.cn";
  9. .connect_timeout = 1s;
  10. .first_byte_timeout = 30s;
  11. .between_bytes_timeout = 5s;
  12. }

根据域名、URL或者其他规则路由到不同的后端,这些规则可以是用户 IP, 甚至是用户 Cookie。


  1. sub vcl_recv {
  2. if (req.http.host ~ "ads" || req.url ~ "^/ads/") {
  3. set req.backend = ads;
  4. ...
  5. } else if(eq.http.host ~ "blog") {
  6. set req.backend = blog;
  7. }
  8. }

7. 根据规则进行缓存


  1. set beresp.ttl = 120s;

Varnish 运维常用命令

请求 URL 热点排名, 根据热点优化缓存策略


  1. varnishtop -i rxurl

实时请求日志


  1. varnishlog

可以通过 grep 进行过滤查看你需要的信息


  1. varnishlog -c | grep 'google'

Varnish 的注意事项

防止连接粘滞,假如你有多个不同的后端,不添加这个会导致混乱,估计很多人踩过这个坑:


  1. sub vcl_pipe {
  2. set bereq.http.connection = "close";
  3. }

URL 规划

一般缓存代理或者 CDN 都是可以通过配置 URL 规则实现不同 URL 模式使用不同的缓存策略,所以 URL 规划非常重要。
将动态请求和静态请求进行区分;将不同缓存级别的 URL 进行区分。这也有利于根据 URL 进行缓存清理。

最后

Varnish 是网站应用或者移动应用必不可少的缓存模块。如果你还没开始使用,就立刻把他加入到现有架构中吧。



原文发布时间为:2015-07-06


本文来自云栖社区合作伙伴“Linux中国”

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4623 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5839 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10785 0
+关注
boxti
12535
10037
文章
1327
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载