Varnish 简介

Varnish 是一款高性能且开源的反向代理服务器和 HTTP 加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高、速度更快、管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来。

挪威的最大的在线报纸 Verdens Gang(vg.no) 使用 3 台 Varnish 代替了原来的 12 台 Squid,性能比以前更好,这是 Varnish 最成功的应用案例。

Varnish 文件缓存的工作流程

Varnish 与一般服务器软件类似,分为 master 进程和 child 进程。Master 进程读入存储配置文件,调用合适的存储类型,然后创建 / 读入相应大小的缓存文件,接着 master 初始化管理该存储空间的结构体,然后 fork 并监控 child 进程。Child 进程在主线程的初始化的过程中,将前面打开的存储文件整个 mmap 到内存中,此时创建并初始化空闲结构体,挂到存储管理结构体,以待分配。Child 进程分配若干线程进行工作,主要包括一些管理线程和很多 worker 线程。

接着,开始真正的工作,varnish 的某个负责接收新 HTTP 连接线程开始等待用户,如果有新的 HTTP 连接过来,它总负责接收,然后唤醒某个等待中的线程,并把具体的处理过程交给它。Worker 线程读入 HTTP 请求的 URI,查找已有的 object,如果命中则直接返回并回复用户。如果没有命中,则需要将所请求的内容,从后端服务器中取过来,存到缓存中,然后再回复。

分配缓存的过程是这样的:它根据所读到 object 的大小,创建相应大小的缓存文件。为了读写方便,程序会把每个 object 的大小变为最接近其大小的内存页面倍数。然后从现有的空闲存储结构体中查找,找到最合适的大小的空闲存储块,分配给它。如果空闲块没有用完,就把多余的内存另外组成一个空闲存储块,挂到管理结构体上。如果缓存已满,就根据 LRU 机制,把最旧的 object 释放掉。

释放缓存的过程是这样的:有一个超时线程,检测缓存中所有 object 的生存期,如果超初设定的 TTL(Time To Live)没有被访问,就删除之,并且释放相应的结构体及存储内存。注意释放时会检查该存储内存块前面或后面的空闲内存块,如果前面或后面的空闲内存和该释放内存是连续的,就将它们合并成更大一块内存。

整个文件缓存的管理,没有考虑文件与内存的关系,实际上是将所有的 object 都考虑是在内存中,如果系统内存不足,系统会自动将其换到 swap 空间,而不需要 varnish 程序去控制。

server11:

rpm -ivh varnish-3.0.5-1.el6.x86_64.rpm varnish-libs-3.0.5-1.el6.x86_64.rpm

vim /etc/sysconfig/varnish VARNISH_LISTEN_PORT=80

