实验环境:CentOS7

Varnish是高性能开源的反向代理服务器和HTTP缓存服务器。

#varnish服务器:172.16.252.142
[root@varnish localhost]#yum -y install varnish
[root@varnish localhost]#cd /etc/varnish
[root@varnish localhost]#ls
default.vcl  secret  varnish.params
#varnish的配置文件
[root@varnish localhost]#vim varnish.params 
#varnish需要缓存的服务器端口:
VARNISH_LISTEN_PORT=80
#管理varnish配置文件的工具的端口和地址
VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
VARNISH_ADMIN_LISTEN_PORT=6082
#varnish缓存的两种方式:
VARNISH_STORAGE="malloc,256M"
#VARNISH_STORAGE="file,/data/cache/varnish_cache.bin,2G"

 #单服务器的缓存配置:

#
[root@varnish localhost]#vim default.vcl 
vcl 4.0;

# Default backend definition. Set this to point to your content server.
#定义后端主机
backend default {
    .host = "172.16.254.47";
    .port = "80";
}
定义purger的访问控制
acl purgers {
        "127.0.0.1"/8;
#       "127.16.0.0"/16; 
}


sub vcl_recv {
#被允许的purger才允许清除缓存,否则,提示没有权限
       if (req.method == "PURGE")
           {
              if (client.ip ~ purgers)
                   {
                           return(purge);
                }       
    else
                           {
                              return(synth(405,"Purge not allowed" + client.ip));                    
             }                       
 }

#定义/admin等文件不允许缓存
if (req.url ~ "(?i)^/(admin|login)") 
     {
        return(pass);    
     }
#将客户端的ip访问记录在后端服务器
    if (req.restarts == 0)
    {
        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;
        }
        }
    }
