linux进阶之Varnish

Varnish

简介:

Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。
处理过程大致分为如下几个步骤:
这里写图片描述
Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求


一、基础环境配置

1.封装虚拟机,配置三台

两台作为后端服务器 server2 :172.25.254.2 server3 : 172.25.254.3
一台作为varnish缓存服务器 server1 : 172.25.254.1
主机为客户端clients : 172.25.254.93
系统环境:rhel6.5

2. 配置varnish服务器(server1)
1)安装varnish
yum install  varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm -y
2)配置

配置一个后端服务器:配置文件/etc/varnish/default.vcl
这里写图片描述
//文件中本身除了此处全部是注释掉的
在文件中 添加设置使可以查看缓存命中情况:

# vim /etc/varnish/default.vcl  
##添加文本
sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT from westos cache";    ##命中
}
else {
set resp.http.X-Cache = "MISS from westos cache";   ##未命中
}
return (deliver);
}

配置 varnish 服务端口 配置文件 : /etc/sysconfig/varnish

 ...  
  7 # Maximum number of open files (for ulimit -n)
  8 NFILES=131072  //代表最大文件打开数
注 :
    1)NFILES = xxx 要修该的话,需要查看操作系统和内核限制,其中内核限制 > 操作系统限制 ,每个限制都相关,所以都需要修改
    2)生产环境中,如果出现系统显示处理文件处理不过来的现象,多半就是这个问题

  9 
 10 # Locked shared memory (for ulimit -l)
 11 # Default log size is 82MB + header
 12 MEMLOCK=82000  //最大锁定内存地址空间
 13 
 14 # Maximum number of threads (for ulimit -u)
 15 NPROCS="unlimited"  //代表最大进程数,无限制线程程实际上是1024,这是默认的上限
主要的更改 : 

66 VARNISH_LISTEN_PORT=80  ##将监听端口修改为80,这是apache的默认端口
95 VARNISH_TTL=120  ##TTL 值是缓存时间,也相当于为服务器提供保护
3)开启varnish

两种开启的方法:
/etc/init.d/varnish start “开启” | reload “重新读取”

service varnish start / reload

3. 配置后端的httpd服务
server2 (172.25.254.2)

编辑apache主页面 /var/www/html/index.html

<h1> server2 - www.sunshine.org </h1>

重启apache服务 : /etc/init.d/httpd restart

server3 (172.25.254.3)

编辑apache主页面 /var/www/html/index.html

<h1> server3 - www.sunshine.org </h1>

另外发布一个页面 /bbs/index.html

<h1> server3 - bbs.sunshine.org </h1>

因为发布两个页面,所以需要开启虚拟主机 在rhel6.5版本中,虚拟主机的配置都综合在主配置文件
/etc/httpd/conf/httpd.conf

...
 990 NameVirtualHost *:80   ##开启虚拟主机,使用的端口为80

1010 <VirtualHost *:80>     ##编辑第一个主页面 www.sunshine.com
1011     DocumentRoot /var/www/html
1012     ServerName www.sunshine.com
1013 </VirtualHost>
1014 <VirtualHost *:80>     ##编辑第二个页面 bbs.westos.org
1015     DocumentRoot /bbs
1016     ServerName bbs.sunshine.com
1017 </VirtualHost>

重启apache服务生效: /etc/init.d/httpd restart

4. 测试

在客户端测试,编辑本地的解析文件 /etc/hosts

172.25.254.1 server1 www.sunshine.com bbs.sunshine.com
命中测试:

这里写图片描述
这里写图片描述
//其中的Age 为TTL值,第一次因为没有缓存所以未命中,第二次就成功命中了,同时也在读取TTL值


二、Varnish的更多功能

通过 varnishadm 手动清除缓存

varnishadm ban.url .*$           //清除所有'

varnishadm ban.url /index.html    //清除 index.html 页面缓存

