首页 > 代码库 > varnish
varnish
varnish 是一款高性能的开源http加速器
主机环境: rhel6 selinux and iptables disabled
实验主机: 172.25.38.1 varnish(主机1)westos1.example.com
172.25.38.2 apache(主机2) westos2.example.com
172.25.38.3 apache(主机3)westos3.example.com
172.25.38.250 物理机(rhel7.0)
1.基本配置
**主机1(不能安装httpd)
vim /etc/hosts
172.25.38.1 westos1.example.com
下载并安装:
varnish-3.0.5-1.el6.x86_64.rpm
varnish-libs-3.0.5-1.el6.x86_64.rpm
yum install varnish-*
启动服务
配置一个后端服务器:
vim /etc/varnish/default.vcl
配置 varnish 服务端口:
vim /etc/sysconfig/varnish
##修改监听端口为80
重新加载服务
查看端口
可以看到varnish的监听端口是80
**主机2(安装阿帕其服务)
yum install httpd -y
vim /etc/hosts
172.24.38.2 westos2.example.com
/etc/init.d/httpd start ##启动服务
vim /var/www/html/index.html ##编写默认发布文件
<h1>server2</h1>
**物理机测试(也可以网页测试)
Age 是时间,两分钟刷新一次
主机2 中阿帕其目录下index.html内容改变,两分钟后刷新为新文件内容,网页内容也改变
2.缓存命中
**主机1
编写配置文件
vim /etc/varnish/default.vcl
**主机2
vim /var/www/html/index.html
<h1>server2-2</h1>
**物理机测试
MISS from westos cache ##未命中
HIT from westos cache ##命中
##通过 varnishadm 手动清除缓存
# varnishadm ban.url .*$ #清除所有
# varnishadm ban.url /index.html #清除 index.html 页面缓存
# varnishadm ban.url /admin/$ #清除 admin 目录缓存
清楚缓存后不用等待两分钟即可curl出主机2中index.html中的内容
3.定义多个后端服务器
**主机1
vim /etc/varnish/default.vcl
##定义多个不同域名站点的后端服务器
#当访问 www.westos.org 或者westos.org域名时从 web1 上取数据,
访问 bbs.westos.org 域名时到 web2 取数据,访问其他页面报错。
**主机2
vim /var/www/html/index.html
<h1>server2</h1>
**主机3
vim /var/www/html/index.html
<h1>server3</h1>
**物理机测试
先做本地解析
vim /etc/hosts
172.25.38.1 westos1.example.com www.westos.org westos.org bbs.westos.org
4.定义负载均衡
**主机1
修改配置文件
vim /etc/varnish/default.vcl
##把多个后端聚合为一个组zhang轮询
return (pass); 为了测试方便不进行缓存,测试的时候缓存命中不到(因为每次返回值不同)
**主机2
vim /var/www/html/index.html
<h1>server2</h1>
**主机3
vim /var/www/html/index.html
<h1>server3</h1>
vim /etc/httpd/conf/httpd.conf ##复制并修改
mkdir /www/ ##建立与配置文件对应的发布目录
vim /www/index.html ##编写发布文件
<h1>bbs.westos.org-server3</h1>
**物理机测试
##如果不清除缓存,解析www.westos.org会在两分钟之后刷新,如果清除,则轮询立即开始,网页每刷新一次轮询一次
5.varnish cdn 推送平台
**主机1
需要安装 php 支持,下载压缩包并解压到阿帕其目录下
unzip bansys.zip -d /var/www/html
vim /var/www/html/config.php #只保留如下设置,其余注释掉,并修改相关内容
#bansys 有两种工作模式,分别是:telnet 和 http 模式。
#telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉
/etc/sysconfig/varnish 文件中的“-S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。
#如果是 http 模式需要对 varnish 做以下设置:
vi /etc/varnish/default.vcl
##不要跟后端组名称重和
在sub vcl_recv { }里面添加
#return (pass);注释掉
/etc/init.d/varnish reload
安装并开启阿帕其服务,修改监听端口为8080
yum install httpd
/etc/init.d/httpd start
vim /etc/httpd/conf/httpd.conf
/etc/init.d/httpd restart
网页测试:
推送成功,网页访问www.westos.com/index.html,轮询立即生效
总体流程:
主进程fork子进程,主程序等待子进程的信号,子程序退出后,主进程重新启动子进程,子进程生成若干线程
Avarnish
accept线程:接收请求,将请求挂在overflow队列上
Work 线程:多个,从队列上摘除请求,对请求进行处理,直到完成,然后处理下一个请求
Epoll 线程:一个请求处理称作一个sesion,在sesion周期内,处理完请求后会交给epoll处理,监听是否还有事件发生
Expire线程:对于缓存的对象,根据过期时间,组织成二叉堆,该线程周期检查该堆的根,处理过期的文件
线程之间的关系:
accept线程,监听端口,接收连接。接受后组织成strutses(session结构),看是否有空闲的工作线程,如果有,将请求给它,pthread_cond_signal信号通知它没有空闲线程,如果overflow上过大,则放弃该请求。否则,将其挂在overflow上(需要更多工作线程发通知)。继续监听
Work线程,从overflow队列上摘取请求(structses),进入状态机处理,处理结束后,通过pipe通信,将structses发送给epoll线程
Epoll线程,得到传过来的structses,若还没有过期,将socket放入epoll的事件中,事件发生时,也会将其放入到overflow中进行
varnish