高性能缓存服务器Varnish架构配置

Varnish跟Squid都是一款内容加速缓存服务器,我们可以使用它们来对我们的网页内容进行缓存,以此来从某个方面提高用户体验度,提升网站整体的抗压能力。

目前自建的CDN中,有很多都是基于Squid、Varnish等相关缓存软件,经过内部的二次开发实现了更好的内容加速及管理。

那今天我们一起来学习一下Varnish简单的搭建及日常的维护,深入的东西后期分享,跟大家一起来交流。这里直接上Shell脚本自动初始化并安装:

#!/bin/sh
#auto install varnish
#2014-07-28 by wugk
DIR=/usr/src
CODE=$?
VER=$1

if  [ -z $1 ];then
    echo "Usage:{$0 ‘Version‘ install |config |start|help } , Example $0 2.1.5 install}"
    exit
fi

URL=https://repo.varnish-cache.org/source/varnish-${VER}.tar.gz

function install()
{

if  [ ! -d /usr/local/varnish -o ! -f /etc/init.d/varnishd ];then
    cd $DIR ;wget -c $URL
    if  [ $CODE == ‘0‘ ];then
        echo "This varnish Files is Download Successed!"

    else
        echo "This varnish Files is Download Failed!"
    fi

    useradd  -s /sbin/noin varnish
    mkdir -p /data/varnish/{cache,}
    chown -R varnish.varnish /data/varnish/

    tar xzf varnish-${VER}.tar.gz ;cd varnish-${VER} ;/bin/sh autogen.sh  ;./configure --prefix=/usr/local/varnish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings -enable-extra-warnings &&make &&make install 
else

    echo "This Varnish is exists,Please exit..."
    sleep 1
    exit 0
fi
}

function config()
{

    if  [ ! -d /usr/local/varnish/ -o -f /etc/init.d/varnishd ];then
    
        echo "You can‘t config varnish ,Please ensure you varnish dir is or not exist..."
        exit 0
    else
        
        echo "Varnish Already Success Install ,Please Config varnish ......"
    fi
    mv /usr/local/varnish/etc/varnish/default.vcl /usr/local/varnish/etc/varnish/default.vcl.bak
    cat >>/usr/local/varnish/etc/varnish/default.vcl <<EOF

backend server_1
{
.host ="192.168.149.128";
.port = "8080";
.probe = {
.timeout = 5s;
.interval = 2s;
.window = 8;
.threshold = 5;
}
}
backend server_2
{
.host ="192.168.149.129";
.port = "8080";
.probe = {
.timeout = 5s;    
.interval = 2s;   
.window = 8;     
.threshold = 5;
}
}
director rsver random {
{
.backend = server_1;
.weight = 6;
}
{
.backend = server_2;
.weight = 6;
}
}
acl purge {
"localhost";
"127.0.0.1";
}
sub vcl_recv
{
  if (req.http.host ~"^(.*).tdt.com")
  {     
     set req.backend =rsver; 
  }  
     else
     {     
       error 200 "Nocahce for this domain"; 
     }           
       if (req.request =="PURGE")
         {        
           if (!client.ip ~purge)
             {           
                error 405"Not allowed.";        
             }
          else
             {
                return (pipe);
             }
}
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")
{        
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);
}
if(req.url ~"\.jsp" || 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.";
}
if (req.http.user-agent ~"spider")
{   
error 503 "Notpresently in cache";
}
     return (fetch);
}
sub vcl_fetch
{
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 {
 if (obj.hits > 0) {
   set resp.http.X-Cache= "HIT FROM TDTWS Cache Center";
 } else {
   set resp.http.X-Cache= "MISS FROM TDTWS Cache Center";
 }
return (deliver);
}

EOF

if [ $? == 0 ];then
    echo ‘----------------------------------‘
    sleep 2
    echo "This Varinsh Config Success !!!"
else
    echo "This Varinsh Config Failed,Please Check Conf!"
fi

}

