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

Varnish服务器优化缓存配置

varnish缓存的配置优化Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸VerdensGang使用3台Varnish代替了原来的12台Squid,性能比以前更好。但与老牌的squid相比,各有各的优劣势,网上大量的相对比较只是在其个人对自己熟悉的应用的最大使

varnish缓存配置优化

    Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好。

但与老牌的squid相比,各有各的优劣势,网上大量的相对比较只是在其个人对自己熟悉的应用的最大使用上的发挥而已,可能squid到了有能力的人手上才足以发挥最强大的威力

    Varnish采用了“Visual Page Cache”技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存、磁盘中交换文件,性能要比Squid高。

通过Varnish管理端口,可以使用正则表达式快速、批量地清除部分缓存,这一点是Squid不能具备的。

    本人就varnish的一些见解与配置方法做简单的介绍与笔记

实验环境:Red Hat Enterprise Linux Server release 5.4 (Tikanga)

内核2.6.18-164.el5

yum install pcre-devel     ##预先安装一个软件包,不然会提示错误

tar zxvf varnish-2.1.3.tar.gz

cd varnish-2.1.3 

./configure --prefix=/usr/local/varnish-2.1.3

make && make install

编辑配置文件,有模版,但太多注释,最好自己新建一个

vim /usr/local/varnish-2.1.3/etc/varnish/varnish.conf   

############下面附上配置文件的内容及注释#######################

#http请求处理过程

#1,receive请求入口状态,根据vcl判断pass还是lookup本地查询

#lookup,在hash表中查找数据,若找到则进入hit状态,否则进入fetch状态

#pass,选择后台,进入fetch状态

#fetch,对请求进行后端的获取,发送请求,获得数据,并进行本地存储

#deliver,将数据发送给客户端,进入done

#done,处理结束

##########配置后端服务器##############

backend kangta01 {

      .host = "192.168.1.142";

      .port = "7070";

      .probe = {

      .timeout = 5s;         

      .interval = 2s;          

      .window = 10;         

      .threshold = 8;     

      }

   }

backend kangta02 {

      .host = "192.168.1.141";

      .port = "7070";

      .probe = {

      .timeout = 5s;

      .interval = 2s;

      .window = 10;

      .threshold = 8;

      }

   }

##############配置后端服务器组,进行健康检测6秒,使用random方式设置权重######## 

#########另一种方式round-robin则默认轮询机制####################

director kangta15474 random

        { .retries = 6;

            { .backend = kangta02;

              .weight = 2;

             }

            { .backend = kangta01;

               .weight = 2;

            } 

        }

##########定义访问列表,允许下列地址清除varnish缓存#######################

acl local  {

         "localhost";

         "127.0.0.1";

          }

########从url判断针对哪类后面服务器缓存配置############################

sub vcl_recv 

{

       if (req.http.host ~ "^kangta15474.vicp.net")  #匹配域名跳转后台服务器

            { set req.backend = kangta15474; }

         else { error 404 "Unknown HostName!"; }

        if (req.request == "PURGE")    #不允许非访问控制列表内的IP清除varnish缓存 

             { if (!client.ip ~ local)

                 {

                  error 405 "Not Allowed.";  

                  return (lookup);   

                 }

             }

        #清除url中有jpg等文件的COOKIE

        if (req.request == "GET" && req.url ~ "\.(jpg|png|gif|swf|jpeg|ico)$")

            {

              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; }

##varnish实现图片的防盗链

#        if (req.http.referer ~ "http://.*) 

#          {

#             if ( !(req.http.referer ~ "http://.*vicp\.net" ||

#                   req.http.referer ~ "http://.*kangta15474\.net" ) )

#                 {

#                   set req.http.host = "kangta15474.vicp.net";

#                   set req.url = "/referer.jpg"; 

#                 }

#              return(lookup);

#          }

#         else {return(pass);}

       if (req.request != "GET" && 

           req.request != "HEAD" && 

           req.request != "PUT" && 

           req.request != "POST" && 

           req.request != "TRACE" && 

           req.request != "OPTIONS" && 

           req.request != "DELETE") 

        { return (pipe); }

        #对非GET|HEAD请求的直接转发给后端服务器

        if (req.request != "GET" && req.request != "HEAD")

            { return (pass); }

        ##对GET请求,且url里以.php和.php?结尾的,直接转发给后端服务器

        if (req.request == "GET" && req.url ~ "\.(php)($|\?)")

            { return (pass); }

        ##对请求中有验证及COOKIE,直接转发给后端服务器

        if (req.http.Authorization || req.http.COOKIE)

            { return (pass);}

         {

           ##除以上的访问请求,从缓存中查找

           return (lookup);

         }

       ##指定的font目录不进行缓存

       if (req.url ~ "^/fonts/")

           { return (pass); }

}

sub vcl_pipe 

            { return (pipe); }

##进入pass模式,请求被送往后端,后端返回数据给客户端,但不进入缓存处理 

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); 

      }

##在lookup后如果在cache中找到请求的缓存,一般以下面几个关键词结束

sub vcl_hit 

          { 

              if (!obj.cacheable) 

                { return (pass); } 

               return (deliver); 

          } 

##lookup后没有找到缓存时调用,以下面几个关键词结束,及调用fetch参数重新测试是否加入缓存

sub vcl_miss 

     { return (fetch); }

#让varnish服务器缓存的类型,从后端取得数据后调用