vim /etc/varnish/default.vcl

  7 backend default {  8   .host = "172.25.88.13";  9   .port = "80"; 10 } 11  12 backend web { 13   .host = "172.25.88.12"; 14   .port = "80"; 15 } 16  17 sub vcl_recv { 18 if (req.http.host ~ "^(www.)?westos.org") { #如果用户访问:westos.org,会自动补全www 19 set req.http.host = "www.westos.org"; 20 set req.backend = default; 21 } elsif (req.http.host ~ "^bbs.westos.org") { #如果访问:bbs.westos.org,就去访问web 22 set req.backend = web; 23 } else          {error 404 "westos cache";    除了访问这些域名,其他就GG了 24 } 25 }

    #测试缓存命中 27 sub vcl_deliver { 28 if (obj.hits > 0) { 29 set resp.http.X-Cache = "HIT from westos cache"; 命中缓存 30 } 31 else { 32 set resp.http.X-Cache = "MISS from westos cache";  33 } 34 return (deliver); 35 }

/etc/init.d/varnish start

[root@server11 ~]# netstat -antlp |grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1167/varnishd

server12

/etc/init.d/httpd start

cat index.html

server13

通过 varnishadm 手动清除缓存

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

第一次错过(miss)缓存

第一次命中(hit)缓存

varnish虚拟主机和轮寻

server12:

vim /etc/httpd/conf/httpd.conf

990 NameVirtualHost *:801012 <VirtualHost *:80>1013     DocumentRoot /var/www/html1014     ServerName server12.lalala.com1015 </VirtualHost>1016 1017 <VirtualHost *:80>1018     DocumentRoot /www11019     ServerName www.westos.org1020 </VirtualHost>1021 1022 <VirtualHost *:80>1023     DocumentRoot /www21024     ServerName bbs.westos.org1025 </VirtualHost>

server11:

vim /etc/varnish/default.vcl

  7 backend default {  8   .host = "172.25.88.13";  9   .port = "80"; 10 } 11  12 backend web { 13   .host = "172.25.88.12"; 14   .port = "80"; 15 } 16  17 director lb round-robin { 18 {.backend = default;} 19 {.backend = web;} 20 } 21  22 sub vcl_recv { 23 if (req.http.host ~ "^(www.)?westos.org") { 24 set req.http.host = "www.westos.org"; 25 set req.backend = lb; 26 return (pass);    #为了测试方便,不进行缓存。 27 } elsif (req.http.host ~ "^bbs.westos.org") { 28 set req.backend = web; 29 } else {error 404 "westos cache"; 30 } 31 } 32  33 sub vcl_deliver { 34 if (obj.hits > 0) { 35 set resp.http.X-Cache = "HIT from westos cache"; 36 } 37 else { 38 set resp.http.X-Cache = "MISS from westos cache"; 39 } 40 return (deliver); 41 }

CDN推送

当varnish缓存的页面有更新,需要重新的页面的时候,只需要web开发人员,提交更改的网址,这就是我们的CDN推送

[root@server11 html]# unzip bansys.zip [root@server11 html]# cd bansys[root@server11 bansys]# mv * ..
bansys 有两种工作模式,分别是:telnet 和 http 模式。telnet 模式需要关闭 varnish 服务管理端口的验证,注释掉/etc/sysconfig/varnish 文件中的 “ -S ${VARNISH_SECRET_FILE}”这行,重启 varnish 服务即可。如果是 http 模式需要对 varnish 做以下设置:

vim /etc/varnish/default.vcl

  8 acl westos {  9 "127.0.0.1"; 10 "172.25.88.0"/24; 11 } 12  13 sub vcl_recv { 14 if (req.request == "BAN") { 15 if (!client.ip ~ westos) { 16 error 405 "Not allowed."; 17 } 18 ban("req.url ~ " + req.url); 19 error 200 "ban added"; 20 } 21 }

vim config.php #只保留如下设置,其余注释掉

<?php

 //varnish主机列表 $var_group1 = array(                        'host' => array('172.25.88.11'),                                                'port' => '80',                                       );

 //varnish群组定义 //对主机列表进行绑定 $VAR_CLUSTER = array(                         'www.westos.org' => $var_group1,                     );

 //varnish版本 //2.x和3.x推送命令不一样 $VAR_VERSION = "3";

?>

转载于:https://blog.51cto.com/12059878/1915193

varnish---反向代理web加速缓存服务器和CDN的推送相关推荐

  1. 前端ajax数据提交到服务器_详解前端如何让服务器主动向浏览器推送数据

    前言 前面我们已经聊了ajax,它的特点是浏览器必须先发起请求,服务器才能给出对应的响应,想一想能不能让服务器主动向浏览器推送数据呢?那么这篇文章我们来聊一聊服务器推送功能. 轮询 假设你现在需要去做 ...

  2. 微信服务器向公众号推送消息或事件后,开发者5秒内没有返回

    问题 Appid: xxxxx 昵称: xxxxx 时间: xxxxxxx 内容: 微信服务器向公众号推送消息或事件后,开发者5秒内没有返回 次数: 5分钟 80次 错误样例: [OpenID=xxx ...

  3. 微信服务器向公众号推送消息或事件后,微信服务器向公众号推送消息或事件后,得到的回应不合法?...

    呼啦08-04 加粗 标红 插入代码 插入链接 插入图片 上传视频 请 登录 后发表内容 关闭 新增或编辑超链接 链接地址 关闭 插入视频 视频链接 Appid: wxd4170daab0213d6a ...

  4. java服务器推送浏览器_前端如何让服务器主动向浏览器推送数据

    前言 前面我们已经聊了ajax,它的特点是浏览器必须先发起请求,服务器才能给出对应的响应,想一想能不能让服务器主动向浏览器推送数据呢?那么这篇文章我们来聊一聊服务器推送功能. 轮询 假设你现在需要去做 ...

  5. squid反向代理(实现缓存)加速web

    实验:squid反向代理服务器加速web -by zlong 一.实验环境 (1)两台linux主机(Red Hat Enterprise Linux),分别是RHEL1-WEB和RHEL2-SQUI ...

  6. Nginx高性能反向代理web服务器

    基础 Nginx简介 背景介绍 Nginx("engine x")一个具有高性能的[HTTP]和[反向代理]的[WEB服务器],同时也是一个[POP3/SMTP/IMAP代理服务器 ...

  7. nginx 反向代理 proxy_pass DNS 缓存问题

    咱们有个项目用 nginx 配置了反向代理, location / {proxy_pass http://d.example.com:8080; } 其中 d.example.com 是动态解析的域名 ...

  8. 利用varnish做Discuz论坛的缓存服务器

    实验背景:公司有一台BBS服务器,用的是LNMP的架构搭建的.正好手头有一台空闲的虚拟机,于是想着给BBS前端加一台缓存服务器.于是选定了varnish,搜了很多教程,跌跌撞撞的完成了配置.这其中很多 ...

  9. 【nginx反向代理】映射同一服务器上的多个端口

    1. 需求 本地需要通过不同的url访问不同的端口服务,例如 通过http://192.168.10.25访问我的8090端口的网页 通过http://192.168.10.25/server访问我的 ...

最新文章

  1. 一文梳理2019年腾讯广告算法大赛冠军方案
  2. 【知识星球】卷积核和感受野可动态分配的分组卷积
  3. Linux--Linux Shell 中的反引号,单引号,双引号
  4. Netflix混沌工程手册Part 2:混沌工程原则
  5. “工业互联网平台“将成为工业制造企业的标配
  6. centos 6.5 yum安装mysql5.6
  7. SQLException:The server time zone value is unrecognized
  8. Android笔记 fragment的生命周期
  9. Unity3D-RayMarch-几何图元1-添加基本着色模型
  10. mysql三高讲解(三)3.2:如何确定用哪条索引
  11. 分布式数据库中间件的实现原理介绍一:分库分表【转】
  12. Zookeeper基础使用
  13. python深拷贝和浅拷贝的区别_【转】python的复制,深拷贝和浅拷贝的区别
  14. c语言考试程序设计题怎么给分,计算机程序设计C语言考试试卷及评分标准.doc
  15. fiddler证书下载(模拟器)
  16. Geekon移动电源概念版
  17. i7 10700和10700f 10700k这三个CPU有什么区别
  18. settextstyle
  19. tsconfig 配置文件各字段详解
  20. 2019华为软件精英挑战赛

热门文章

  1. 设计模式:模板方法(Template Method Pattern)
  2. 汇编: loop指令
  3. python十七:高阶函数
  4. python十一:集合(set)
  5. 教你打造一个Android组件化开发框架
  6. 1亿元“真金白银”发展大数据产业
  7. 发现藏匿在加密流量中的威胁
  8. C#Redis集合set
  9. 【观点】避免不必要的代码缩进和嵌套
  10. windows扫描域内端口