首页 > 代码库 > 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