sub vcl_fetch 

  {    if (!beresp.cacheable) 

            { return (pass); } 

        if (beresp.http.Set-COOKIE) 

           { return (pass); } 

       ##WEB服务器指明不缓存的内容,varnish服务器缓存

       if (beresp.http.Pragma ~ "no-cache" || beresp.http.Cache-Control ~ "no-cache" || beresp.http.Cache-Control ~ "private") 

          { return (pass); }

       ##对访问中get有包含jpg,png等格式的文件进行缓存缓存时间为7天,s为秒

      if (req.request == "GET" && req.url ~ "\.(js|css|mp3|jpg|png|gif|swf|jpeg|ico)$") 

         { set beresp.ttl = 7d; }

      ##对访问get中包含htm等静态页面,缓存300秒 

      if (req.request == "GET" && req.url ~ "\/[0-9]\.htm$") 

         { set beresp.ttl = 300s; }

           return (deliver); 

   }

####添加在页面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"; } 

  }

#########################以上为 varnish的配置文件##########################

创建用户:

groupadd www

useradd www -g www

创建 varnish_cache的缓存位置

mkdir /data/varnish_cache

启动varnish

ulimit -SHn 8192   ####设置文件描述符,因为我的机子性能并不好,可以按照自己的配置去设置

/usr/local/varnish-2.1.3/sbin/varnishd -u www -g www -f /usr/local/varnish-2.1.3/etc/varnish/varnish.conf -a 0.0.0.0:80 -s file,/data/varnish_cache/varnish_cache.data,100M -w 1024,8192,10 -t 3600 -T 127.0.0.1:3500

####-u 以什么用运行 -g 以什么组运行 -f varnish配置文件 -a 绑定IP和端口 -s varnish缓存文件位置与大小 -w 最小,最大线程和超时时间 -T varnish管理端口,主要用来清除缓存

#结束varnishd进程

pkill varnishd

启动varnishncsa用来将Varnish访问日志写入日志文件:

/usr/local/varnish-2.1.3/bin/varnishncsa -w /data/logs/varnish.log &

每天0点运行,按天切割Varnish日志,生成一个压缩文件,同时删除上个月旧日志的脚本(/var/logs/cutlog.sh):

vim /usr/local/varnish-2.1.3/etc/varnish/cut_varnish_log.sh

写入以下脚本:

#!/bin/sh

# This file run at 00:00

date=$(date -d "yesterday" +"%Y-%m-%d")

pkill -9 varnishncsa

mv /data/logs/varnish.log /data/logs/${date}.log

/usr/local/varnish-2.1.3/bin/varnishncsa  -w /data/logs/varnish.log &

mkdir -p /data/logs/varnish/

gzip -c /data/logs/${date}.log > /data/logs/varnish/${date}.log.gz

rm -f /data/logs/${date}.log

rm -f /data/logs/varnish/$(date -d "-1 month" +"%Y-%m*").log.gz

定时任务:

crontab -e

00 00 * * * /usr/local/varnish-2.1.3/etc/varnish/cut_varnish_log.sh

优化Linux内核参数

vi /etc/sysctl.conf

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 300

net.ipv4.tcp_synCOOKIEs = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 5000    65000

使配置生效

/sbin/sysctl -p

通过Varnish管理端口,使用正则表达式批量清除缓存

清除所有缓存

/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 url.purge *$

清除image目录下所有缓存

/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 url.purge /image/

127.0.0.1:3500 为被清除缓存服务器地址 www.kangta.com 为被清除的域名 /static/image/tt.jsp 为被清除的url地址列表

/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 purge "req.http.host ~ www.kangta.com$ && req.url ~ /static/image/tt.jsp"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

一个清除Squid缓存的PHP函数

function purge($ip, $url)   

{   

    $errstr = '';   

    $errno = '';   

    $fp = fsockopen ($ip, 80, $errno, $errstr, 2);   

    if (!$fp)   

    {   

         return false;   

    }   

    else  

    {   

        $out = "PURGE $url HTTP/1.1\r\n";   

        $out .= "Host:blog.s135.com\r\n";   

        $out .= "Connection: close\r\n\r\n";   

        fputs ($fp, $out);   

        $out = fgets($fp , 4096);   

        fclose ($fp);   

        return true;   

    }   

}   

purge("192.168.0.4", "/index.php");   

?> 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

配置开机自动启动Varnish

vim /etc/rc.d/rc.local

在末行写入以下内容:

ulimit -SHn 8192

/usr/local/varnish-2.1.3/sbin/varnishd -u www -g www -f /usr/local/varnish-2.1.3/etc/varnish/varnish.conf -a 0.0.0.0:80 -s file,/data/varnish_cache/varnish_cache.data,100M -w 1024,8192,10 -t 3600 -T 127.0.0.1:3500

/usr/local/varnish-2.1.3/bin/varnishncsa -w /data/logs/varnish.log &

查看Varnish服务器连接数与命中率:

/usr/local/varnish-2.1.3/bin/varnishstat

以上为varnish的状态,

1675         0.00         0.06 Client requests received   为服务端接收的客户端请求次数

179         0.00         0.01 Cache hits    为命中缓存,从缓存中取得数据返回给客户端的次数,即命中率

11         0.00         0.00 Cache misses  为跳过pass缓存,从后端服务应用中取得数据返回给用户的次数

用help看看可以使用哪些Varnish命令:

/usr/local/varnish-2.1.3/bin/varnishadm -T 127.0.0.1:3500 help


推荐阅读
  • 通过Web界面管理Linux日志的解决方案
    本指南介绍了一种利用rsyslog、MariaDB和LogAnalyzer搭建集中式日志管理平台的方法,使用户可以通过Web界面查看和分析Linux系统的日志记录。此方案不仅适用于服务器环境,还提供了详细的步骤来确保系统的稳定性和安全性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
author-avatar
mobiledu2502930533
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有