配置环境:
操作系统:centos 6.7 x86-64
varnish端:192.168.85.129
backend端:192.168.85.156
1.安装varnish
1.1RPM安装:
rpm --nosignature -i
(or: rpm --nosignature -i for RHEL6)
yum install varnish
1.2编译安装:
[root@varnish ~]# mkdir /usr/local/varnish
[root@varnish ~]# tar xf varnish-4.1.2.tar.gz -C /usr/local/varnish
[root@varnish ~]# cd /usr/local/varnish/varnish-4.1.2
检查依赖关系:
[root@varnish varnish-4.1.2]# sh autogen.sh
+ libtoolize --copy --force
autogen.sh: line 47: libtoolize: command not found
[root@varnish varnish-4.1.2]# yum install libtool -y
[root@varnish varnish-4.1.2]# ./configure --prefix=/etc/varnish
出现错误:configure: error: rst2man is needed to build Varnish, please install python-docutils.
解决办法:yum install python-docutils
[root@varnish varnish-4.1.2]# make && make install
2.varnish文件说明
2.1安装后生成的文件
/etc/logrotate.d/varnish #varnish日志滚动配置文件
/etc/rc.d/init.d/varnish #varnish服务控制脚本文件
/etc/rc.d/init.d/varnishlog #Display Varnish logs
/etc/rc.d/init.d/varnishncsa #Display Varnish logs in Apache / NCSA combined log format
/etc/sysconfig/varnish #varnish运行参数配置文件
/etc/varnish #存放varnish的vcl文件
/etc/varnish/default.vcl #提供的默认vcl文件
2.2参数配置文件
[root@varnish varnish]# cat /etc/sysconfig/varnish
NFILES=131072 #允许打开的最大文件数
MEMLOCK=82000 #保存日志信息的内存大小
NPROCS="unlimited" #最大的线程数,默认无限制
# DAEMON_COREFILE_LIMIT="unlimited" #进程核心转储所用的最大内存空间,unlimited表示无上限
RELOAD_VCL=1 #重启varnish后是否重读vcl配置并重新编译
VARNISH_VCL_CONF=/etc/varnish/default.vcl #默认读取的vcl文件
VARNISH_LISTEN_PORT=6081 #定义varnish服务监听端口
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1 #定义管理接口的监听地址
VARNISH_ADMIN_LISTEN_PORT=6082 #定义管理接口的监听端口
VARNISH_SECRET_FILE=/etc/varnish/secret #定义前端和后端通信的密钥文件(针对管理接口,防止恶意登录)
VARNISH_MIN_THREADS=50 #定义varnish启动时的最小线程数
VARNISH_MAX_THREADS=1000 #定义varnish启动时的最大线程数
VARNISH_STORAGE_SIZE=256M #定义缓存大小(单位k,M,G,T)
VARNISH_STORAGE="malloc,${VARNISH_STORAGE_SIZE}" #指定后端存储方式为malloc及缓存大小
VARNISH_TTL=120 #后端服务器没有定义数据的缓存时间时默认的时间
通过调用定义的DAEMON_OPTS传递给varnish的init脚本来启动varnish:
DAEMON_OPTS="-a ${VARNISH_LISTEN_ADDRESS}:${VARNISH_LISTEN_PORT} \
-f ${VARNISH_VCL_CONF} \
-T ${VARNISH_ADMIN_LISTEN_ADDRESS}:${VARNISH_ADMIN_LISTEN_PORT} \
-p thread_pool_min=${VARNISH_MIN_THREADS} \
-p thread_pool_max=${VARNISH_MAX_THREADS} \
-S ${VARNISH_SECRET_FILE} \
-s ${VARNISH_STORAGE}"
注意:
可以通过调整/etc/sysconfig/varnish文件中的参数来调整启动参数如设置线程池、缓存到内存还是文件等。当然也可以在varnishd后面带上启动参数手工启动服务,具体的参数可以man varnishd;
无论是memcache还是varnish基于内存做缓存都不宜太大,太大没有好处,它有一个临界值,如果缓存设置太小,那么数据缓存会频繁被清除掉;如果缓存设置太大,那么缓存会永久存放,有些过期的也不会被清除掉,并且数据过多的查找起来也慢。建议缓存设置大小为1G-2G之间就可以了,具体的还要以环境为准;
3.启动varnish服务
此时可以尝试启动varnish查看是否有错误
[root@varnish varnish]# service varnish start
[ OK ] Varnish Cache: [ OK ]
[root@varnish varnish]# netstat -ntlp | grep :80 (此前将监听端口改为了80)
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 25013/varnishd
tcp 0 0 :::80 :::* LISTEN 25013/varnishd
此时访问并不会显示什么,因为现在只是配置好了varnish而后端服务器使用的是default.vcl文件
[root@varnish varnish]# cat default.vcl
backend default {
.host = "127.0.0.1"; #定义的后端IP
.port = "8080"; #定义的后端端口
}
因此接下来就要配置后端服务器;
4.简单配置
4.1创建一个vcl文件
[root@varnish varnish]# cat test.vcl
vcl 4.0; #4版本的一定要加上此项,否则会出错
backend webserver {
.host="192.168.85.156";
.port="80";
}
然后修改/etc/sysconfig/varnish文件中的VARNISH_VCL_CONF值为/etc/varnish/test.vcl,最后启动varnish服务:
[root@varnish varnish]# service varnish start
[ OK ] Varnish Cache: [ OK ]
访问测试:
[root@localhost varnish]# curl -I
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2016 10:42:01 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Apr 2016 09:12:52 GMT
ETag: "104301-31-530e6ff9a6ca8"
Content-Length: 49
Content-Type: text/html; charset=UTF-8
X-Varnish: 32777 12
Age: 68
Via: 1.1 varnish-v4 #已经应用了varnish
Accept-Ranges: bytes
Connection: keep-alive
其实也可以用varnishadm命令来完成上述工作,不需要每次更改参数配置文件中的vcl;
5.使用varnishadm命令配置
还将VARNISH_VCL_CONF的值改为default.vcl,然后进行如下操作:
5.1 连接管理
[root@varnish varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082
200
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,2.6.32-573.el6.x86_64,x86_64,-junix,-smalloc,-smalloc,-hcritbit
varnish-4.1.2 revision 0d7404e
Type 'help' for command list.
Type 'quit' to close CLI session.
varnish>
其中:
-S 指定密钥文件;
-T 指定管理接口监听的IP和端口;
5.2 获取帮助信息
使用help获取可用命令("help 命令"可获取具体命令的详细信息):
varnish> help
200
help []
ping []
auth
quit
banner
status
start
stop
vcl.load [auto|cold|warm]
vcl.inline [auto|cold|warm]
vcl.use
vcl.state [auto|cold|warm]
vcl.discard
vcl.list
param.show [-l] [
]
param.set
panic.show
panic.clear [-z]
storage.list
vcl.show [-v]
backend.list [-p] []
backend.set_health
ban [&& ...]
ban.list
5.3 查看所有已加载的VCL配置
varnish> vcl.list
200
active auto/warm 0 boot
其中:
active表示次vcl处于已启用的活动状态;
boot表示是启动时加载的而不是自己定义的VCL;
0表示启动的次数;
auto/warm是4.1新加特性,表示VCL的状态,可用vcl.state修改;
5.4显示指定VCL配置的内容
varnish> vcl.show boot
200
#
# This is an example VCL file for Varnish.
#
# It does not do anything by default, delegating control to the
# builtin VCL. The builtin VCL is called when there is no explicit
# return statement.
#
# See the VCL chapters in the Users Guide at
# and for more examples.
vcl 4.0;
# Default backend definition. Set this to point to your content server.
backend default {
.host = "127.0.0.1";
.port = "8080";
}
.........................
5.5 加载指定VCL配置文件
编译指定的VCL文件,并为其提供一个名称
varnish> vcl.load test1 /etc/varnish/test.vcl
200
VCL compiled.
varnish> vcl.list
200
active auto/warm 0 boot
available auto/warm 0 test1 #available表示此VCL可用;
5.6 使VCL生效
varnish> vcl.use test1
200
VCL 'test1' now active
varnish> vcl.list
200
available auto/warm 0 boot
active auto/warm 0 test1
测试VCL是否生效:
[root@localhost varnish]# curl -I
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2016 12:40:37 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Apr 2016 09:12:52 GMT
ETag: "104301-31-530e6ff9a6ca8"
Content-Length: 49
Content-Type: text/html; charset=UTF-8
X-Varnish: 32770 3
Age: 5
Via: 1.1 varnish-v4 #test.vcl已经生效了
Accept-Ranges: bytes
Connection: keep-alive
6.VCL变量和内置函数
varnish3.0版本到4.0版本有较大变化,4.0到4.1也加了一些新特性:
6.1 版本4.0对比Varnish 3.x的主要改进点
(1)、完全支持流对象;
(2)、可后台获取失效的对象,即Client/backend分离;
(3)、新的vanishlog查询语言,允许对请求进行自动分组;
(4)、复杂的请求时间戳和字节计数;
(5)、安全方面的提升;
6.2 版本4.0涉及VCL语法的改变点
(1)、vcl配置文件需明确指定版本:即在vcl文件的第一行写上 vcl 4.0;
(2)、vcl_fetch函数被vcl_backend_response代替,且req.*不再适用vcl_backend_response;
(3)、后端源服务器组director成为varnish模块,需import directors后再在vcl_init子例程中定义;
(4)、自定义的子例程(即一个sub)不能以vcl_开头,调用使用call sub_name;
(5)、error()函数被synth()替代;
(6)、return(lookup)被return(hash)替代;
(7)、使用beresp.uncacheable创建hit_for_pss对象;
(8)、变量req.backend.healty被std.healthy(req.backend)替代;
(9)、变量req.backend被req.backend_hint替代;
(10)、关键字remove被unset替代;
6.3 版本4.1新特性
因为现在用的是4.1的,其变量和内置函数介绍:
http://blog.chinaunix.net/uid-30212356-id-5706708.html,如果使用的是4.0版本的可以man vcl查看,且各变量的使用位置在其介绍中有说明;
这里再说一下什么是bereq beresp等:
req:The request object,请求到达时可用的变量;
bereq:The backend request object,向后端主机请求时可用的变量;
beresp:The backend response object,从后端主机获取内容时可用的变量;
resp:The HTTP response object,对客户端响应时可用的变量;
obj:存储在内存中时对象属性相关的可用的变量;
7.VCL语法及内置函数
(1)//、#或/* */用于注释;
(2)sub $name 定义函数;
(3)不支持循环,有内置变量;
(4)使用终止语句,没有返回值;
(5)域专用;
(6)操作符:=(赋值)、==(等值比较)、~(模式匹配)、!(取反)、&&(逻辑与)、||(逻辑或);
8.简单示例
8.1返回命中/未命中信息给浏览器
先编辑test.vcl文件:
[root@varnish varnish]# vim test.vcl
vcl 4.0;
backend webserver {
.host="192.168.85.156";
.port="80";
}
sub vcl_deliver {
if (obj.hits > 0) { #如果缓存对象的命中次数大于0
set resp.http.X-Cache = "Hit"; #将响应报文中HTTP首部的X-Cache的值设为Hit
}
else {
set resp.http.X-Cache = "Miss"; #将响应报文中HTTP首部的X-Cache的值设为Miss
}
}
然后重新编译使用该VCL文件配置:
varnish> vcl.load test2 /etc/varnish/test.vcl
200
VCL compiled.
varnish> vcl.use test2
200
VCL 'test2' now active
最后测试:
[root@varnish varnish]# curl -I
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2016 13:21:29 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Apr 2016 09:12:52 GMT
ETag: "104301-31-530e6ff9a6ca8"
Content-Length: 49
Content-Type: text/html; charset=UTF-8
X-Varnish: 32772
Age: 0
Via: 1.1 varnish-v4
X-Cache: Miss #第一次访问未命中
Accept-Ranges: bytes
Connection: keep-alive
[root@varnish varnish]# curl -I
HTTP/1.1 200 OK
Date: Wed, 20 Apr 2016 13:21:29 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 20 Apr 2016 09:12:52 GMT
ETag: "104301-31-530e6ff9a6ca8"
Content-Length: 49
Content-Type: text/html; charset=UTF-8
X-Varnish: 5 32773
Age: 3
Via: 1.1 varnish-v4
X-Cache: Hit #第二次访问命中了
Accept-Ranges: bytes
Connection: keep-alive
8.2限制缓存页面及显示缓存的来源
后端服务器提供另一个测试页面,设置该页面不被缓存:
[root@backend ~]# echo "This is a test page" > /var/www/html/exam.html
先编辑test.vcl文件:
[root@varnish varnish]# cat test.vcl
vcl 4.0;
backend webserver {
.host="192.168.85.156";
.port="80";
}
sub vcl_recv {
if (req.url ~* "exam.html") {
return(pass);
}
else {
return(hash);
}
}
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "Hit from" + server.ip;
}
else {
set resp.http.X-Cache = "Miss";
}
}
再加载该文件:
varnish> vcl.load test3 /etc/varnish/test.vcl
200
VCL compiled.
varnish> vcl.use test3
200
VCL 'test3' now active
最后测试:
[root@varnish varnish]# curl -I /index.html
X-Cache: Miss
[root@varnish varnish]# curl -I /index.html
X-Cache: Hit from192.168.85.129
[root@varnish varnish]# curl -I /exam.html
X-Cache: Miss
[root@varnish varnish]# curl -I /exam.html
X-Cache: Miss
声明:因为看的教程中用的是3.0版本的,自己做的时候用的是最新4.1版本的,所以有些地方难免有出入,具体还要查看官方文档,请谅解!
参考资料:
man varnishadm
man vcl
早期版本:
http://blog.csdn.net/keda8997110/article/details/8777153
http://my.oschina.net/jean/blog/189916
varnish4.0版本:
http://www.cnblogs.com/xiaocen/p/3715266.html
http://sofar.blog.51cto.com/353572/1653683/
4.1版帮助文档:
4.0版帮助文档:
官方varnish-book下载地址:(官方varnish手册)