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

Varnish2.1.2服务器安装与配置详解

目录Varnish2.1.2安装与配置................................................................................................................1Varnish下载...................
目录
Varnish 2.1.2  安装与配置  ................................................................................................................  1
Varnish  下载  ......................................................................................................................... 2
Varnish  安装  ......................................................................................................................... 2
Varnish  配置实例  ................................................................................................................. 2
Varnish  启动与停止,动态加载配置文件  ......................................................................... 6
Varnish  日志启动与日志切割  ............................................................................................. 6
Varnish  缓存清除  ................................................................................................................. 7
Varnish  配置介绍  ................................................................................................................. 8
定义后端服务器 IP 和端口  .............................................................................................. 8
定义访问控制列表,充许那些 IP清除varnish  缓存 ...................................................... 8
判断 host 请求针对那个后端服务器  .............................................................................. 8
不充许非访问控制列表的 IP 进行varnish缓存清除 .................................................... 8
清除 url中有jpg|png|gif等文件的COOKIE .................................................................... 9
取消服务器上 images目录下所有文件的COOKIE .......................................................... 9
WEB服务器指明不缓存的内容,varnish服务器不缓存  ............................................ 10
指定 fonts 目录不缓存  ................................................................................................... 10
指定要缓存的静态文类型  ............................................................................................. 10
使用正则表达式指定缓存的内容 ................................................................................. 10
添加在页面 head 头信息中查看缓存命中情况  ........................................................... 11
根据访问url地址或者目录,转发到不同的后端服务器  ........................................... 11
定义组,负载均衡+后端web服务器健康检查 ............................................................. 11
防止爬虫,网络蜘蛛访问  ............................................................................................. 13
防盗连接  ......................................................................................................................... 13
禁止某个目录或者某个 url地址访问  ........................................................................... 14
Rewrite urls配置............................................................................................................. 14
Vcl  优化  .......................................................................................................................... 15
Varnish  参考资料  ............................................................................................................... 16
环境:Centos 5.4 Varnish 2.1.2
Varnish  下载
下载地址:http://sourceforge.net/projects/varnish/files/
Varnish  安装
Varnish  配置实例
通过前端 varnish 缓存服务器反向代理后端 www.bbs.com 和 www.bbs1.com 网站,要求
对静态文件 js|css|jpg|gif 等文件进行缓存 7 天,对网页中加有 no-cache 头信息页面不缓
存。配置文件如下:
#  vi /opt/varnish/etc/varnish/bbs.vcl
backend bbs {
   .host = "192.168.0.144";
   .port = "80";
}
backend bbs1 {
   .host = "192.168.0.155";
   .port = "80";
}
acl local {
        "localhost";
#  tar zxvf varnish-2.1.2.tar.gz
#  cd varnish-2.1.2
#  ./configure ?prefix=/opt/varnish
#  make  
#  make install         "127.0.0.1";
}
sub vcl_recv {
      if (req.http.host ~ "^(www.)?bbs.com$") {
         set req.backend = bbs;
      }
      elsif (req.http.host ~ "^(www.)?bbs1.com$") {
         set req.backend = bbs1;
      }     
       else {
           error 404 "Unknown HostName!";
      }
      if (req.request == "PURGE") {
         if (!client.ip ~ local) {
error 405 "Not Allowed.";
return (lookup);
}
      }
      if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") {
         unset req.http.COOKIE;
      }
      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;
      }
      if (req.request != "GET" &&
       req.request != "HEAD" &&
       req.request != "PUT" &&
       req.request != "POST" &&
       req.request != "TRACE" &&
       req.request != "OPTIONS" &&
       req.request != "DELETE") {
         return (pipe);
      }
      if (req.request != "GET" && req.request != "HEAD") {
         return (pass);
      }
      if (req.http.Authorization || req.http.COOKIE) {
         return (pass);
      }
      if (req.request == "GET" && req.url ~ "\.(php)($|\?)") {   return (pass);
      }
      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 (!obj.cacheable) {
         return (pass);
     }
     return (deliver);
}
sub vcl_miss {
     return (fetch);
}
sub vcl_fetch {
     if (!beresp.cacheable) {
         return (pass);
     }
     if (beresp.http.Set-COOKIE) {
         return (pass);
     }
     if (beresp.http.Pragma ~ "no-cache" ||
    beresp.http.Cache-Control ~ "no-cache" ||
    beresp.http.Cache-Control ~ "private") {     return (pass);
    }
     if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$")
{
         set beresp.ttl = 7d;
     }
     return (deliver);
}
sub vcl_deliver {
set resp.http.x-hits = obj.hits ;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cqtel-bbs";
} else {
set resp.http.X-Cache = "MISS cqtel-bbs";
}
}
sub vcl_error {
     set obj.http.Content-Type = "text/html; charset=utf-8";
     synthetic {"
/htmlfragment>
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

"} obj.response {"

     Guru Meditation:

XID: "} req.xid {"


http://www.bbs.com/">bbs cache server
"};
     return (deliver);

Varnish  启动与停止,动态加载配置文件
创建www用户
#  useradd www
启动:  
#  /opt/varnish/sbin/varnishd  -u www  -g www  -f /opt/varnish/etc/varnish/bbs.vcl  -a
192.168.0.125:80  -s file,/data/varnish_cache/varnish_cache.data,3G  -w 1024,51200,10  -t
3600 -T 192.168.0.125:3500
参数:
-u      以什么用运行
-g     以什么组运行
-f     varnish配置文件
-a     绑定IP和端口
-s      varnish缓存文件位置与大小
-w    最小,最大线程和超时时间
-T     varnish管理端口,主要用来清除缓存
停止:
#   pkill varnishd      #结束varnishd进程
动态加载配置文件
#   /opt/varnish/bin/varnishadm -T 192.168.0.125:3500
vcl.load vcl-name_vcl "配置文件路径"      # vcl-name  这里可以任意取名
vcl.use vcl-name
vcl.show vcl-name                     #显示vcl-name 配置文件内容
Varnish  日志启动与日志切割
启动日志,方便分析网站访问情况。
#   /opt/varnish/bin/varnishncsa -w /opt/varnish/logs/varnish.log &
 参数:
-w  指定varnish访问日志要写入的目录与文件
为了分析具体每一天的日志,要做varnish日志切割。
#  cat /data/shell/cutvlog.sh
脚本如下:
#!/bin/sh
vlog= /opt/varnish/logs/varnish.log
logs_path=/var/log/varnish-log
date=$(date -d "yesterday" +"%Y-%m-%d")
pkill -9 varnishncsa
mkdir -p /var/log/varnish-log
mkdir -p ${logs_path}/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/  
mv  /opt/varnish/logs/varnish.log ${logs_path}/$(date  -d "yesterday" +"%Y")/$(date  -d
"yesterday" +"%m")/varnish-${date}.log
/opt/varnish/bin/varnishncsa -w /opt/varnish/logs/varnish.log &
使用计划任务,每天晚上凌晨00 点运行日志切割脚本。
#    crontab ?e
0 0 * * * /data/shell/cutvlogg.sh
Varnish  缓存清除
#   /opt/varnish/bin/varnishadm  -T 192.168.0.144:3500 purge "req.http.host ~
www.bbs.com$ && req.url ~ /static/image/tt.jsp"
说明:
192.168.0.144:3500             为被清除缓存服务器地址
www.bbs.com                  为被清除的域名
/static/image/tt.jsp              为被清除的 url地址列表
清除所有缓存
#   /opt/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge *$
       清除image目录下所有缓存
#   /opt/varnish/bin/varnishadm -T 127.0.0.1:3500 url.purge /image/
 Varnish  配置介绍
定义后端服务器IP和端口
backend bbs {                    #定义后端服务器名
   .host = "192.168.0.144";         #定义后端服务器 IP
   .port = "80";                   #定义后端服务器端口
}
定义访问控制列表,充许那些 IP清除varnish  缓存
acl local {
        "localhost";
        "127.0.0.1";
}
判断host请求针对那个后端服务器
sub vcl_recv {
      if (req.http.host ~ "^(www.)?bbs.com$") {
         set req.backend = bbs;
      }
else {
           error 404 "Unknown HostName!";   #如果都不匹配,返回404 错误
        }
     }
不充许非访问控制列表的 IP进行varnish缓存清除
if (req.request == "PURGE") {
         if (!client.ip ~ local) {
error 405 "Not Allowed.";
return (lookup);
}
      } 
清除url中有jpg|png|gif等文件的COOKIE
if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$") {
     unset req.http.COOKIE;
    }
取消服务器上images目录下所有文件的 COOKIE
sub vcl_recv {
if (req.url ~ "^/images") {
unset req.http.COOKIE;
}
}
判断 req.http.X-Forwarded-For  ,如果前端有多重反向代理,这样可以获取客户端 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;
      }
针对请求和url地址判断,是否在varnish缓存里查找
      if (req.request != "GET" && req.request != "HEAD") {
         return (pass);
      }   #   对非GET|HEAD 请求的直接转发给后端服务器
      if (req.request == "GET" && req.url ~ "\.(php)($|\?)") {
  return (pass);
      } #   对GET 请求,且url里以.php和.php?结尾的,直接转发给后端服务器
      return (lookup); #   除了以上的访问以外,都在varnish缓存里查找
}
 WEB服务器指明不缓存的内容,varnish服务器不缓存
     if (beresp.http.Pragma ~ "no-cache" ||
      beresp.http.Cache-Control ~ "no-cache" ||
      beresp.http.Cache-Control ~ "private") {
      return (pass);
      }
指定fonts目录不缓存
     if (req.url ~ "^/fonts/") {
         return (pass);
          }
指定要缓存的静态文类型
让 varnish服务器缓存
if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$") {
         set beresp.ttl = 7d;   #   缓存内容时间  d表示天  s  表示秒
     }
使用正则表达式指定缓存的内容
     if (req.request == "GET" && req.url ~ "\/[0-9]\.htm$") {
        set beresp.ttl = 300s;
     }
 添加在页面head头信息中查看缓存命中情况
sub vcl_deliver {
set resp.http.x-hits = obj.hits ;
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT cqtel-bbs";
} else {
set resp.http.X-Cache = "MISS cqtel-bbs";
}
}
根据访问url地址或者目录,转发到不同的后端服务器
可减少后端 web 服务器压力。如,把 url 地址中有 imgcache 目录的连接,转发到
192.168.0.155服务器。
backend bbs {
   .host = "192.168.0.144";
   .port = "80";
}
backend imgcache {
         .host = "192.168.0.155";
         .port = "80";
}
sub vcl_recv {
      if (req.http.host ~ "^(www.)?bbs.com$" && req.url ~ "^/imgcache/") {
         set req.backend = imgcache;
      }
     elsif (req.http.host ~ "^(www.)?bbs.com") {
         set req.backend = bbs;
         }
    }
定义组,负载均衡+后端 web服务器健康检查
director lb_bbs random {
         .retries = 6;         #    尝试后端6次检测,判断是否健康
{
         .backend = bbs;
         .weight = 2;         #  后端服务器权重                  }
         {
         .backend = bbs1;
         .weight = 2;
         }
}
sub vcl_recv {
     if (req.http.host ~ "^www.test.com") {
         set req.backend = lb_bbs;
         }
     else {
         error 404 "Unknown HostName!";
         }
推荐:  定义组,负载均衡+后端web服务器健康检查
定义单个后端负载均衡+后端web服务器健康检查
backend bbs {
   .host = "192.168.0.144";
   .probe = {
          .url = "/";
          .interval = 5s;
          .timeout = 1 s;
          .window = 5;
          .threshold = 3;
     }
   }
backend imgcache {
    .host = "192.168.0.123";
    .probe = {
          .url = "/";
          .interval = 5s;
          .timeout = 1 s;
          .window = 5;
          .threshold = 3;
    }
  }
director lb_bbs random {
         {
         .backend = bbs;
         .weight = 2;                   }
         {
         .backend = imgcache;
         .weight = 2;
         }
}
sub vcl_recv {
     if (req.http.host ~ "^www.test.com") {
         set req.backend = lb_bbs;
         }
     else {
         error 404 "Unknown HostName!";
         }
url                   \\哪个url需要varnish 请求。
Interval              \\检查的间隔时间
Timeout              \\等待多长时间探针超时
Window              \\varnish将维持5 个 sliding window 的结果
Threshold              \\至少有3次.windows检查是成功的,就宣告 backends健康
注:本方法经测试,前端varnish只匹配后端nginx配置文件里的第一个虚拟主机。配置
上不太灵活,不推荐使用。
防止爬虫,网络蜘蛛访问
可根据user-agent来判断是否访问。
例:禁止baidu、google 网络蜘蛛访问
if (req.http.User-Agent ~ "(Baiduspider|google)") {
 error 405 "Not allowed.";
}
防盗连接
禁止bbs.com和bbs1.com域名连接
if (req.http.Referer ~  "(bbs\.com|bbs1\.com)") {
        error 405 "Not allowed.";             
         }
例:禁止非bbs.com|bbs1.com 域名进行连接,请求从写为
www.aa.com//static/image/logo.png地址。如果请求匹配 bbs.com|bbs1.com 域名,刚按
正常请求处理。 
if (req.http.referer ~ "http://.*") {
         if ( !(req.http.referer ~ "(bbs\.com|bbs1\.com)")) {
set req.http.host = "www.aa.com";
set req.url = "/static/image/logo.png";
}
return (lookup);
         }
         else {
return (pass);
}
禁止某个目录或者某个 url地址访问
例:禁止 www.bbs.com/images      目录访问
www.bbs.com/forum.php   url地址访问
if (req.http.host ~ "^(www.)?bbs.com$" && req.url ~ "^/images") {
         error 403;
    }
if (req.http.host ~ "^(www.)?bbs.com$" && req.url ~ "^/forum.php") {
         error 403;        
  }
Rewrite urls配置
例:将www.bbs.com/abc.html  转向到  www.bbs.com/abc.php
if (req.http.host ~ "^(www.)?bbs.com$" && req.url ~ "^/abc.html") {
         set req.http.host = "www.bbs.com";
         set req.url = "/abc.php";
         }
 Vcl  优化
Grace mode
如果您的服务每秒有数千万的点击率,那么这个队列是庞大的,没有用户喜欢等待服务
器响应。为了使用过期的 cache 给用户提供服务,我们需要增加他们的 TTL,保存所有
cache中的内容在 TTL 过期以后30 分钟不删除,使用以下 VCL:
   sub vcl_fetch {
     set beresp.grace = 30m;
}
Varnish 还不会使用过期的目标给用户提供服务,所以我们需要配置以下代码,在 cache过期
后的 15 秒内,使用旧的内容提供服务:
sub vcl_recv {
     set req.grace = 15s;
}
注:此项功能在测试时没生效
Saint mode
    有时候,服务器很古怪,他们发出随机错误,您需要通知 varnish 使用更加优雅的方式处理
它,这种方式叫神圣模式(saint mode)。Saint mode 允许您抛弃一个后端服务器或者另一
个尝试的后端服务器或者 cache中服务陈旧的内容。让我们看看 VCL 中如何开启这个功能的: 
sub vcl_fetch {
 if (beresp.status == 500) {
     set beresp.saintmode = 10s;
     restart;
 }
 set beresp.grace = 5m;
}
   当我们 beresp.saintmode 10 秒,这个 url 的请求 varnish 将在 10 秒内不访问服务器。一
个黑名单,或多或少。一个 restart 就会执行,如果您有其他的后端有能力提供这些服务器内容,
varnish 会尝试他们。当您没有可用的后端服务器,varnish 将使用它过期的 cache 提供服务
内容。
注:此项功能在测试时没生效

推荐阅读
  • 免费获取:全面更新的Linux集群视频教程及配套资源
    本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • 本文介绍了如何利用Java中的URLConnection类来实现基本的网络爬虫功能,包括向目标网站发送请求、接收HTML响应、解析HTML以提取所需信息,并处理可能存在的递归爬取需求。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • Scrapy:强大的Python爬虫框架
    Scrapy是一个基于Python的高效网页爬取框架,利用Twisted异步网络库实现高效的网络通信。其架构设计精巧,包括核心组件如引擎、调度器、下载器等,旨在简化大规模数据抓取过程。 ... [详细]
  • Spring Cloud因其强大的功能和灵活性,被誉为开发分布式系统的‘一站式’解决方案。它不仅简化了分布式系统中的常见模式实现,还被广泛应用于企业级生产环境中。本书内容详实,覆盖了从微服务基础到Spring Cloud的高级应用,适合各层次的开发者。 ... [详细]
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 探讨GET与POST请求数据传输的最大容量
    在Web开发领域,GET和POST是最常见的两种数据传输方法。本文将深入探讨这两种请求方式在不同环境下的数据传输能力及其限制。 ... [详细]
author-avatar
镜水影快乐
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有