linux进阶之旅(一)& varnish

来源:互联网 发布:含数据库的网页作品 编辑:程序博客网 时间:2024/06/06 16:52

之前我们介绍过squid服务器,这里我们再讲一个更高性能的服务器:varnish

简介

Varnish是一款高性能且开源的反向代理服务器和http加速器。与传统的Squid相比,Varnish具有性能更高、速度更快、管理更方便等诸多优点。Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密。

Varnish 的创造者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多。在1975年时,储存媒介只有两种:内存与硬盘。但现在计算机系统的内存除了主存外,还包括了CPU内的L1、L2,甚至有L3快取。硬盘上也有自己的快取装置,因此Squid Cache自行处理物件替换的架构不可能得知这些情况而做到最佳化,但操作系统可以得知这些情况,所以这部份的工作应该交给操作系统处理,这就是 Varnish cache设计架构。

VCL 处理流程图

处理过程大致分为如下几个步骤:

  • Receive 状态,也就是请求处理的入口状态,根据 VCL 规则判断该请求应该是 Pass 或Pipe,或者进入 Lookup(本地查询)。
  • Lookup 状态,进入此状态后,会在 hash 表中查找数据,若找到,则进入 Hit 状态,否则进入 miss 状态。
  • Pass 状态,在此状态下,会进入后端请求,即进入 fetch 状态。
  • Fetch 状态,在 Fetch 状态下,对请求进行后端的获取,发送请求,获得数据,并进行本地的存储。
  • Deliver 状态, 将获取到的数据发送给客户端,然后完成本次请求。

Varnish与Squid的对比

相同点:

  • 都是一个反向代理服务器
    都是开源软件

Varnish的优点:

  • Varnish的稳定性很高。
  • Varnish访问速度更快,所有缓存数据都直接从内存读取,而squid是从硬盘读取,因而Varnish在访问速度方面会更快。
  • Varnish可以支持更多的并发连接。
  • Varnish可以通过管理端口,使用正则表达式批量的清除部分缓存,而Squid是做不到的。
  • squid属于是单进程使用单核CPU,但Varnish是通过fork形式打开多进程来做处理,所以是合理的使用所有核来处理相应的请求。

Varnish的缺点:

varnish进程一旦挂起、崩溃或者重启,缓存数据都会从内存中完全释放,此时所有请求都会发送到后端服务器,在高并发情况下,会给后端服务器造成很大压力。


varnish 服务配置

一、基础环境配置

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

两台作为后端服务器 server2 : 172.25.77.2 , server3 : 172.25.77.3
一台作为varnish缓存服务器 server1 : 172.25.77.1
主机为客户端clients : 172.25.77.250

注 : 操作系统为 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=65535注 :    1)NFILES = xxx 要修该的话,需要查看操作系统和内核限制,其中内核限制 > 操作系统限制 ,每个限制都相关,所以都需要修改    2)生产环境中,如果出现系统显示处理文件处理不过来的现象,多半就是这个问题 9 10 # Locked shared memory (for ulimit -l)11 # Default log size is 82MB + header12 MEMLOCK=6400013 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.77.2)

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

<title>server2</title><h1> www.westos.org </h1>

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

server3 (172.25.77.3)

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

<title> server3 </title><h1> www.westos.org </h1>

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

<title> sever3 </h1><h1> bbs.westos.org </h1>

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

... 990 NameVirtualHost *:80   ##开启虚拟主机,使用的端口为801010 <VirtualHost *:80>     ##编辑第一个主页面 www.westos.org1011     DocumentRoot /var/www/html1012     ServerName www.westos.org1013 </VirtualHost>1014 <VirtualHost *:80>     ##编辑第二个页面 bbs.westos.org1015     DocumentRoot /bbs1016     ServerName bbs.westos.org1017 </VirtualHost>

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

4,测试

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

命中测试:

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


二、varnish更多功能

通过 varnishadm 手动清除缓存

varnishadm ban.url .*$           //清除所有'varnishadm ban.url /index.html    //清除 index.html 页面缓存varnishadm ban.url /admin/$      //清除 admin 目录缓存

1、定义多个不同域名站点的后端服务器

backend server2 {.host = "172.25.77.2";.port = "80";}backend server3 {.host = "172.25.77.3";.port = "80";}

2、当访问 www.westos.org 域名时从 server2 上取数据,访问 bbs.westos.org 域名时到 web3 取数据,访问其他页面报错。

sub vcl_recv {    if (req.http.host ~ "^(www.)?westos.org") {    set req.http.host = "www.westos.org";    set req.backend = server2;} elsif (req.http.host ~ "^bbs.westos.org") {    set req.backend = server3;    } else { error 404 "westos cache"; }}这个设置之后,在curl命中直接加ip就显示不了了# service varnish reload    重新读取配置生效


//搜索ip无法显示


//active 中为0显示为正确

3、定义负载均衡

  • 定义健康检查:
probe healthcheck {.url = "/index.html"; # 哪个 url 需要 varnish 请求.interval = 5s; #检查的间隔时间.timeout = 1s; #等待多长时间探针超时.window = 5; #维持 5 个 sliding window 的结果.threshold = 3; #至少有三次 window 是成功的,就宣告 bachend 健康}
  • 把多个后端聚合为一个组,并检测后端健康状况:
director westos round-robin {   //round-robin : 轮询机制'    { .backend = server2; }    { .backend = server3; }}sub vcl_recv {if (req.http.host ~ "^(www.)?westos.org") {    set req.http.host = "www.westos.org";    set req.backend = westos;   //实现lb套件    return (pass);      //为了测试方便,不进行缓存。} elsif (req.http.host ~ "^bbs.westos.org") {    set req.backend = server3;    } else {        error 404 "westos cache";        }}# service varnish reload

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


三、varnish cdn 推送平台

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


//因为vanish占用的是80端口,所以需要重新改变端口,不然服务也起不来

2、需要安装 php 支持

yum install unzip -yunzip bansys.zip -d /var/www/html/#解压到指定目录yum install php -y

3、配置服务

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

4、bansys 有两种工作模式,分别是:telnet 和 http 模式

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

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

# vi /etc/varnish/default.vcl#设置acl访问控制acl list {  ##注意list名称不要和之前定义的名称重叠,不然会出错"172.25.77.1";"172.25.77.0"/24;}sub vcl_recv {  ##这个函数值之前定义过,加在里面就好if (req.request == "BAN") {    if (!client.ip ~ list) { error 405 "Not allowed."; }    ban("req.url ~ " + req.url);    error 200 "ban added";}}# service varnish reload    重新读取varnish配置生效

5、测试

原始访问的界面是server3:

网页访问 网址 : 172.25.77.1:8080

//实现点对点的刷新指定界面


//点击确认提交成功

刷新界面:

//因为设置了轮询机制,所以是刷新成功了


tips:

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