function start()
{
if  [ ! -d /usr/local/varnish -o -f /etc/init.d/varnishd ];then
    echo "You can‘t config varnish ,Please ensure you varnish dir is or not exist..."
    exit 0

else
    count=`ps -ef |grep varnishd|grep -v grep |wc -l`
    if [ $count -eq 0 ];then
        echo "Varnish Already Success Install ,Now start varnish...."
        cat <<EOF
        ------------------------------------------------------
        Start Varnish to listen 0.0.0.0:80.
        The Varnish load balancer server1(192.168.149.128 8080).
        The Varnish load balancer server1(192.168.149.129 8080).
        The Varnish Mgr address to listen 0.0.0.0:8001.
        The Varnish Cache DIR /data/varnish/cache .
EOF
        /usr/local/varnish/sbin/varnishd -n /data/varnish/cache -f /usr/local/varnish/etc/varnish/default.vcl -a 0.0.0.0:80 -s file,/data/varnish/varnish_cache.data,16G  -p user=varnish -p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -p send_timeout=20 -w 5,51200,30 -T 0.0.0.0:8001  -P /usr/local/varnish/var/varnish.pid
        if [ $? == 0 ];then
            echo "Start varnish ...OK"
        fi
    else
        echo "Warning,This Varnish Service is exist."
    fi
fi
}

case $2 in

    install)
    install
    ;;
    config)
    config
    ;;

    start )
    start
    ;;

    *    )
    echo "Usage:{ Usage $0 version install |config |start|help }"
    ;;
esac

Varnish简单测试如下图:

1.第一张图,第一次访问没有命中,去后端服务器取数据,同时在本地缓存一份:(MISS)

2.第二张图,第二次访问,缓存服务器存在,则直接从缓存中返回:(HIT)

实际线上环境中,如果用户访问我们的网站,使用Ctrl+F5刷新,我们的缓存就会失效,因为我们配置文件里面是这么配置的,匹配浏览器头信息:

Pragma    no-cache

Cache-Control    no-cache

if (req.http.Cache-Control~ "no-cache")
{
return (pass);
}

只有注释掉这段代码或者设置只允许某个特定的IP,用户通过浏览器按Crtl+F5才不会把缓存给清除。

下面是针对某个特定的IP地址允许刷新:

acl   local {
      "192.168.149.128"
}
sub vcl_hit {
      if (!obj.cacheable) {
         return (pass); 
     }

     if (client.ip ~ local && req.http.Pragma ~ "no-cache") {
         set obj.ttl = 0s;
         return (pass);
     }
      return (deliver);
}

由于时间的原因,文章就暂时写到这里,更多深入的东西继续分享,文章引用煮酒哥的配置,非常感谢。欢迎大家一起讨论。

http://yuhongchun.blog.51cto.com/1604432/1293169

http://zyan.cc/post/313/

高性能缓存服务器Varnish架构配置

时间: 2024-10-12 20:11:01

高性能缓存服务器Varnish架构配置的相关文章

高性能Web服务器Nginx的配置与部署研究(13)应用模块之Memcached模块+Proxy_Cache双层缓存模式

通过<高性能Web服务器Nginx的配置与部署研究——(11)应用模块之Memcached模块的两大应用场景>一文,我们知道Nginx从Memcached读取数据的方式,如果命中,那么效率是相当高的.那么: 1. 如果不命中呢? 我们可以到相应的数据服务器上读取数据,然后将它缓存到Nginx服务器上,然后再将该数据返回给客户端.这样,对于该资源,只有穿透 Memcached的第一次请求是需要到数据服务器读取的,之后在缓存过期时间之内的所有请求,都是读取Nginx本地的.不过Nginx的 pro

缓存服务器varnish概念篇

一.Varnish 简介 Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一,他认为现在的计算机比起1975年已经复杂许多.在1975年时,储存媒介只有两种:内存与硬盘.但现在计算机系统的内存除了主存外,还包括了CPU内的L1.L2,甚至有L3快取.硬盘上也有自己的快取装置,因此Squid Cac

高性能缓存加速器varnish(概念篇)

