Loading... <h1 style="font-size: 2.6em;margin: 21px 0px 10.5px;font-family: inherit;color: inherit">Varnish基础进阶</h1> <ul class=" list-paddingleft-2"> <li> <p></p> </li> </ul> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">前言</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-family: 黑体, SimHei;font-size: 16px">互联网早已惠及全人类, 我们可以通过网络与家人、朋友进行实时通信, 也能通过网络随时随地在各大电商站点上购物, 我们访问</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">web</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">站点的速度也越来越快, 这背后都是有很多精巧的架构以及各种先进的技术来支撑的, 我们就今天主要聊聊</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Web</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的缓存技术, 对于当今的互联网来说, </span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Cahe Is King</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">, 缓存真的有那么神奇么? 就由我来带领朋友们先领略一番当今最流行的开源缓存解决方案</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">Varnish</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的风采</span></p> </blockquote> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">为什么需要缓存?</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><span style="font-size: 16px;font-family: 黑体, SimHei">当今的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">Web</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">站点, 特别是电商站点; 时常承受着高并发访问, 我们之前了解了一些负载均衡的解决方案可以将用户的请求调度到后端不同的服务器, 从而解决单台服务器不能承载高并发访问的情况; 但是我们如果将用户请求的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">URL</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">所返回的页以特定存储方式存到特定的前端服务器中, 当用户再次请求相同资源时, 直接通过前端服务器响应给用户, 能够有效地减少后端服务器的的需要响应的次数</span></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><span style="font-size: 16px;font-family: 黑体, SimHei">我们来举个例子:</span></p> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><span style="font-size: 16px;font-family: 黑体, SimHei">不考虑负载均衡的情况下, 我们有一台工作在</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">prefork</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">模型下</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">LAMP</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">服务器, 2000个并发连接中有1600个都是静态页面, 只有400个是动态页面, 服务器需要1分钟响应完所有的请求, 大家都知道</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">prefork</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">模型一般情况下不能同时响应1024以上的连接数, 那么部分用户的请求就需要排队等待; 我们如果不修改</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">Apache</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">的工作模型, 该如何有效地解决这种问题呢?</span></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">这种时候我们就需要缓存了, 我们可以通过</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">Apache</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">带的缓存模块对用户请求的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">URI</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">和响应的页面以特定的形式存储在特定介质上(内存、文件), 当有其他用户再次请求此</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">URI</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">可以直接通过文件中的内容响应给用户, 一般这种情况只适用于静态页面; 我们还可以通过</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">memcached</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">来提供</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">MySQL</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">查询结果的缓存, 这样的情况下, 我们对于动态页面的响应速度也上了一个台阶. 经过测试我们只需要10秒左右就能响应所有的请求</span></p> </blockquote> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">从上面的示例中我们可以看出缓存对</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">web</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">服务器整体性能的提升很大, 但是正常情况下, 我们都会通过特定的缓存服务器来提供缓存, 如</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">, </span><code><span style="font-size: 16px;font-family: 黑体, SimHei">squid</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">等开源的程序</span></p> </blockquote> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">varnish简介</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">是一款非常流行的</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">http加速器</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">, 性能有可能比</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">squid</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">要好; </span><span style="font-size: 16px;font-family: 黑体, SimHei">官方站点: varnish-cache.org</span><br /><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">在请求的接收到响应中间的各个位置都有类似于</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">netfilter钩子函数</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">的东西, 我们称它们为</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">state engine</span></code></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">具体相关知识查看官方文档, 和下面的图片</span></p> </blockquote> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em"><strong>Varnish Architecture</strong></h3> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><img src="//cto.wang/usr/uploads/2016/07/20160703161319-9.gif" alt="Alt text" longdesc="./1460988565185.png" /><img src="//cto.wang/usr/uploads/2016/07/20160703161319-15.png" title="1461029098883765.png" alt="blob.png" /></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px">图片源地址</p> </blockquote> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em"><strong>Varnish(v4) Work Flow</strong></h3> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><img src="//cto.wang/usr/uploads/2016/07/20160703161320-41.png" title="1461029120210906.png" alt="blob.png" /><img src="//cto.wang/usr/uploads/2016/07/20160703161319-9.gif" alt="Alt text" longdesc="./1460988745403.png" /></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px">图片源地址</p> </blockquote> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">varnish的基本使用</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><code><span style="font-family: 黑体, SimHei;font-size: 16px">varnish</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的配置比较其他的服务有所不同, </span><code><span style="font-family: 黑体, SimHei;font-size: 16px">varnish</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">通过</span><code><span style="font-family: 黑体, SimHei;font-size: 16px">VCL(varnish configuration language)</span></code><span style="font-family: 黑体, SimHei;font-size: 16px">的语法来编写其配置文件, 并且编写完配置文件后还要对其进行编译(基于C编译器), 才能够使用</span></p> </blockquote> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em">varnish简单的配置示例</h3> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">多说无益, 我们先给大家做一个实验, 能够明白基本用法了</span></p> </blockquote> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em">实验环境</h3> <table> <thead> <tr class="firstRow"> <th>主机</th> <th>IP</th> <th>功用</th> </tr> </thead> <tbody> <tr> <td style="padding: 0.5em;vertical-align: top">varnish</td> <td style="padding: 0.5em;vertical-align: top">172.16.1.12</td> <td style="padding: 0.5em;vertical-align: top">varnish node</td> </tr> <tr> <td style="padding: 0.5em;vertical-align: top">web1</td> <td style="padding: 0.5em;vertical-align: top">1272.16.1.2</td> <td style="padding: 0.5em;vertical-align: top">httpd server</td> </tr> </tbody> </table> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>本实验所有主机关闭iptables和SElinux</code></p> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em">配置过程和测试</h3> <pre>注意: 本次实验, varnish主机的系统为CentOS7, varnish版本为4.0.3 以下操作在web服务器上执行 [root@web ~]# yum install httpd -y [root@web ~]# vim /etc/httpd/conf/httpd.conf #编辑配置文件 Listen 8080 #修改监听端口为8080 [root@web ~]# echo "<h1>This is Web1</h1>" > /var/www/html/index.html #创建主页文件 [root@web ~]# service httpd start #启动httpd 以下操作在varnish 服务器上执行 [root@varnish ~]# yum install varnish -y #安装varnish [root@varnish ~]# systemctl start varnish #启动varnish [root@varnish ~]# vim /etc/varnish/varnish.params #编辑varnish的参数配置文件 VARNISH_LISTEN_PORT=80 # 修改PORT为80 VARNISH_STORAGE="malloc,256M" #修改缓存的存储方式为内存, 可以不修改 [root@varnish ~]# vim /etc/varnish/default.vcl #编辑varnish的主配置文件, 将default{}按照下面进行修改 backend default { .host = "172.16.1.2"; #修改为后端的主机 .port = "8080"; #要和后端的http主机监听端口相同 } [root@varnish ~]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 #连接到varnish的管理工具 varnish> vcl.load test1 default.vcl #编译配置文件为test1 200 VCL compiled. varnish> vcl.use test1 #使用test1 200 VCL 'test1' now active</pre> <p style="margin-top: 0px;margin-bottom: 1.1em"><strong>测试</strong></p> <pre> 测试访问和缓存效果 [root@node2 html]# curl 172.16.1.12 #通过node2访问varnish IP地址能够获取到web的网页资源 <h1>This is Web1</h1> 这时候我们查看一下web服务的日志, 可以看到是varnish主机GET index.html 172.16.1.12 - - [18/Apr/2016:22:37:04 +0800] "GET / HTTP/1.1" 200 22 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" 我们再次访问web, web的日志并没有更新 [root@node2 html]# curl 172.16.1.12 <h1>This is Web1</h1> 我们查看varnish的部分log如下 - VCL_call HASH - VCL_return lookup - Hit 2147483654 - VCL_call HIT #已经通过缓存响应给客户端 -</pre> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">实现动静分离</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">通过上面的实验相信大家也看出来了, </span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">其实也是一个反向代理服务器, 下面我们使用</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">实现动静分离的效果</span></p> </blockquote> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em">实验环境</h3> <table> <thead> <tr class="firstRow"> <th>主机</th> <th>IP</th> <th>功用</th> </tr> </thead> <tbody> <tr> <td style="padding: 0.5em;vertical-align: top">varnish</td> <td style="padding: 0.5em;vertical-align: top">172.16.1.12</td> <td style="padding: 0.5em;vertical-align: top">varnish主机</td> </tr> <tr> <td style="padding: 0.5em;vertical-align: top">dynamic</td> <td style="padding: 0.5em;vertical-align: top">172.16.1.2</td> <td style="padding: 0.5em;vertical-align: top">动态页面去主机</td> </tr> <tr> <td style="padding: 0.5em;vertical-align: top">static</td> <td style="padding: 0.5em;vertical-align: top">172.16.1.3</td> <td style="padding: 0.5em;vertical-align: top">静态页面主机(图片)</td> </tr> </tbody> </table> <p style="margin-top: 0px;margin-bottom: 1.1em"><code>本实验所有主机关闭iptables和SElinux</code></p> <h3 style="font-family: inherit;color: inherit;font-size: 1.7em;margin: 1.2em 0px 0.6em">配置过程和测试</h3> <p style="margin-top: 0px;margin-bottom: 1.1em"><strong>web服务器配置过程</strong></p> <pre>以下操作在dynamic下进行 [root@dynamic ~]# yum install httpd php -y #安装httpd和php [root@dynamic ~]# vim /etc/httpd/conf/httpd.conf #修改监听端口为8080 Listen 8080 [root@dynamic html]# vim /var/www/html/index.php #创建动态网页文件 <html> <body> <img src="1.gif"/> <h1>This is Index on node1 dynamic</h1> <?php echo "<This is PHP Page"; ?> </body> </html> [root@dynamic html]# service httpd start #启动httpd 以下操作在static下进行 [root@static ~]# yum install httpd -y [root@sttaic ~]# vim /etc/httpd/conf/httpd.conf #修改监听端口为8080 Listen 8080 [root@static ~]# vim /var/www/html/index.html #创建静态网页文件 <h1>This is Index on Node2 static </h1> [root@static html]# ls #我们从本地上传了一张gif图 1.gif index.html [root@static html]# service httpd start #启动httpd</pre> <p style="margin-top: 0px;margin-bottom: 1.1em"><strong>varnish</strong>配置</p> <pre>以下操作在varnish主机上执行 [root@varnish ~]# vim /etc/varnish/default.vcl #编辑配置文件添加以下字段 backend dynamic { .host = "172.16.1.2"; .port = "8080"; } backend static { .host = "172.16.1.3"; .port = "8080"; } 下面的字段在sub vcl_recv中添加 if (req.url ~ "(php|php5)$") { set req.backend_hint = dynamic; } else { set req.backend_hint = static; } if (req.url ~ "(php|php5)$") { return(pass); #如果请求动态页面不查缓存 } } [root@varnish varnish]# varnishadm -S /etc/varnish/secret -T 127.0.0.1:6082 varnish> vcl.load test1 default.vcl varnish> vcl.use test1</pre> <p style="margin-top: 0px;margin-bottom: 1.1em"><strong>测试效果</strong></p> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><strong><code>我们访问index.html</code></strong></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><img src="//cto.wang/usr/uploads/2016/07/20160703161319-9.gif" alt="Alt text" longdesc="./1461025454104.png" /><img src="//cto.wang/usr/uploads/2016/07/20160703161321-47.png" title="1461029135104901.png" alt="blob.png" /></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><strong><code>我们访问index.php</code></strong></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><img src="//cto.wang/usr/uploads/2016/07/20160703161319-9.gif" alt="Alt text" longdesc="./1461025747029.png" /><img src="//cto.wang/usr/uploads/2016/07/20160703161321-29.png" title="1461029131619359.png" alt="blob.png" /></p> </blockquote> <h2 style="font-family: inherit;color: inherit;font-size: 2.15em;margin: 1.2em 0px 0.6em">总结</h2> <blockquote><p style="margin-top: 0px;font-size: 1em;margin-bottom: 1.1em"><span style="font-size: 16px;font-family: 黑体, SimHei">本文主要介绍了</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">的基本使用方法. 其实关于</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">我真的不知道该怎么写, 以后会经常会将</span><code><span style="font-size: 16px;font-family: 黑体, SimHei">varnish</span></code><span style="font-size: 16px;font-family: 黑体, SimHei">结合起来做实验的</span></p> <p style="margin-top: 0px;font-size: 1em;margin-bottom: 0px"><span style="font-size: 16px;font-family: 黑体, SimHei">作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~<br />作者: AnyISaIln QQ: 1449472454<br />感谢: MageEdu</span></p> </blockquote> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信