varnishadm ban.url /admin/$      //清除 admin 目录缓存
1、定义多个不同域名站点的后端服务器
backend web1 {
.host = "172.25.254.2";
.port = "80";
}
backend web2 {
.host = "172.25.254.3";
.port = "80";
}
2. 当访问 www.sunshine.com 域名时从 web1上取数据,访问bbs.sunshine.org 域名时到 web2 取数据,访问其他页面报错
sub vcl_recv {
    if (req.http.host ~ "^(www.)?sunshine.com") {
    set req.http.host = "www.sunshine.com";
    set req.backend = web1;
} elsif (req.http.host ~ "^bbs.sunshine.com") {
    set req.backend = web2;
    } else { error 404 "sunshine cache"; }
}
这个设置之后,curl命令只能通过域名访问

# service varnish reload    重新读取配置生效

//测试如下:
这里写图片描述
这里写图片描述
这里写图片描述

3. 定义负载均衡

把多个后端聚合为一个组,并检测后端健康状况

 director lb round-robin { //round-robin : 轮询机制
{.backend = web1;}
{.backend = web2;}
}

sub vcl_recv {
if (req.http.host ~ "^(www.)?sunshine.com") {
set req.http.host = "www.sunshine.com";
set req.backend = lb;  //实现lb套件
return (pass);  //跳过缓存,此处为了测试方便,开启此项
} elsif (req.http.host ~ "^bbs.sunshine.com") {
set req.backend = web2;
} else {error 404 "sunshine cache";
}


# service varnish reload

这里写图片描述

注 :

这里 return(pass) 和在注配置文件中设置 TTL = 0 效果效果相同,但是意义却不一样。 TTL设置的是dns缓存,如果设置为0 , 那么这个varnish缓存服务器的存在也没有必要了,将 return(pass) 添加的意义是临时为了实验效果,真实环境不会使用。真实环境会将TTL 设置为长时间,然后需要时再单独清空缓存。

三、varnish cdn 推送平台

CDN的全称是Content Delivery Network,即内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络”边缘”(边缘服务器),使用户可以就近取得所需的内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。

1、开启apache服务,设置httpd服务监听端口为8080

#配置文件: vim /etc/httpd/conf/httpd.conf
这里写图片描述
//因为vanish占用的是80端口,所以需要重新改变端口,不然服务也起不来

2、需要安装 php 支持

网上下载安装包
网址:http://code.google.com/p/varnish-php-bansys/

yum install unzip -y

unzip bansys.zip -d /var/www/html/#解压到指定目录

yum install php -y

3、配置服务

vim /var/www/html/bansys/config.php ##只保留如下设置,其余注释掉

<?php
 //varnish主机列表
 //可定义多个主机列表
 $var_group1 = array(
                        'host' => array('172.25.254.1'),
                                                'port' => '80',                  
                    );
 //varnish群组定义
 //对主机列表进行绑定
 $VAR_CLUSTER = array(
                         'www.sunshine.com' => $var_group1,
                     );
 //varnish版本
 //2.x和3.x推送命令不一样
 $VAR_VERSION = "3";
?>
4、bansys 有两种工作模式,分别是:telnet 和 http 模式

telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S $
{VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。

如果是 http 模式需要对 varnish 做以下设置:

# vim /etc/varnish/default.vcl
# 设置acl访问控制
acl sunshine { ##注意sunshine名称不要和之前定义的名称重叠,不然会出错
"127.0.0.1";
"172.25.254.0"/24;
}

sub vcl_recv {  ##这个函数值之前定义过,加在里面就好
if (req.request == "BAN") {
if (!client.ip ~ sunshine) {
error 405 "Not allowed.";
}
ban("req.url ~ " + req.url);
error 200 "ban added";
}
}

# service varnish reload    重新读取varnish配置生效
5、测试

做该测试时,应注释掉varnish配置文件中的return (pass); 项

原始访问页面为 server3:

这里写图片描述

网页访问 网址 : 172.25.254.1:8080/bansys

这里写图片描述

//实现点对点的刷新指定界面
这里写图片描述
//点击确认提交成功
刷新界面:
这里写图片描述
//因为设置了轮询机制,所以是刷新成功了

注:当然也可以手动刷新缓存


tips:

在真实生产环境中,可能设置的缓存时间为一个月甚至更久,这里就需要推送平台了,因为如果用varnish刷新的命令,需要管理员的权限,这显然是非常不安全的,用平台就可以避免这个问题,另外还可以对指定的界面进行刷新,非常的实用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值