文档章节

如何集成varnish到已有的网站架构

wild-life
 wild-life
发布于 2015/09/30 18:14
字数 1432
阅读 2968
收藏 145

如何集成varnish到已有的网站架构

在我们现有的架构中通常是已经成熟稳定的架构,如何将高性能的缓存服务器部署在已有的环境上呢,同时部署容易,如何始终让用户看到的是最新的内容,即便是缓存命中的状态?

因此,我们直接解决上面两个问题!

如何将高性能的缓存服务器部署在已有的环境上呢?

通过实际使用情况,将varnish部署上线通常有两种拓扑图:

1、user---->web--->varnish--->application_server
这种情况更适合网站已经使用了cdn的情况,varnish主要充当缓存网页页面的功能。

or

2、user---->varnish--->web--->application_server
这种情况适合通常性的小网站,并没有富裕的资金,或者说为了充分的节约开支,毕竟如果效果理想,这部分的资源完全可以作为程序员薪水的部分(wan quan bu ke neng!)

对于如何安装varnish,请参考官方文档或者之前的blog。两种方式无外乎在于如何调度网站流量,以及配置源server而已。

如何始终让用户看到的是最新的内容,即便是缓存命中的状态?

有了上面的两种结构,我们来说如何更新缓存的问题,这也是基本所有问题的所在。

举个实际例子,通常作为一个cms站点,都会有访问域名(www)和管理域名(console),这里我们简称前台(客服妹子)和后台(diaosi chengxuyuan),并且使用上面的第二种架构。 那么我们的架构就是这样的:

前台用户通过internet访问您的网站,首先经过varnish的处理,如果cache中hit,ok,返给用户,访问结束,如果miss,进行和之前没有使用varnish的访问流程。(注:此处只画出必要的部分。当然像redis缓存等其他组件这些东西包含在上面的架构也是没有任何问题的。)

后台编辑用户,通过后台发布更新,操作数据,并且更新到数据库中。

现在问题来了(wa jue ji shu na jia qiang?!):

在没有使用缓存时,用户每次都通过应用服务器获取到最新的内容。后台修改也是直接更新到数据库。

对比

使用缓存后,实际某篇文章被缓存后,并且在有效期内,用户的请求是不会到达web服务器,更别说应用服务器。这就是说即便你的编辑在后台更新了十万次该文章,如果文章仍然在缓存期内,前台用户是不会有任何变化。

解决这个问题通常有两种方式:

1、对缓存对象设置一个较小的缓存失效时间。(被动更新)
2、通过varnish的接口对已经缓存的对象进行操作。(主动更新)

可以衡量二者的优劣,

被动更新简单维护量小会存在用户得到非最新资源的情况;
主动更新效果显著维护量较被动更新更大,不过向笔者这种大神级别高端玩家(da gao wan)来说,被动更新显然是不能忍受的额。

实际例子

实际上我们通过后台管理系统可以向varnish发送更新某资源的请求即可,如下图:

具体到配置:我们的前后台web服务器均使用openresty,具体就不多介绍了,引用一句话"春哥是我见过开源精神最强的人"

首先对于我们需要修改的文章都是有对应的文章id,在后台编辑更新都会发起post请求,或者get请求。通过后台openresty在收到更新文章请求时,发送一个同步的非阻塞的子请求到前台varnish,并在varnish中配置用于接收该请求,执行varnish的ban操作。

我们来看配置文件。

后台的openresty:

