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

简介:

Varnish是一款强大的反向代理加速软件,关于其工作原理可以参考上图,其具体流程及VCL语法我这里就不做说明,网上资料多,大家还可以对照参考其官方网站《Varnish中文权威指南》

一、安装CentOS5.8系统环境下的依耐关系

1
2
yum  install  gcc gcc-c++
yum  install  automake autoconflibtool ncurses-devel libxslt groff pcre-devel pkgconfig libtool -y

二、下载varnish-2.1.5源码包,并进行编译安装。

1
2
3
4
5
cd  /usr/local/src
wget  http: //repo .varnish-cache.org /source/varnish-2 .1.5. tar .gz
tar  zxvf varnish-2.1.5. tar .gz
cd  varnish-2.1.5.
. /autogen .sh

#autogen.sh命令是用来检查软件的依耐关系是否满足,如果报错的话, 则应该如下

正常所示:

1
2
3
4
5
+ aclocal
+ libtoolize --copy --force
+ autoheader
+ automake --add-missing --copy --foreign
+ autoconf

继续编译安装:

1
2
./configure --prefix=/usr/local/ var nish --enable-dependency-tracking --enable-debugging-symbols --enable-developer-warnings -enable-extra-warnings
make && make install && cd ../

三、创建varnish用户和组,以及varnish缓存文件和日志存放目录:

1
2
3
4
/usr/sbin/groupadd  varnish
/usr/sbin/useradd  -s  /sbin/nologin   -g varnish varnish
mkdir  -p  /data/varnish/ {cache,log}
chown   -R varnish:varnish  /data/varnish/ {cache,log}

四、我的测试环境是两台Web机器,IP为192.168.1.103(域名为http://www.yuhongchun027.net)的varnish机器对后端IP为192.168.1.104和192.168.1.105的机器进行反向代理加速,其配置文件/usr/local/varnish/etc/varnish/better.vcl如下所示:

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
backend rserver1
{
.host = "192.168.1.104" ;
.port =  "80" ;
.probe = {
.timeout = 5s;           #等待多长时间超时
.interval = 2s;           #检查时间间隔
.window = 10;          #varnish将维持10个sliding windows的结果
.threshold = 8;          #如果是8次.windows检查是成功的,就宣告后端的Web机器
是健康的
}
}
backend rserver2
{
.host = "192.168.1.105" ;
.port =  "80" ;
.probe = {
.timeout = 5s;    
.interval = 2s;   
.window = 10;     
.threshold = 8;
}
}
#指定一个名为realserver组,使用random机制,权重越大,分配的访问越多,可根据
服务器性能来设定;而round-robin(轮询)机制是不能指定weight的
director realserver random {
{
.backend = rserver1;
.weight = 5;
}
{
.backend = rserver2;
.weight = 6;
}
}
#定义能清理缓存的机器,这里只允许本机能用purge的方式清理
acl purge {
"localhost" ;
"127.0.0.1" ;
}
sub vcl_recv
{
   if  (req.http.host ~ "^(.*).yuhongchun027.net" )
   {     
      set  req.backend =realserver; 
   }  
      else
      {     
        error 200  "Nocahce for this domain"
      }           
        if  (req.request == "PURGE" )
          {        
            if  (!client.ip ~purge)
              {           
                 error 405 "Not allowed." ;        
              }
           else
              {
                 return  (pipe);
              }
}
#获取客户端真实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;       
}
#对HTTP协议中的GET、HEAD请求进行缓存,对POST请求透过,让其直接访问后端Web服
务器。之所以这样配置,是因为POST请求一般是发送数据给服务器的,需要服务器接
收、处理,所以不缓存;
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);
}
#对JSP或者PHP文件不缓存
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 www.yuhongchun027.net" ;
  else  {
    set  resp.http.X-Cache=  "MISS FROM www.yuhongchun027.net" ;
  }
return  (deliver);
}

五、启动varnish的命令很长,如下所示:

1
2
3
/usr/local/varnish/sbin/varnishd  -n  /data/varnish/cache  -f  /usr/local/varnish/etc/varnish/better .vcl -a 0.0.0.0:80 -s
file , /data/varnish/varnish_cache .data,8G  -p user=varnish -p group=varnish -p default_ttl=14400 -p thread_pool_max=8000 -p send_timeout=20 -w
5,51200,30 -T 127.0.0.1:3500  -P  /usr/local/varnish/var/varnish .pid

验证其是否生效可以用curl –I命令,如下所示:

1
[root@localhost cache] # curl -I http://www.yuhongchun027.net/

以下结果显示varnish缓存已经起作用了:

1
2
3
4
5
6
7
8
9
10
11
12
HTTP /1 .1 200 OK
Server: Apache /2 .2.3 (CentOS)
Last-Modified: Wed, 28 Aug 2013 16:27:33 GMT
ETag:  "10d242-e-776b6740"
Content-Type: text /html ; charset=UTF-8
Content-Length: 14
Date: Wed, 21 Aug 2013 17:47:48 GMT
X-Varnish: 1584727079 1584726982
Age: 10101
Via: 1.1 varnish
Connection: keep-alive
X-Cache: HIT  FROM www.yuhongchun027.net

六、如果vcl配置文件发生改动,想要不重启而直接reload,可以用如下操作,可以在本机上进行telnet操作,连接3500管理端口:

1
2
3
4
5
6
telnet 127.0.0.1 3500
vcl.load newconfig  /usr/local/varnish/etc/varnish/better .vcl
200 13
VCL compiled.
vcl.use newconfig
200 0

