热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Varnish-2.13安装配置方法

2.X版本相对1.X版本的vcl语法有一些小的改动,原来的insert改名成了deliver,2.X版本需要使用return来调用lookup,pass,pipe等功能。2.1.3改动:vcl_fetch中obj.http.Set-Cookie变成beresp.http.Set-Cookie,也就是obj用beresp

2.X版本相对1.X版本的vcl语法有一些小的改动,原来的insert改名成了deliver,2.X版本需要使用return来调用 lookup,pass,pipe等功能。
2.1.3改动: vcl_fetch中 obj.http.Set-COOKIE 变成 beresp.http.Set-COOKIE ,也就是obj用beresp代替

一、Varnish 安装RedHat/CentOS系统环境下的依耐关系
yum install automake autoconflibtool ncurses-devel libxslt groff pcre-devel pkgconfig

可选择更新下pcre
tar jxvf pcre-8.02.tar.bz2
cd pcre-8.02
./configure-enable-ebcdic -enable-pcregrep-libbz2 -enable-pcregrep-libz

可选择:如果你的gcc版本是4.2.0或更高的版本,可以加上-enable-extra-warnings编译参数,在出错时,得到附加的警告信息。(备注:装这个超慢,现在我干脆不装了,出错的附加警告信息是浮云,大家就当看看gcc-4.2.0的简单安装吧)
tar zxvf gcc-4.2.4.tar.gz
cd gcc-4.2.4
mkdir /usr/local/gcc-4.2.4
./configure --prefix=/usr/local/gcc-4.2.4 --enable-threads=posix--disable-checking --host=i386-redhat-linux --with-system-zlib--enable-languages=c,c++
make
make install
设定环境变量,在/etc/profile里加入如下:
PATH=/usr/local/gcc-4.2.4/bin:$PATH
export PATH
LD_LIBRARY_PATH=/usr/local/gcc-4.2.4/lib:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH
注销一下,或source /etc/profile,然后gcc-v看一下版本,如果是gcc-4.2.4就对了。

下载地址(2010-08-05为最新版)
http://nchc.dl.sourceforge.net/project/varnish/varnish/2.1.3/varnish-2.1.3.tar.gztar zxvf varnish-2.1.3.tar.gz

cd varnish-2.1.3.
/autogen.sh  检查软件的依耐关系是否满足(如果你是按我的步骤来的话,这个可无视)
./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings -enable-extra-warnings
make;make install

创建varnish用户和组,以及Varnish缓存文件存放目录(/usr/local/varnish/vcache):
/usr/sbin/groupadd varnish
/usr/sbin/useradd -M -d /dev/null -s /sbin/nologin  -g varnish varnish
mkdir /usr/local/varnish/vcache
chmod +w /usr/local/varnish/vcache
chown -R varnish:varnish /usr/local/varnish/vcache

创建Varnish日志目录(/usr/local/varnish/logs):
mkdir /usr/local/varnish/logschmod +w /usr/local/varnish/logs
chown -R varnish:varnish /usr/local/varnish/logs
chmod 777 /usr/local/varnish/cut_varnish_log.sh
chmod 777 /usr/local/varnish/varnish.sh
chmod 777 /usr/local/varnish/varnishlog.sh  

vi /usr/local/varnish/etc/varnish/default.vcl
backend rserver1
{   
.host ="172.16.8.147";   
.port = "80";   
.probe = {   
.timeout = 5s;           #等待多长时间超时   
.interval = 2s;            #检查的间隔时间   
.window = 10;            #varnish将维持10个slidingwindow的结果   
.threshold = 8;           #至少有8次.windows检查是成功的,就宣告backends健康   
}
}
backend rserver2
{   
.host ="172.16.8.155";   
.port = "80";   
.probe = {   
.timeout = 10s;         
.interval = 5s;         
.window = 10;           
.threshold = 8;   
}
}

#指定一个名为realserver组 使用roun-robin机制
director realserver round-robin {   
{     
.backend = rserver1;
#当使用random机制时,必须指定.weight(再简单点讲,roun-robin不能指定权重)
#.weight = 5;      
}   
{     
.backend = rserver2;
#.weight = 6; (权重越大,分配的访问越多,可根据服务器性能来设定)  
}
}

#Varnish允许localhost、127.0.0.1、后端真实IP等来源IP通过PURGE方法清除缓存;
acl purge {      
"localhost";      
"127.0.0.1";      
"172.16.8.147";      
"172.16.8.155";
}

