aaaaaa 发表于 2012-04-15 18:00

使用Apache Traffic Server代理服务器缓存视频文件

本帖最后由 aaaaaa 于 2013-04-11 15:26 编辑

序言

国内的上网环境中,带宽费用实在不是一笔小钱。企业上网中,尤其碰到很多带宽不够用的情况。然而并不是所有的单位都有能力、有办法解决上网带宽的物理限制。因此以减少上网带宽为目标的web代理服务器在企业内部发挥着很重要的作用,一台普通上网代理服务器就可以为企业节省50%以上的上网带宽。上网不拥堵啦,自然是好事。但是有很多情况下,代理服务器很难解决,如视频网站的url都是动态的,它们并不用使用常规域名方式,甚至每个人看到的url都是不同的。传统的squid等代理服务器对这种情况解决起来就复杂了。我们今天介绍如何使用Apache Traffic Server来解决这样的难题。
我们可以做什么?

研究所有的视频网站,你会发现其实他们还是有很多共同点的: 1,多数使用IP地址的URL,不使用域名 2,多数都含有key=xxx的一些授权信息,正式这些信息决定了每个用户真正访问到的视频文件URL是完全不同的,这些信息决定了这个URL的有效期等等。 3,对同一个视频内容,可以找到它的真正id 如果我们对这些url进行转换,是否就可以解决了呢?是的,完全可以!Apache Traffic Server有很方便扩展的API接口,我们已经有插件可以解决这个问题。
安装配置cacheurl插件
下载:

要解决这个难题,squid需要对url进行外挂脚本插件操作,并且效率不够高。而TS则只要用TS的插件cacheurl,就可以很方便的解决啦。这个非常小但功能强大的插件,目前已经存放在官方的ATS代码里:

    https://git-wip-us.apache.org/repos/asf?p=trafficserver.git;a=tree;f=plugins/experimental/cacheurl;hb=HEAD

大家可以直接从这个网站snapshot下来,或者用官方的git repo来clone:

    https://git-wip-us.apache.org/repos/asf/trafficserver.git


编译安装:

要使用这个插件,我们需要首先安装配置好Apache Traffic Server 3.x的版本,建议使用最新版本,如3.0.4, 3.1.3或更新版本。插件的编译安装非常简单,编译安装功能也被封装进Makefile了:

    zym@zym6400 ~/git/trafficserver-plugins/cacheurl $ ls
    cacheurl.ccacheurl.config.exampleCHANGESLICENSEMakefileNOTICEREADME
    zym@zym6400 ~/git/trafficserver-plugins/cacheurl $ make
    tsxs -c cacheurl.c -o cacheurl.so
      compiling cacheurl.c -> cacheurl.lo
      linking -> cacheurl.so
    zym@zym6400 ~/git/trafficserver-plugins/cacheurl $

安装只要make install就可以了(取决于你的系统,你可能需要以root的权限执行):

    zym@zym6400 ~/git/trafficserver-plugins/cacheurl $ make install
    tsxs -i -o cacheurl.so
      installing cacheurl.so -> /opt/ats/libexec/trafficserver/cacheurl.so
    zym@zym6400 ~/git/trafficserver-plugins/cacheurl $

配置启用

编译安装就完成了,下面我们配置并启用cacheurl:

    修改etc/trafficserver下的plugin.config,添加: cacheurl.so
    复制源代码下的cacheurl.config.example到上面cacheurl.so安装到的目录里,如上面是/opt/ats/libexec/trafficserver/。并修改相关配置,后面有具体例子。
    重启server进程。

配置cacheurl.config很简单,只要你知道你想缓存的目标url的一些正则规则就好,下面是几个常见视频网站的配置:

    http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}[^&]*/f4v/.*id=tudou.itemid\=(*).* http://www.tudou.com/$1
    http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}[^&]*/flv/.*id=tudou.itemid\=(*).* http://www.tudou.com/$1
    http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/youku/.*/(.*-.*-.*-.*-.*) http://www.youku.com/$1
    http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/sohu/*/*/*/(.*).mp4?key=.* http://tv.sohu.com/$1.mp4
    http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/videos2/[^/]*/[^/]*/([^/]*.f4v)?key=.*http://www.iqiyi.com/$1


另,经纸鸢发现,youku的规则改为:
http://[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}/youku/.*/(.*-.*-.*-.*-[^?]*)(.*) http://www.youku.com/$1
可以解决在用户拖拉的时候产生很多 url?start=88 之类的请求不命中的情况,增加命中率。


结束语

很简单吧?如想了解更多的,欢迎联系我们。
FAQ:

Q:如何分析提炼这些规则?

A:使用像firebug等工具是很好的选择。

Q:如何验证是否缓存住了呢?

A1:使用Apache Traffic Server的http_ui工具:参考 https://cwiki.apache.org/TS/faq.html#FAQ-httpui
A2:或启用response VIA头,使用http://trafficserver.apache.org/docs/v2/admin/trouble.htm#interpret_via_header解码
A3:或参考log目录下的cacheurl.log文件,这里记录了所有匹配的URL以及转换后的URL。



cacheurl.log日志格式,后一字段为变化后的URL地址:

    20120415.17h20m57s Rewriting cache URL for http://61.153.87.199/f4v/30/126201130.h264_1.f4v?81000&key=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&playtype=1&tk=XXXXXXXXXXXXXXXXXXXXXXXXXXX&brt=2&bc=14&nt=0&du=1440000&ispid=137&rc=207&inf=1&si=sl&id=tudou&itemid=89768396&fi=XXXXXXXXX&sz=XXXXXXXX&posky=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&plybgn=1 to http://www.tudou.com/89768396
    20120415.17h20m58s Rewriting cache URL for http://118.228.16.40/youku/XXXXXXXXXXXXXXXXXXXXXXXXXX/03000204014F8A7B0E6357063BEF72A9079725-E7C9-2D47-D487-33427E380B07.flv to http://www.youku.com/03000204014F8A7B0E6357063BEF72A9079725-E7C9-2D47-D487-33427E380B07.flv

iamxiaocainiao 发表于 2012-04-16 10:34

学习

LnBSD 发表于 2012-04-16 11:06

感谢分享

aaaaaa 发表于 2012-04-16 11:48

回复 3# LnBSD


    你现在用的啥模式,有啥特别需要的模块不?目前插件里zip和ESI插件很有意思,不知道你有没有需要啊

LnBSD 发表于 2012-04-16 18:14

本帖最后由 LnBSD 于 2012-04-16 18:16 编辑

ESI部分项目计划要上,一直没时间测试
目前比较纠结ats缓存穿透的问题,比squid的穿透率高了很多
cacheurl模块功能不错,不过我以前测试是失败的;我们一直都是前端nginx+后端ats(squid)来进行域名或url整合的,效果和效率都还可以吧。
做url hash,前面怎么也都需要加一层nginx或haproxy。

aaaaaa 发表于 2012-04-16 18:47

你说的穿透率问题很感兴趣,如果可以的话,尽量多看看这些问题。我们也作了很多这方面的改进:
比如:
1,cache 0字节的内容,默认TS是不cache 0字节长度的response的。 TS-621上已经有我们的patch,这个是我们验证的安全可靠的,你如果有用可以来试试看。
2,改进了cache规则,比如启动模糊expire等
3,对negative的response也可以启动cache


nginx(或haproxy)+TS一直是我的心病,TS的cluster是一个很好的solution,但是效率目前仍有些问题,我们正在研究改进。

ESI加紧测试啊,这个功能真的很有意义

zhiyuanwan 发表于 2012-06-18 20:42

太好了!很好的学习资料。迷上ATS~

tao_627 发表于 2012-07-06 20:03

嗯,前辈还是泄漏了一些我们通常看不到的资料

aaaaaa 发表于 2012-07-07 00:13

我们还有很多的宝贝没抖出来呢,最近大规模上线差不多完了,等我们再招几个人来,我就有机会给大家放些更有意思的料,呵呵

tao_627 发表于 2012-07-10 10:55

前辈,ATS有支持SPDY的打算吗?另外,这两天我研究了一些Akamai的资料,我觉得ESI这个很有意思的,对处理动态网页很有好处,不知道该模块当前是否功能十分成熟?能否达到实用的阶段?
页: [1] 2 3 4 5
查看完整版本: 使用Apache Traffic Server代理服务器缓存视频文件