阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Varnish 简介以及实用配置

204次阅读
没有评论

共计 4389 个字符,预计需要花费 11 分钟才能阅读完成。

若是有对以下的配置命令有不明晰的,有翻译的 VCL 手册(见 http://www.linuxidc.com/Linux/2014-03/98011.htm),可以进行查阅!

 

1. 什么是 varnish?

1、varnish 首先是一个反向代理服务器,其次才是一个 web 加速缓存服务器。它所缓存的对象是 key/value(即键 / 值)的形式来存储的,通常情况下,键一般是指 URL,而值就是 URL 问的具体的资源(或称为对象)。

 

2、varnish 的配置文件是由专门的 VCL(即 varnish 配置语言)来进行配置的。这种语言首先要先转换为 C 代码,然后在执行。

 

3、varnish 支持 epoll、kqueue 等这种高性能的 I / O 事件通知模型。

 

4、varnish 的日志在它所申请的共享内存日志中。默认为 80M,

 

2. varnish 的原理

1、varnish 启动后包含两个进程,一个是 management 进程和 child 进程。

2、management 进程主要用来管理配置文件以及对子进程的监控和对 varnish 的初始化,而且提供了一个命令行管理接口等。

 

3、child 进程由几个不同类型的线程组成,比较典型的有:

● acceptor 线程:用来接收新连接

● worker 线程:具体工作的线程,一个线程对应一个连接会话。

● expiry 线程:对过期的线程进程清除。

 

3. varnish 支持的缓存存储类型:

● file:使用特定的文件存储所有的缓存数据,然后在通过 mmap() 这个系统调用将整个文件的数据映射到进程空间。不过,重启或停止 varnish 后,缓存的内容会消失,也就是说不能持久存储。

● malloc:使用 malloc() 系统调用在 varnish 启动的时候想内存申请固定大小的内存来缓存数据。

● persistent:还处于测试时期,不建议使用。

注:存储类型使用 - s 参数来指定。

 

 

 

4. 安装与配置

环境:CentOS6.5,iptables 和 selinux 为关闭状态。

软件包:varnish-3.0.5-1.el6.x86_64.rpm

varnish-docs-3.0.5-1.el6.x86_64.rpm

varnish-libs-3.0.5-1.el6.x86_64.rpm

下载地址:

http://repo.varnish-cache.org/RedHat/varnish-3.0/el6/x86_64/varnish/

 

前端:varnish 服务器,两块网卡:

eth0: 172.16.0.11

eth1: 192.168.0.11

后端:两台 apache 服务器,各一块网卡:

web1: 192.168.0.12

web2: 192.168.0.13

网关:192.168.0.11

 

配置文件:

目录:/etc/varnish

文件:default.vcl

secret #用于管理接口所使用的共享密钥文件

脚本:/etc/rc.d/init.d/varnishd

脚本配置文件:/etc/sysconfig/varnish #用于指定配置参数

其中:-a <[hostname]:port> : 指定 varnish 服务监听的地址和端口

-f <filename> : 指定 VCL 文件路径

-p <parameter=value> : 用于调整参数值

-S <secretfile> : 命令行管理接口的认证加密文件

-T <hostname:port> : 指定管理的地址和接口

-s <storagetype,options> : 指定缓存对象的存储类型和位置,以及大小等

 

 

负载均衡支持的算法:

● round-robin : 没有额外的参数

 

● random:包含有两个参数:

1、.weight:表示权重越大,对应的后端服务器接收的请求越多,可以对每个后端服务器进行设置。

2、.retries : 用于定义查找后端健康服务器的次数。是对整个 director 进行设置的。

● hash:它是 random 的一个特殊变体,它使用缓存中的 hash 数据来进行调度,也就是说相同的 URL 的请求将会发往相同的 web 服务器。这种调度方法非常适合后端服务器还是缓存服务器的情况。

 

● client:它也是 random 的一个特殊变体。它使用 client.identity 来进行调度,此变量默认值是客户端的 IP,但是可以在 VCL 中改变其值。使用这种算法,如果所有 请求的 client.identity 的值相同的话,那么统一客户端的请求都会发往同一个后端服务器。

 

● dns:它是根据客户端请求 Host 头部信息,在一个给定的后端服务器列表中进行查找 匹配的。(此算法用的不多)

 

 

特性:先定义后调用,有先后顺序之分,只定义不调用会报错。比如,在定义 director 后必须在后面对其进行调用否则会发生编译错误。

 

 

1、将 varnish 的监听接口改为 80

vim /etc/sysconfig/varnish

VARNISH_LISTEN_PORT=80

 

2、定义后端服务器

backend web1 {

.host = “192.168.0.12”;

.port = “80”;

}

backend web2 {

.host = “192.168.0.13”;

.port = “80”;

}

 

3、定义负载均衡 director(即调度器)

director webs round-robbin {

{.backend = web1;}

{.backend = web2;}

}

 

 

4、调用上面定义的 director

sub vcl_recv {

set req.backend = webs;

return(pass); #测试的时候把默认配置的 return(lookup) 改为 return(pass),否 则,后续的请求就直接去查找缓存了,看不出测试效果。

}

 

5、定义对后端进行健康状态的检测,需要在 backend 区段的上面,并在 backend 区段进行引用

probe healthchk {

.url = “/”;

.interval = 3s;

.timeout = 10ms

.window = 3;

.threshold = 2;

.initial = 3;

.expected_response = 200;

}

backend web1 {

.probe = healthchk;

}

backend web2 {

.probe = hearlthchk;

}

 

6、定义动静分离,假定 web1 提供动态内容,web2 提供静态内存,不过要先把 director 端注释掉

sub vcl_recv {

if (req.url ~ “(?i)\.php$”) {

set req.backend = web1;

} else {

set req.backend = web2;

}

}

sub vcl_fetch {

set beresp.http.From-Backend = beresp.backend.ip; #用于测试是否动静个来自对应的服务器

}

 

7、定义反盗链功能

sub vcl_recv {

if (req.http.referer ~ “http://.*”) {

if (!(req.http.referer ~ “http://.*\.google\.com” ||

req.http.referer ~ “http://.*\.baidu\.com” ||

req.http.referer ~ “http://.*\.myselfsite\.com”))

{

set req.http.host = “www.myselfsite.com”;

set req.url = “/login/login.html”;

}

}

}

 

8、如何知道缓存是否命中,以及命中的次数

sub vcl_deliver {

if (obj.hits > 0) {

set resp.http.X-Varnish-Cache = “HIT”;

set resp.http.X-Cache-Hits = obj.hits;

} else {

set resp.http.X-Varnish-Cache = “MISS”;

}

}

 

9、去掉对静态文件请求时所带的 Cookie 信息,可以提供缓存命中率

sub vcl_recv {

if (req.url ~ “(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$”) {

unset req.http.Cookie;

}

}

sub vcl_fetch {

if (req.url ~ “(?i)\.(html|htm|jpg|gif|ico|jpeg|png|js|css|swf)(\?[a-z0-9]+)?$”) {

unset beres.backend.set-cookie;

}

}

 

10、手动清除过期的缓存

acl purgers {

“127.0.0.1”;

“192.168.0.0”/24;

}

sub vcl_recv {

if (req.request == “PURGE”) {

if (!client.ip ~ purgers) {

error 405 “Method not allowed”;

}

return (lookup);

}

}

sub vcl_hit {

if (req.request == “PURGE”) {

purge;

error 200 “Purged”;

}

}

sub vcl_miss {

if (req.request == “PURGE”) {

purge;

error 404 “Not in cache”;

}

}

sub vcl_pass {

if (req.request == “PURGE”) {

error 502 “PURGE on a passed object”;

}

}

 

Varnish 的详细介绍 :请点这里
Varnish 的下载地址 :请点这里

相关阅读

Varnish Cache 的架构笔记 http://www.linuxidc.com/Linux/2013-10/91016.htm

CentOS 5.8 下 Varnish-2.1.5 的安装配置 http://www.linuxidc.com/Linux/2013-09/89916.htm

RedHat 脚本改用 CentOS 源更新安装 Nginx、PHP 5.3、Varnish http://www.linuxidc.com/Linux/2012-07/65801.htm

利用 Varnish 构建 Cache 服务器笔记 http://www.linuxidc.com/Linux/2012-07/65234.htm

缓存服务 Varnish 安装配置 http://www.linuxidc.com/Linux/2012-07/65228.htm

Varnish 编译安装所需准备 http://www.linuxidc.com/Linux/2012-07/65230.htm

Linux 下 Varnish 缓存的配置优化 http://www.linuxidc.com/Linux/2012-03/56435.htm

Varnish 权威指南(中文)PDF http://www.linuxidc.com/Linux/2013-10/91021.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4389字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中