#图片等静态资源的缓存
sub vcl_backend_response {
    if (beresp.http.cache-control !~ "s-maxage")
    {
        if (bereq.url ~ "(?i)\.(jpg|jpeg|png|txt|gif|css|js)$")
        {
            unset beresp.http.Set-Cookie;
            set beresp.ttl = 3600s;
        }
    }
}
#执行purge操作
sub vcl_purge {
    return(synth(200,"Purged"));
}
#首部添加信息
sub vcl_deliver {
    if (obj.hits>0) 
    {
        set resp.http.X-Cache = "Hit via" + server.ip;
        } 
    else
     {
        set resp.http.X-Cache = "Miss from" + server.ip;
        }    

#后端服务器:
[root@html localhost]#yum -y install httpd
[root@html localhost]#vim /etc/httpd/conf/httpd.conf 
#将客户端ip计入访问日志
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

[root@html localhost]#pwd
/var/www/html
[root@html localhost]#ls
#在以下每个目录下新建index.html
admin  index.html  login  test

#启动varnish的配置文件:

[root@~ localhost]#cd /etc/varnish/
[root@varnish localhost]#ls
default.vcl  secret  varnish.params
[root@varnish localhost]#varnishadm -S secret -T 127.0.0.1:6082
200        
-----------------------------
Varnish Cache CLI 1.0
-----------------------------
Linux,3.10.0-514.el7.x86_64,x86_64,-smalloc,-smalloc,-hcritbit
varnish-4.0.4 revision 386f712

Type 'help' for command list.
Type 'quit' to close CLI session.
#列出使用的配置文件
vcl.list
200        
available       0 boot
active          0 test1

help
200        
help [<command>]
ping [<timestamp>]
auth <response>
quit
banner
status
start
stop
vcl.load <configname> <filename>
vcl.inline <configname> <quoted_VCLstring>
vcl.use <configname>
vcl.discard <configname>
vcl.list
param.show [-l] [<param>]
param.set <param> <value>
panic.show
panic.clear
storage.list
#重载新的配置,并命名为test3
vcl.load test3 default.vcl
200        
VCL compiled.
#重载成功之后,使用
vcl.use test3
200        
VCL 'test3' now active
vcl.list
200        
available       0 boot
available       0 test1
active          0 test3

#测试:

#用curl测试purge,配置中允许127.0.0.1的主机进行purge操作
[root@varnish localhost]#curl -X PURGE http://127.0.0.1/index.html
<!DOCTYPE html>
<html>
  <head>
    <title>200 Purged</title>
  </head>
  <body>
    <h1>Error 200 Purged</h1>
    <p>Purged</p>
    <h3>Guru Meditation:</h3>
    <p>XID: 75</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>

 

#varnish反代两台服务器时:

[root@varnish localhost]#vim default.vcl
#导入varnish的模块:
import directors;
#定义后端服务器的健康状态检查;
probe healthychk {
#检查的页面地址
    .url = "/index.html";
    .timeout = 5s;
    .window = 8;
    .interval = 2s;
    .threshold = 5;
}
#后端服务器1的命名:default
backend default {
    .host = "172.16.254.47";
    .port = "80";
#引用前面定义的检查策略
    .probe = healthychk;
}

#后端服务器2的命名:imgsrv
backend imgsrv {
    .host = "172.16.253.177";
    .port = "80";
    .probe = healthychk;
}
#启动模块的初始化,添加后端服务器
sub vcl_init {
    new staticsrvs = directors.round_robin();
    staticsrvs.add_backend(default);
    staticsrvs.add_backend(imgsrv);
}
#静态资源的调用设置:
sub vcl_recv {
    if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$") 
    {
        set req.backend_hint = imgsrv;
    } else 
    {
        set req.backend_hint = staticsrvs.backend();
    }

#静态资源撤销cookie设置,以便缓存
sub vcl_backend_response {
    if (beresp.http.cache-control !~ "s-maxage")
    {
        if (bereq.url ~ "(?i)\.(jpg|jpeg|png|txt|gif|css|js)$")
        {
            unset beresp.http.Set-Cookie;
            set beresp.ttl = 3600s;
        }
    }
#撤销服务器的私有ip地址以及版本等信息
sub vcl_deliver {
    unset resp.http.Via;
    unset resp.http.X-Varnish;
    unset resp.http.X-Cache;
}

#启动配置文件:

varnish> vcl.load 3 default.vcl
200        
VCL compiled.
vcl.use 3
200        
VCL '3' now active
vcl.list
200        
available       0 boot
available       0 test1
available       0 test3
available       0 1
available       0 2
active          0 3

backend.list
200        
Backend name                   Refs   Admin      Probe
default(172.16.254.47,,80)     6      probe      Healthy 8/8
imgsrv(172.16.253.177,,80)     3      probe      Healthy 8/8

        

 

#default.vcl文件信息:

#
# This is an example VCL file for Varnish.
#
# It does not do anything by default, delegating control to the
# builtin VCL. The builtin VCL is called when there is no explicit
# return statement.
#
# See the VCL chapters in the Users Guide at https://www.varnish-cache.org/docs/
# and http://varnish-cache.org/trac/wiki/VCLExamples for more examples.

# Marker to tell the VCL compiler that this VCL has been adapted to the
# new 4.0 format.
vcl 4.0;

import directors;

probe healthychk {
    .url = "/index.html";
    .timeout = 5s;
    .window = 8;
    .interval = 2s;
    .threshold = 5;
}

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "172.16.254.47";
    .port = "80";
    .probe = healthychk;
}

backend imgsrv {
    .host = "172.16.253.177";
    .port = "80";
    .probe = healthychk;
}

acl purgers {
    "127.0.0.1"/8;
#    "127.16.0.0"/16; 
}

sub vcl_init {
    new staticsrvs = directors.round_robin();
    staticsrvs.add_backend(default);
    staticsrvs.add_backend(imgsrv);
}

sub vcl_recv {
    if (req.url ~ "(?i)\.(jpg|jpeg|png|gif)$") 
    {
        set req.backend_hint = imgsrv;
    } else 
    {
        set req.backend_hint = staticsrvs.backend();
    }
    
       if (req.method == "PURGE")
           {
              if (client.ip ~ purgers)
                   {
                           return(purge);
                }       
    else
                           {
                              return(synth(405,"Purge not allowed" + client.ip));                    
             }                       
 }

    if (req.url ~ "(?i)^/(admin|login)") 
     {
        return(pass);    
     }

    if (req.restarts == 0)
    {
        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.method == "PURGE")
#    {
#        if (client.ip ~ purgers)
#        {
#            return(purge);
#        else
#            {
#                return(synth(405,"Purge not allowed" + client.ip));         }
#        }            
#    }
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
#}

sub vcl_backend_response {
    if (beresp.http.cache-control !~ "s-maxage")
    {
        if (bereq.url ~ "(?i)\.(jpg|jpeg|png|txt|gif|css|js)$")
        {
            unset beresp.http.Set-Cookie;
            set beresp.ttl = 3600s;
        }
    }
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
    unset beresp.http.Server;
    unset beresp.http.X-Powered-By;
    
}


sub vcl_purge {
    return(synth(200,"Purged"));
}

sub vcl_deliver {
    if (obj.hits>0) 
    {
        set resp.http.X-Cache = "Hit via" + server.ip;
        } 
    else
     {
        set resp.http.X-Cache = "Miss from" + server.ip;
        }    
    unset resp.http.Via;
    unset resp.http.X-Varnish;
    unset resp.http.X-Cache;
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}
View Code

#测试: