2.7 Varnish的常见应用实例
Varnish可应用在多方面,并且随着版本的升级,其功能性应用也在不断增加,这里仅介绍几个应用广泛、功能强大的应用实例。由于Varnish的配置格式在前面已经详细介绍过,所以这里只给出相应模块的配置代码,并附上相关的说明。
2.7.1 利用Varnish实现图片防盗链
图片防盗链功能对于大型网站的运维非常重要,各种Web服务器,如Apache和Nginx都可以很容易地实现图片防盗链功能。利用Varnish实现这个功能也非常简单,只需在配置文件的vcl_recv函数内增加如下配置即可。
if (req.http.referer ~ "http://.*") {
if ( !(req.http.referer ~ "http://.*ixdba\.net"
|| req.http.referer ~ "http://.*google\.com"
|| req.http.referer ~ "http://.*yahoo\.cn"et
|| req.http.referer ~ "http://.*google\.cn"
)) {
set req.http.host = "www.ixdba.net";
set req.url = "/templets/default/images/logo.gif";
}
return (lookup);
}
在这段配置中,用了一个内置变量req.http.referer,防盗链就是通过referer来实现的。其实,referer是http header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上一个referer标识,用来告诉服务器请求是从哪个页面链接过来的服务器根据这个标识就可以获取信息来源,进而进行相应的处理。
这段配置的含义为:Varnish服务器对接收或发送的请求进行判断,如果referer标识存在,且referer标识不匹配下面域名列表中的任意一个,就将请求重定向到www.ixdba.net域名下的/templets/default/images/logo.gif图片,而对找到匹配域名的请求执行lookup操作。
2.7.2 利用Varnish实现静态文件压缩处理
网页压缩技术是一种最为简便的提高网络速度的方法。通过压缩技术,可以减少服务器发送网页的大小,从而降低用户下载的时间,最大效率地利用带宽,提高网站的性能。Varnish本身并不提供压缩的功能,但是可以将要压缩的工作交给后端的服务器去完成,从而变相实现了网页压缩。
首先在Varnish配置文件的“vcl_recv”函数中加入如下配置:
if (req.http.Accept-Encoding) {
if (req.url ~ "\.(jpg|png|gif|gz|tgz|bz2|tbz|mp3|ogg)$") {
# No point in compressing these
remove req.http.Accept-Encoding;
} else if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
} else if (req.http.Accept-Encoding ~ "deflate") {
set req.http.Accept-Encoding = "deflate";
} else {
remove req.http.Accept-Encoding;
}
}
然后修改“vcl_hash”函数为如下配置:
sub vcl_hash {
set req.hash += req.url;
if (req.http.Accept-Encoding ~ "gzip") {
set req.hash += "gzip";
}
else if (req.http.Accept-Encoding ~ "deflate") {
set req.hash += "deflate";
}
return (hash);
}
这样就完成了Varnish的压缩配置,将需要压缩的内容都交给了后端服务器去处理。
下面通过一个实例测试来验证压缩的效果。
首先用curl命令请求未压缩的内容。
[root@varnish-server ~]#curl -I http://www.ixdba.com/article/3e/1557.html
HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix) PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1
Last-Modified: Mon, 28 Jul 2008 00:48:20 GMT
ETag: "7102d5-819f-4530ae1357d00"
Vary: Accept-Encoding,User-Agent
Content-Type: text/html
Content-Length: 33183
Date: Fri, 16 Jul 2010 06:34:35 GMT
X-Varnish: 1515651004 1515651001
Age: 17
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from ixdba.net
然后用curl命令请求压缩的内容。
[root@varnish-server~]#curl http://www.ixdba.com/article/3e/1557.html \
>-H Accept-Encoding:gzip,defalte -I
HTTP/1.1 200 OK
Server: Apache/2.2.14 (Unix) PHP/5.3.1 mod_perl/2.0.4 Perl/v5.10.1
Last-Modified: Fri, 16 Jul 2010 05:50:54 GMT
ETag: "748b19-8197-48b7acd54cb80"
Vary: Accept-Encoding,User-Agent
Content-Encoding: gzip
Content-Type: text/html
Content-Length: 8538
Date: Fri, 16 Jul 2010 06:34:27 GMT
X-Varnish: 1515651003 1515651002
Age: 5
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT from ixdba.net
通过前后两个输出结果可以清楚地看到,压缩已经生效,说明配置成功。