高性能缓存加速器varnish(概念篇) 一.varnish简介 varnish是一款高性能的开源HTTP加速器,现在很多门户网站已经部署了varnish,并且反应都很好,甚至反应比squid还稳定,且效率更高,资源暂用更少. 作者Poul-Henning Kamp是FreeBSD的内核开发者之一.Varnish采用全新的软件体系架构,和现在的硬件提交配合紧密.在1975年时,储存媒介只有两种:内存与硬盘.但现在计算 机系统的内存除了主存外,还包括了cpu内的L1.L2,甚至有L3快取.硬盘上也

缓存服务器varnish实践篇

一.实验环境 服务器 IP地址 系统版本 varnish服务器 172.16.8.1 Centos6.5 web1服务器 172.16.8.5:81 Centos6.5 web2服务器 172.16.8.5:82 Centos6.5 img1服务器 172.16.8.5:83 Centos6.5 img2服务器 172.16.8.5:84 Centos6.5 php1服务器 172.16.8.5:85 Centos6.5 php2服务器 172.16.8.5:86 Centos6.5 二.安装v

Varnish高性能缓存服务器

一.Varnish概述 一款高性能.开源的HTTP反向代理服务器和缓存服务器,挪威最大的在线报纸 Verdens Gang 使用3台Varnish代替了原来的12台Squid,性能比以前更好. Varnish使用内存做为缓存设备(纯内存缓存服务器方案),相对于Squid(采用硬盘缓存),拥有更快的缓存速度(varnish内存管理完全交给内核,但当缓存内容超过阈值时,内核会自动将一部分缓存存入swap中,让出内存) 1.Varnish进程 Varnish与一般服务器软件类似,分为master(ma

缓存服务器-varnish

Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和 HTTP 加速器(其实就是带缓存的反向代理服务),它可以把整个HTTP响应内容缓存到内存或文件中,从而提高Web服务器的响应速度.其采用全新的软件体系机构,和现在的硬件体系紧密配合,与传统的 squid 相比,varnish 具有性能更高.速度更快.管理更加方便等诸多优点,很多大型的网站都开始尝试使用 varnish 来替换 squid,这些都促进 varnish 迅速发展起来. Varnish内置强大的VCL(Varni

高性能Web服务器Nginx的配置与部署研究(11)应用模块之Memcached模块的两大应用场景

一.应用场景1 最近在一个项目中,用到了Nginx的Memcached模块,所以就在这个系列教程中提前把Memcached模块拿出来写了.另外发现最近我的 博客文章频频被很多用采集器的网站拿走,帮我发扬光大,都不听我说声谢谢.在此还是希望我的博文被转载的时候能够被注明出处,满足下我小小的虚荣心. 现在有这样一种应用场景: 客户端Client通过Nginx反向代理,访问服务器Server.每次访问的内容就是将文件File传到Server上,然后可以访问到File的URL被广播到所有Client上,

Linux平台部署varnish 高性能缓存服务器(1)

[本文档所介绍的内容适用于公司测试/生产常见的varnish环境部署] 一:varnish部署前准备: 1.1相关软件以及系统,web服务 系统要求:Centos 6(以上) (64位) 相关中间件:varnish-4.0.2 1.2相关系统依赖包安装检查准备 1.2.1 检查系统自带nginx是否安装 rpm -qa | grep varnish 如有安装,请使用以下命令卸载相关程序 yum remove varnish -y 1.2.2 安装编译nginx需要的依赖包  yum instal

Linux平台部署varnish 高性能缓存服务器

一:varnish部署前准备: 1.1相关软件以及系统,web服务 系统要求:Centos 6(以上) (64位) 相关中间件:varnish-4.0.2 1.2相关系统依赖包安装检查准备 1.2.1 检查系统自带nginx是否安装 rpm -qa | grep varnish 如有安装,请使用以下命令卸载相关程序 yum remove varnish -y 1.2.2 安装编译nginx需要的依赖包  yum install libtool ncurses-devel pcre-devel i