#vcl_recv在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。
sub vcl_recv
{
#对域名为172.16.8.149的请求使用realserver组处理,非域名的请求则返回“No cahce for this domain”      
  if (req.http.host ~"172.16.8.149")
  {           
     set req.backend =realserver;      
  }        
     else
     {           
       error 200 "Nocahce for this domain";      
     }                 
       if (req.request =="PURGE")
         {              
           if (!client.ip ~purge)
             {                 
                error 405"Not allowed.";              
             }      
          else
             {     
                return (pipe);      
             }     
}
#获取远端IP            
if(req.http.x-forwarded-for)
{               
set req.http.X-Forwarded-For =              
req.http.X-Forwarded-For "," client.ip;      
}
else
{                 
set req.http.X-Forwarded-For =client.ip;            
}
#对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接收、处理,所以不缓存;                    
if (req.request !="GET" && req.request != "HEAD")
{              
return (pipe);      
}      
if (req.http.Expect)
{            
return (pipe);     
}     
if (req.http.Authenticate|| req.http.COOKIE)
{              
return (pass);      
}      
if (req.http.Cache-Control~ "no-cache")
{            
return (pass);      
}
#对ASP或者PHP文件不缓存(这个应该不用解释吧)           
if(req.url ~"\.asp" || req.url ~ "\.php" )
{              
return (pass);      
}      
else
{      
return (lookup);      
}
}sub vcl_pipe
{   
return (pipe);
}sub vcl_pass
{   
return (pass);
}sub vcl_hash
{   
set req.hash += req.url;   
if (req.http.host)
{        
set req.hash +=req.http.host;   
}
else
{      
set req.hash +=server.ip;   
}  
  return (hash);
}sub vcl_hit
{   
if (req.request =="PURGE")
{      
set obj.ttl = 0s;            
error 200"Purged.";   
}   
if (!obj.cacheable)
{        
return (pass);   
}   
return (deliver);
}sub vcl_miss
{      
if (req.request =="PURGE")
{        
error 404 "Not incache.";      
}
#阻止spider网络蜘蛛            
if (req.http.user-agent ~"spider")     
{         
error 503 "Notpresently in cache";      
}
     return (fetch);
}
# vcl_fetch在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。
sub vcl_fetch
{
#Varnish对以.txt和.js结尾的URL缓存时间设置1小时,对其他的URL缓存时间设置为30天。      
if (req.request =="GET" && req.url ~ "\.(txt|js)$")
{        
set beresp.ttl = 3600s;      
}      
else
{        
set beresp.ttl = 30d;     
}     
if (!beresp.cacheable)
{        
return (pass);     
}      
if (beresp.http.Set-COOKIE)
{      
return (pass);     
}      
return (deliver);
}

sub vcl_deliver
{  
return (deliver);
}

sub vcl_error
{   
set obj.http.Content-Type ="text/html; charset=utf-8";   
synthetic {"                    Error "}obj.status " " obj.response {"     

"}obj.response {"

     

GuruMeditation:

     

XID: "}req.xid {"

     
     

Varnish cacheserver

    "
};   
return (deliver);
}

启动的方法:
/usr/local/varnish/sbin/varnishd -n/usr/local/varnish/vcache -f /usr/local/varnish/etc/varnish/default.vcl -a0.0.0.0:80 -s file,/usr/local/varnish/vcache/varnish_cache.data,1G -p user=varnish-p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -psend_timeout=20 -w 5,51200,30 -T 127.0.0.1:808 -P/usr/local/varnish/var/varnish.pid
参数说明:
-f /usr/local/varnish/etc/varnish/default.vcl   选项指定varnishd使用哪个配置文件(这个可以自己任意指定比较灵活)
-s file,/usr/local/varnish/vcache/varnish_cache.data,1G 这个 ?s 选项用来确定varnish使用的存储类型和存储容量,1G 定义多少内存。
-T 127.0.0.1:808    Varnish有一个基于文本的管理接口,启动它的话可以在不停止varnish的情况下来管理varnish。您可以指定管理软件监听哪个接口。启动后可以通过在本机telnet 127.0.0.1 808连接varnish的管理端口,查看运行状态等 help查看命令
-a 0.0.0.0:80   制定varnish监听所有IP发给80端口的http请求(也可指定特定IP)
-w 5,512000,30  控制每个进程的线程数的,格式:-w min,max,timeout [default: -w2,500,300],关于这个不能像1.XX版本那样设得很大,否则varnish会很慢。

#日志记录 varnishlog.sh
chmod777 /usr/local/varnish/varnishlog.sh
/usr/local/varnish/bin/varnishncsa-n  /usr/local/varnish/vcache -w /usr/local/varnish/logs/varnish.log
一个每天0点运行,按天切割Varnish日志,生成一个压缩文件,设置在每天00:00定时执行:
/usr/bin/crontab -e或者vi /var/spool/cron/root
chmod 777  /usr/local/varnish/cut_varnish_log.sh
00 00 * * */bin/bash  /usr/local/varnish/cut_varnish_log.sh
#!/bin/sh
# This file run at 00:00
date=$(date -d "yesterday" +"%Y-%m-%d")
pkill -9 varnishncsa
mv /usr/local/varnish/logs/varnish.log /usr/local/varnish/logs/${date}.log
/usr/bin/nohup /usr/local/varnish/varnishlog.sh >/dev/null 2>&1 &cd/usr/local/varnish/logs
tar zcvf ${date}.tar.gz ${date}.log
rm -f  ${date}.log
#停止脚本
killall -9 varnishd
killall -9 varnishncsa

