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

简介:

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
#!/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)

wKioL1PWOnPwtbiAAAJcPaMseOQ005.jpg

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

wKiom1PWOVmC4m2IAAI4pPzslf8299.jpg


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

Pragma    no-cache

Cache-Control    no-cache

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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/



本文转自 wgkgood 51CTO博客,原文链接:http://blog.51cto.com/wgkgood/1531694

目录
打赏
0
0
0
0
344
分享
相关文章
框架源码私享笔记(01)Tomcat核心架构功能 | 配置详解
本文首先分享了《活出意义来》一书序言中的感悟,强调成功如同幸福,不是刻意追求就能得到,而是全心投入时的副产品。接着探讨了Tomcat的核心功能与架构解析,包括网络连接器(Connector)和Servlet容器(Container),并介绍了其处理HTTP请求的工作流程。文章还详细解释了Tomcat的server.xml配置文件,涵盖了从顶级容器Server到子组件Connector、Engine、Host、Context等的配置参数及作用,帮助读者理解Tomcat的内部机制和配置方法。
RocketMQ原理—5.高可用+高并发+高性能架构
本文主要从高可用架构、高并发架构、高性能架构三个方面来介绍RocketMQ的原理。
200 21
RocketMQ原理—5.高可用+高并发+高性能架构
阿里云服务器架构解析:从X86到高性能计算、异构计算等不同架构性能、适用场景及选择参考
当我们准备选购阿里云服务器时,阿里云提供了X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器以及高性能计算等多种架构,每种架构都有其独特的特点和适用场景。本文将详细解析这些架构的区别,探讨它们的主要特点和适用场景,并为用户提供选择云服务器架构的全面指南。
263 18
【上云基础系列 02-01】通过SLB+1台ECS+ESS弹性伸缩,搭建一个精简版的上云标准弹性架构(含方案及教程)
通常,构建一个弹性架构(即使是一个最基础的入门版),至少需要2台ECS。但是,很多小微企业刚开始上云的时候,为了节省成本不愿意购买更多的服务器。通过 “ALB+ESS弹性伸缩+1台ECS+RDS”方案,在保障低成本的同时,也不牺牲业务架构的弹性设计,更避免了很多人因为节省成本选择了单体架构后频繁改造架构的困局。 方案中的几个设计非常值得小微企业借鉴:(1)通过ALB/RDS的按量付费,节省了初期流量不大时的费用;(2)通过ESS弹性伸缩,不需要提前购买服务器资源,但是当业务增长或减少时却保持了资源弹性自动扩缩容。
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
2025年阿里云弹性裸金属服务器架构解析与资源配置方案
🚀 核心特性与技术创新:提供100%物理机性能输出,支持NVIDIA A100/V100 GPU直通,无虚拟化层损耗。网络与存储优化,400万PPS吞吐量,ESSD云盘IOPS达100万,RDMA延迟<5μs。全球部署覆盖华北、华东、华南及海外节点,支持跨地域负载均衡。典型应用场景包括AI训练、科学计算等,支持分布式训练和并行计算框架。弹性裸金属服务器+OSS存储+高速网络综合部署,满足高性能计算需求。
阿里云服务器ECS架构区别及选择参考:X86计算、ARM计算等架构介绍
在我们选购阿里云服务器的时候,云服务器架构有X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、高性能计算可选,有的用户并不清楚他们之间有何区别,本文主要简单介绍下这些架构各自的主要性能及适用场景,以便大家了解不同类型的架构有何不同,主要特点及适用场景有哪些。
462 10
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
阿里云服务器架构有啥区别?X86计算、Arm、GPU异构、裸金属和高性能计算对比
阿里云ECS涵盖x86、ARM、GPU/FPGA/ASIC、弹性裸金属及高性能计算等多种架构。x86架构采用Intel/AMD处理器,适用于广泛企业级应用;ARM架构低功耗,适合容器与微服务;GPU/FPGA/ASIC专为AI、图形处理设计;弹性裸金属提供物理机性能;高性能计算则针对大规模并行计算优化。
274 7
Codota的服务器存储架构
Codota的服务器存储架构
73 5
下一篇
oss创建bucket
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等