如果显示有200字样,则表示已经正常reload了,newconfig这个名字是自己定义的,熟悉varnish操作的朋友应该也清楚,通过telnet连接本机还可以进行清理缓存。

七、用varnishadm命令来清理缓存,例子如下所示:

清除所有缓存

1
/usr/local/varnish/bin/varnishadm  -T 192.168.1.103:3500 url.purge *$

清除image目录下所有缓存

1
/usr/local/varnish/bin/varnishadm  -T 192.168.1.103:3500 url.purge  /image/

查看最近清除的详细url列表,可执行如下命令:

1
/usr/local/varnish/bin/varnishadm  –T 192.168.1.103:3500 purge.list

另外,缓存命中率的高低直接说明了varnish的运行状态和效果,如果缓存率命中率过低,我们应该对varnish配置进行检查调整来进行提高,查看其命中率命令如下所示:

1
/usr/local/varnish/bin/varnishstat  -n  /data/varnish/cache

、内核优化如下所示:

编辑/etc/sysctl.conf,添加如下选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog =  32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

执行如下命令,让改动配置立即生效:

1
/sbin/sysctl  –p

注意:老生常谈的ulimit的问题,这个话题说得太多了,这里实在不想再提了,记得将在/etc/rc.local添加如下内容:

1
ulimit  –SHn 65535

注意:记得在启动varnish之前将此命令手动执行一遍(最方便的做法是放进经常运行的监控脚本或服务启动脚本),另外,在工作中发现,CentOS6.X x86_64下更改ulimit跟CentOS5.X x86_64是不同的,这点也请大家注意。以上即为varnish-2.1.5在CentOS5.8 x86_64下的安装配置过程,记录下作为工作笔记,方便以后在新机器上部署,年纪大了,起个备忘作用而矣。





本文转自 抚琴煮酒 51CTO博客,原文链接:http://blog.51cto.com/yuhongchun/1293169,如需转载请自行联系原作者

目录
相关文章
|
3天前
|
关系型数据库 Serverless 分布式数据库
高峰无忧,探索PolarDB PG版Serverless的弹性魅力
在数字经济时代,数据库成为企业命脉,面对爆炸式增长的数据,企业面临管理挑战。云原生和Serverless技术革新数据库领域,PolarDB PG Serverless作为阿里云的云原生数据库解决方案,融合Serverless与PostgreSQL,实现自动弹性扩展,按需计费,降低运维成本。它通过计算与存储分离技术,提供高可用性、灾备策略和简化运维。PolarDB PG Serverless智能应变业务峰值,实时监控与调整资源,确保性能稳定。通过免费体验,用户可观察其弹性性能和价格力,感受技术优势。
|
12天前
|
Kubernetes 安全 Devops
【云效流水线 Flow 测评】驾驭云海:五大场景下的云效Flow实战部署评测
云效是一款企业级持续集成和持续交付工具,提供免费、高可用的服务,集成阿里云多种服务,支持蓝绿、分批、金丝雀等发布策略。其亮点包括快速定位问题、节省维护成本、丰富的企业级特性及与团队协作的契合。基础版和高级版分别针对小型企业和大规模团队,提供不同功能和服务。此外,云效对比Jenkins在集成阿里云服务和易用性上有优势。通过实战演示了云效在ECS和K8s上的快速部署流程,以及代码质量检测和AI智能排查功能,展示了其在DevOps流程中的高效和便捷,适合不同规模的企业使用。本文撰写用时5小时,请各位看官帮忙多多支持,如有建议也请一并给出,您的建议能帮助我下一篇更加出色。
136108 16
|
13天前
|
存储 缓存 监控
你的Redis真的变慢了吗?性能优化如何做
本文先讲述了Redis变慢的判别方法,后面讲述了如何提升性能。
102161 2
|
13天前
|
机器学习/深度学习 并行计算 算法
Transformer 一起动手编码学原理
学习Transformer,快来跟着作者动手写一个。
94233 5
|
12天前
|
存储 SQL Apache
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
阿里云数据库内核 Apache Doris 基于 Workload Group 的负载隔离能力解读
|
18天前
|
人工智能 弹性计算 算法
一文解读:阿里云AI基础设施的演进与挑战
对于如何更好地释放云上性能助力AIGC应用创新?“阿里云弹性计算为云上客户提供了ECS GPU DeepGPU增强工具包,帮助用户在云上高效地构建AI训练和AI推理基础设施,从而提高算力利用效率。”李鹏介绍到。目前,阿里云ECS DeepGPU已经帮助众多客户实现性能的大幅提升。其中,LLM微调训练场景下性能最高可提升80%,Stable Difussion推理场景下性能最高可提升60%。
|
13天前
|
存储 弹性计算 Cloud Native
1 名工程师轻松管理 20 个工作流,创业企业用 Serverless 让数据处理流程提效
为应对挑战,语势科技采用云工作流CloudFlow和函数计算FC,实现数据处理流程的高效管理与弹性伸缩,提升整体研发效能。
64688 2
|
20天前
|
消息中间件 安全 API
Apache RocketMQ ACL 2.0 全新升级
RocketMQ ACL 2.0 不管是在模型设计、可扩展性方面,还是安全性和性能方面都进行了全新的升级。旨在能够为用户提供精细化的访问控制,同时,简化权限的配置流程。欢迎大家尝试体验新版本,并应用在生产环境中。
187462 6
|
15天前
|
存储 关系型数据库 数据库
|
23天前
|
物联网 PyTorch 测试技术
手把手教你捏一个自己的Agent
Modelscope AgentFabric是一个基于ModelScope-Agent的交互式智能体应用,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。