通过Varnish管理端口,使用正则表达式批量清除缓存:
  (1)、例:清除类似http://blog.s135.com/a/zhangyan.html的URL地址):/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 url.purge /a/
  (2)、例:清除所有缓存:/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 url.purge *$  

通过Varnish管理端口进行管理,用help看看可以使用哪些Varnish命令:
/usr/local/varnish/bin/varnishadm-T 127.0.0.1:808 help

查看Varnish服务器连接数与命中率:
/usr/local/varnish/bin/varnishstat-n /usr/local/varnish/vcache

附:varnish.sh(用于start、stop、restart 的脚本,注意给予权限,例如启动  ./varnish.sh start)
#!/bin/shfunction_start_varnish()
{   
printf "Starting Varnish...\n"
/usr/local/varnish/sbin/varnishd -n/usr/local/varnish/vcache -f /usr/local/varnish/etc/varnish/default.vcl -a0.0.0.0:80 -s file,/usr/local/varnish/vcache/varnish_cache.data,1G -puser=varnish -p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -psend_timeout=20 -w 5,51200,30 -T 127.0.0.1:808 -P/usr/local/varnish/var/varnish.pid
}function_stop_varnish()
{   
printf "Stoping Varnish...\n"  
killall -9 varnishd    killall -9 varnishncsa
}function_restart_varnish()
{  
function_stop_varnish   
function_start_varnish
}
if ["$1" = "start" ]; then   
function_start_varnish
elif ["$1" = "stop" ]; then  
function_stop_varnish
elif ["$1" = "restart" ]; then   
function_restart_varnish
else    printf "Usage:/usr/local/varnish/varnish.sh {start|stop|restart}\n"
fi

最后:varnish的确在稳定性方面比squid要强,但硬要说性能超出多少倍,那是广告用语。并且最关键的是,在规则制定以及资料文档方面,varnish远不如squid,要命的是,这小软件对语法改动太频繁

 

 

新手请看一下:

关于vcl_recv
在请求的开始被调用,在接收、解析后,决定是否响应请求,怎么响应,使用哪个后台服务器。在vcl_recv中,您可以修改请求,比如您可以修改COOKIEs,添加或者删除请求的头信息。注意vcl_recv中只有请求的目标,req is available。

关于vcl_fetch
在一个文件成功从后台获取后被调用,他的任务就是改变响应的头文件,触发ESI进程,在后台服务器轮询尝试失败的请求。在vcl_fetch中一样的包含请求的目标,req,available,哪里通常是backendresponse,beresp.beresp将会包含后端服务器的HTTP的头信息

动作:(一定要搞明白的)
pass           当一个请求被pass后,这个请求将通过varnish转发到后端服务器,但是它不会被缓存。pass可以放在vcl_recv 和 vcl_fetch中。
lookup        当一个请求在vcl_recv中被lookup后,varnish将从缓存中提取数据,如果缓存中没有数据,将被设置为pass,不能在vcl_fetch中设置lookup。
pipe            pipe和pass相似,都要访问后端服务器,不过当进入pipe模式后,在此连接未关闭前,后续的所有请求都发到后端服务器
deliver        请求的目标被缓存,然后发送给客户端esi              
ESI-processthe fetched document 在VCL中,有3个重要的数据结构request 从客户端进来responses 从后端服务器过来object 存储在cache中              

在VCL中,你需要知道以下结构
req        请求目标,当varnish接收到一个请求,这时req object就被创建了,你在vcl_recv中的大部分工作,都是在req object上展开的。
beresp   后端服务器返回的目标,它包含返回的头信息,你在vcl_fetch中的大部分工作都是在beresp object上开展的。
obj        被cache的目标,只读的目标被保存于内存中,obj.ttl的值可修改,其他的只能读。      

OperaorsVCL支持一下运算符,请阅读下面的例子:              
=                   \\赋值运算符            
==                 \\对比              
~                   \\匹配,在ACL中和正则表达式中都可以用              
!                  \\否定            
&&                 \\逻辑与            
||                   \\逻辑或

 


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Ubuntu 9.04中安装谷歌Chromium浏览器及使用体验[图文]
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
才客caike
才客,优质人才的私人职业顾问。一人一岗,专业专注!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有