设为首页 收藏本站
查看: 1619|回复: 0

[经验分享] 高性能HTTP加速器varnish实践

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-13 14:34:07 | 显示全部楼层 |阅读模式
                      一,varnish介绍及特点
   varnish是一款高性能的、轻量的、开源的反向代理服务器和HTTP加速器。Varnish代码量不大,先进的设计理念和成熟的设计框架是它的主要特征。目前在缓存工具的选择上Varnish由于在本身的技术上优势已经超越传统的缓存工具squid,越来越受到青睐。以下是varnish的一些特点介绍:
      1,基于内存缓存,重启后数据消失
      2,利用虚拟内存方式,I/O性能好
      3,支持设置0-60秒的精确缓存时间
      4,配置管理灵活
      5,,具有强大的管理功能

二,varnish的安装
Varnish安装简单,可以使用非root用户进行安装。
1,首先安装 pcre 库,pcre 库是为兼容正则表达式。
     >tar zxvf pcre7.9.tar.gz
     >cd pcre7.9/
     >./configure --prefix=/zhangzya/pcre/
     >Make && make install
2,varnish 安装
     >tar xzvf varnish-3.0.3.tar.gz
     >cd varnish-3.0.3
     >export PKG_CONFIG_PATH=/zhangzya/pcre/lib/pkgconfig
     >./configure --prefix=/zhangzya/varnish      
     >make
     >make install
     到此安装完成

三,varnish配置
1,VCL配置文件常用函数介绍
     vcl,即varnish configuation language,用来定义varnish的存取策略。下面对vcl常用内置函数进行介绍。
     Vcl_recv函数:用于接收和处理请求。
     Vcl_pipe函数:进入pipe模式时被调用,将请求直接传递至后端主机。
     Vcl_pass函数:用户将请求直接传递到后端主机,数据不进行任何缓存。
     Lookup:在缓存中查找请求对象,根据查找结果赋权给vcl_hit  vcl_miss函数。
     Vcl_hit函数:执行lookup后,在缓存中找到请求内容自动调用该函数。
     Vcl_fetch函数:在后端主机更新缓存并获取内容后调用,通过判断获取的内容来决定是将内容放入缓存还是直接返回给客户端。
     Vcl_deliver函数:将在缓存中找到的请求内容发生给客户端前调用。

2,vcl处理流程介绍
849f9d6a-e42c-47da-acaa-007e5c7b434f.png
     Varnish 处理 HTTP 请求的过程大致分为如下几个步骤:
     Receive 状态(vcl_recv):也就是请求处理的入口状态,根据 VCL 规则判断该请求应该 pass(vcl_pass)或是 pipe(vcl_pipe),还是进入 lookup(本地查询)。
     Lookup 状态:进入该状态后,会在 hash 表中查找数据,若找到,则进入 hit(vcl_hit)状态,否则进入 miss(vcl_miss)状态。
    Pass(vcl_pass)状态:在此状态下,会直接进入后端请求,即进入 fetch(vcl_fetch)状态
    Fetch(vcl_fetch)状态:在 fetch 状态下,对请求进行后端获取,发送请求,获得数据,并根据设置进行本地存储。
    Deliver(vcl_deliver)状态。将获取到的数据发给客户端,然后完成本次请求。
3,vcl配置文件详细介绍
      Varnish安装完成后,默认配置文件在/echnweb/varnish/etc/varnish/default.vcl。该文件内容默认全部注释,我们可以已该文件为模板,创建新的的文件varnish.vcl,主要配置介绍:

#指定后端主机的IP及端口
backend default {
     .host = "192.168.232.139";
     .port = "9080";
}
#开始调用vcl_recv函数
sub vcl_recv {
     ... ...
     #移除匹配规则的对应请求的Cookie信息
     if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico|css|js|html)$")
     {
         unset req.http.cookie;
     }  
     #如果请求的类型不是GET或HEAD,则进入pass模式
     if (req.request != "GET" && req.request != "HEAD") {
         return (pass);
    ... ...
    }
sub vcl_fetch {
   #当请求类型是GET并且请求的URL以js、css等结尾时进行缓存,缓存时间7天。
   if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$")
     { set beresp.ttl = 7d; }
}

Varnish对应多台Web主机的应用实例,具有负载分担和健康检测机制。具体配置如下:
backend web1{
.host="192.168.232.11";
.port="80";
}
backend web2{
.host="192.168.232.12";
.port="80";
}
#定义一个名为webserver的director,也就是由web1和web2两台后端服务器随机分担请求。.weight用来指定两台后端服务器的权值,权值高的处理请求的几率就高。
director webserver random{
{.backend=web1;.weight=5;}
{.backend=web2;.weight=8;}
}

四,varnish的启动
1,Varnish启动命令为/zhangzya/varnish/sbin/varnishd,启动时参数较多,执行
/zhangzya/varnish/sbin/varnishd -h 可获得各参数的详细用法。
启动参数
含义
-a address:port
表示Varnish对httpd的监听地址及端口
-b address:port
表示后端服务器地址及端口
-d
表示使用debug调试模式
-f
指定Varnish服务器的配置文件
-p param=value
指定服务器参数,用来优化Varnish性能
-P file
Varnish进程pid文件存放路径
-n dir
指定Varnish的工作目录
-T address:port
设定varnish的telnet管理地址及端口
-w int,int,int
设定varnish的工作线程数,常用的方式有:-w min,max -w min,max,timeout
-s kind[,storageoptions]
指定Varnish缓存内容的存放方式,常用的方式有:-s file,,
其中用于指定缓存文件的存放路径,“”用于指定缓存文件的大小

2,启动后效果如下图,需要注意的是,Varnish运行时会同时启动两个进程,一个主进程,一个是子进程,如果子进程出现问题,主进程将重新生成一个子进程。
44e7ff91-218d-4471-bb1b-e87a0c890a23.png
3,如果Varnish正常 启动,31000端口和31001端口应该处于监听状态。可以通过netstat进行查看。


五,varnish运行日志介绍
       varnish提供了varnishlog和varnishncsa两个工具用于日志处理。前者便于详细的查看varnish 缓存、接收、发送、是否命中等详细的处理过程,便于对varnish进行性能分析和故障查询;后者便于日常的日志分析和数据挖掘。

1,Varnishncsa日志如下图,可以把日志记录到文件中
/zhangzya/varnish/bin/varnishncsa -n /echnweb/varnish1/cache -w varnish.log &
409d3336-a8ce-4fad-bcfb-062faaeaa059.png

2,varnishlog日志如下图
/zhangzya/varnish/bin/varnishlog -n /echnweb/varnish1/cache


六,varnish缓存效果展示
可以通过浏览器访问对应的网页来查看Varnish缓存的效果。下面用命令行方式通过查看网页头来查看缓存命中情况。
第一次访问后查看网页头信息,红框中状态为MISS,表示该访问没有从缓存中读取。
45ef036c-08b4-4540-b668-6ed02c546fea.png

第二次访问相同的URL地址,红框中状态为HIT,表示缓存命中,从缓存中读取内容。
288665c3-7dfb-4262-b205-c3bde3c24955.png


七,varnish缓存刷新
Varnish的一个显著优点是可以灵活管理缓存内容。可迅速有效地控制和清除指定的缓存内容。
1,telnet登录管理端口清楚所有缓存,登陆后执行ban.url /*返回200表示清理成功。
c7338b47-b0a6-473b-a2ea-cac0adadeae1.png
2,通过linux命令方式清除缓存,清理所有域名下download下的缓存
/zhangzya/varnish/bin/varnishadm -T 192.168.232.139:31001 ban.url /download/

3,清理10086.com域名下所有png文件的缓存
/zhangzya/varnish/bin/varnishadm -T 192.168.232.139:31001  ban req.http.host == "10086.com" && req.url  ~ ".png$"

八,优化varnish自身参数
      telnet到Varnish的管理端口,然后执行param.show命令即可看到Varnish运行中的所有参数。当然也可以通过这种方式更改相关参数,下面对4个重点参数进行介绍:
thread_ pools 4[ pools]
thread_ pool_ min 50[ threads]
thread_ pool_ max 5120[ threads]
thread_ pool_ timeout 10[ seconds]

thread_pools:用来设置线程池的数量。一般认为这个值和系统CPU的数目相同最好。设置多一些的pool,Varnish的并发处理能力会更强,但是也会消耗更多的CPU和内存。
thread_pool_min:用来设置每个pool的最小thread数。pool接收到可用的请求后,就会将请求分配给空闲的thread来处理。

thread_pool_max:表示所有pool对应的thread数总和的最大值。此值不能太大,设置为系统峰值的90%左右即可,设置过大会导致进程被挂起。

thread_pool_timeout:表示thread的超时过期时间。当thread数大于thread_pool_min设定值时,如果thread空闲超过thread_pool_timeout设定的时间,thread就会释放。


九,优化linux内核参数
      内核参数是用户和系统内核之间交互的一个接口,通过这个接口用户可以在系统运行的同时动态更新内核配置,可以通过调整Proc文件系统达到优化Linux性能的目的。
      以下参数是官方给出的一个配置:
net.ipv4.ip_local_port_range=1024 65536
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 87380 16777216
net.ipv4.tcp_wmem=4096 65536 16777216
net.ipv4.tcp_fin_timeout=30
net.core.netdev_max_backlog=30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn=262144
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_synack_retries=2
net.ipv4.tcp_syn_retries=2

                  


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-351070-1-1.html 上篇帖子: Haproxy负载均衡详解,与keepalived的搭配 下篇帖子: haproxy详解 加速器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表