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刷新的命令,需要管理员的权限,这显然是非常不安全的,用平台就可以避免这个问题,另外还可以对指定的界面进行刷新,非常的实用
- linux进阶之旅(一)& varnish
- Linux学习之Varnish
- Linux运维进阶-文档总结-Varnish的各项操作
- linux使用进阶(一)
- linux进阶之旅(二)& LVS
- linux varnish
- Android视频进阶之旅(一)_概念介绍
- Varnish 进阶配置与实例
- Linux 进阶笔记(一)
- iOS小白进阶之旅(一)
- Android进阶之Mp3项目(一)
- 工程师进阶之路(一)
- 前端进阶学习之路(一)
- hibernate进阶之路(一)
- Retrofit的进阶之路(一)
- Android进阶之(Service详解一)
- Android进阶之自定义view(一)
- 【Android进阶之自定义View(一)】
- PLSQL Developer常用配置
- java 二进制 权限管理
- mac 下 android studio 的离线gradle极速配置方法
- XML简介(学习笔记)
- dlib 11 dlib自带demo ResNet
- linux进阶之旅(一)& varnish
- python3.5+selenium3.4自动化测试6_selenium的Webdriver-API整理(上)
- hdu_2087_两个kmp板子
- 理解Jquery插件
- mysql cannot connect to database server
- Python 学生信息系统
- Java 静态导入
- opencv学习笔记-7,laplance边缘检测
- likely(x)与unlikely(x)函数