server {
    listen 80;
    server_name console.example.com;

    location ~ /articles/(\d+)/[change_status|edit] {
        error_log   logs/error.log debug;

        proxy_set_header X-Real-IP $http_x_forwarded_for;
        proxy_set_header X-Forwarded-For $http_x_forwarded_for;
        proxy_set_header Host $host;
        set $article_id $1;
        rewrite_by_lua '
            ngx.location.capture("/console.example.com/foo/"..ngx.var.article_id, { args = { cmd = "update" } })
        ';
        proxy_pass http://127.0.0.1:9090;
    }

当然这只是最核心能说明问题的代码,不了解的可以查阅ngx.location.capture ,通过在该location中加入rewritebylua,具体它和proxy_pass的执行顺序是rewrite在前。笔者在实际测试中发现,nginx的第三方模块echo也提供发起了子请求的功能,但实际始终在proxy_pass之后,并不能实现需要的功能。

前台的varnish,同样取核心部分:

    sub vcl_recv {
        if (req.method == "GET" && client.ip ~ "192.168.11.11" && req.url ~ "/console.example.com/foo/\d+"  ) {
        set req.http.purge-url = regsub(req.url,"/console.example.com/foo/(\d+).*","\1.html");
        ban("req.url ~ " + req.http.purge-url);
        set req.backend_hint = default;
        return(pass);
    }
}

这里主语clint.ip当然你可以设置为一个集群,这个参考官方文档。

acl ban {
    "localhost";
    "192.168.11.168";
}

这样后端更新时会通知varnish更新相关的资源,主动更新功能实现。 由于设置了return(pass),在前端的web中最好配置一段location来匹配该请求,可以简单的return 200即可。

前端web:

server{
    ...
    location = /console.example.com/foo/\d+ {
        return 200;
    }
}

对于有需要更新图片等静态资源的情况。可以编写一个通用的ban或者purge接口。具体可参考官方文章。

后续

配置文件基于varnish4,建议需要上生成环境的,多阅读官方文档。当然也可以瞅瞅我的部分博客,总之,多测试!!word is cheap ,show me your code。


© 著作权归作者所有

共有 人打赏支持
wild-life
粉丝 17
博文 94
码字总数 56147
作品 0
成都
技术主管
私信 提问
加载中

评论(5)

wild-life
wild-life
确实,单从维护角度来说,nginx的成本确实要小些,实际上也是对一些常见的反向缓存代理做过测试的,可控性最大的便是varnish,其实也主要看是否能最大的同业务结合,用什么也不会太局限于某一种。。
steven0lisa
steven0lisa
曾经用过varnish,后来改用了更轻量的nginx cache
P
Primaries
MARK
MGL_TECH
MGL_TECH
mark
easytzb
easytzb
79
Varnish构建高负载Drupal网站 – 高级篇

继上篇高负载网站之Varnish与Drupal – 基本篇后,本篇我们来深入讨论Varnish的优化,缓存页面,ESI,Cookie过滤,登录用户的缓存以及与drupal的配合使用等相关话题。 首先我们熟悉一下两个V...

大虾.
2012/08/17
0
0
实现基于Keepalived+Haproxy+Varnish+LNMP企业级架构

一:环境介绍 1、操作系统 web网站基于centos7搭建的lnmp的电子商务网站,负载均衡器基于centos6的keepalived+haproxy的架构,缓存服务器是基于centos7的varnish搭建的缓存服务。 2、服务安装...

疯帽爱丽丝
2017/11/16
0
0
试用Squid的替代产品 ── Varnish

Varnish是一款 高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang (vg.no) 使用3台Varnish代替了原来的12台squid,性能比以前更好。 Varnish 的作者Poul-Henning Kamp是FreeBSD的内核...

红薯
2008/10/05
3.3K
1
企业级网站架构--LVTRM

LVTRM是什么? LVTRM是基于LINUX+Varnish+Tengine+Resin+Mysql的企业级网站架构。 哪些环境用到它? LVTRM本身定位于企业级应用架构,如高并发的门户网站,业务网站,商城。在多台硬件或云主...

krasonly
2013/11/29
1K
4
varnish 4.0 官方文档翻译4-varnish用户手册概况

The Varnish Users Guide varnish用户手册 varnish 文档包含三个主要的文档: The Varnish Tutorial 解释一些基本的东西让你开始使用varnish The Varnish Users Guide 说明varnish怎样工作以...

wild-life
2015/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

table边框样式

table{ border:0.5px solid #000; border-collapse:collapse; //去除边框间空隙}th,td{ border:0.5px solid #000;}...

学霸猫
28分钟前
2
0
分布式消息通讯Kafka原理分析(二)

本章重点: 1.消息的存储原理2.Partition的副本机制原理3.副本数据同步原理 消息的文件存储机制 通过如 下命令找到对应partition下的日志内容 [root@localhost ~]# ls /tmp/kafka-logs/f...

须臾之余
33分钟前
2
0
Vue Element表单绑定(四)常用操作整理

一、启用回车提交报单操作 在登录页面,使用回车提交表单操作一般是必要的一个操作。在 Element中如何使用呢,示例如下: 来个注意点: 1.button按钮的native-type设置为submit,而不是绑定c...

tianma3798
37分钟前
2
0
《大话数据结构》读后总结(七)

常见的时间复杂度 执行次数 函数阶 非正式术语 12 O(1) 常数阶 2n+3 O(n) 线性阶 3n^2+2n+1 O(n2) 平方阶 5log2n+20 O(logn) 对数阶 2n+3nlog2n+19 O(nlogn) nlogn阶 6n^3+2n^2+3n+4 O(n3) 立...

徐曙辉
39分钟前
2
0
three.js 事件交互

点击查看交互效果 在three.js中,展示的一切内容都是在canvas中绘制的,所以点击事件点击到物体上是无法获取点击对象的,要获取点击的对象要使用RayCaster,用于在三维空间中进行鼠标拾取,原...

tianyawhl
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部