Chinaunix首页 | 论坛 | 博客
  • 博客访问: 624140
  • 博文数量: 244
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-27 09:53
个人简介

记录学习,记录成长

文章分类

全部博文(244)

我的朋友

分类: LINUX

2016-04-22 11:33:45

配置环境:
操作系统: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手册)

阅读(3304) | 评论(0) | 转发(0) |
0

上一篇:varnish变量及内置函数详解

下一篇:vcl应用

给主人留下些什么吧!~~