Varnish搭建缓存代理提高网站访问速度

简介:

Varnish是一款高性能、开源的反向代理服务器和缓存服务器,官方说是squid的四倍,实际应用测试中虽然达不到四倍的性能,那也能达到1-2倍的效果。

Varnish和Squid的对比:

Squid 也是一种开源的代理缓存软件,下面对比 Varnish 和 Squid 的不同点。

Varnish的稳定性很好。两者在完成相同负载的工作时,Squid服务器发生故障的几率要高于Varnish,因此Squid需要经常重启。Varnish访问速度更快。Varnish采用了 Visual Page Cache技术,所有缓存的数据都直接从内存读取,而Squid从硬盘读取缓存的数据,所以Varnish在访问速度方面会更快一些。Varnish可以支持更多的并发连接。因为Varnish的TCP连接与释放比Squid快,所以在高并发连接情况下可以支持更多的TCP连接。Varnish可以通过管理端口来管理缓存,使用正则表达式就可以批量清除部分缓存,而Squid做不到这一点。

Varnish缺点:

Varnish在高并发状态下,CPU、I/O和内存等资源的开销高于Squid。Varnish的进程一旦挂起、崩溃或者重启,缓存的数据都会从内存中释放出来。此时的所有请求都会被发送到后端应用服务器上,在高并发的情况下,就会给后端服务器造成很大压力。

一、安装varnish

1.下载:https://www.varnish-cache.org/releases/varnish-cache-3.0.3


1

2

3

4

5

yum install -y make automake pkgconfig libtool pcre-devel #安装依赖包

tar zxvf varnish-3.0.3.tar.gz

./autogen.sh

./configure --prefix=/usr/local/varnish --enable-debugging-symbols --enable-developer-warnings --enable-dependency-tracking

make && make install

2.创建用户、组和日志文件


1

2

3

4

groupadd varnish

useradd -g varnish -s /sbin/nologin varnish

touch /usr/local/varnish/access.log #创建访问日志文件

chown -R varnish.varnish /usr/local/varnish

二、修改配置varnish

前端varnish缓存是以轮询的方式分担到后端web服务器,以下vcl不对php进行缓存。


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

vi /usr/local/varnish/etc/varnish/default.vcl

 backend web1 {

 .host = "192.168.0.203"#后端web1服务器ip

 .port = "80"#通过80端口来访问后端web

 .connect_timeout = 1s;  #连接超时时间

 .probe = {

        .url = "/";

        .interval = 5s;

        .timeout = 1 s;  #检测超时时间

        .window = 5;

        .threshold = 3;

    }

 }

 backend web2 {

 .host = "192.168.0.204";

 .port = "80";

 .connect_timeout = 1s;  #连接超时时间

 .probe = {

        .url = "/";

        .interval = 5s;

        .timeout = 1 s;  #检测超时时间

        .window = 5;

        .threshold = 3;

    }

 }

director default round-robin { #定义后端服务器组,默认轮询方式

 {

 .backend = web1;

 }

 {

 .backend = web2;

 }

}

 sub vcl_recv {

 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.request != "GET" &&

 req.request != "HEAD" &&

 req.request != "PUT" &&

 req.request != "POST" &&

 req.request != "TRACE" &&

 req.request != "OPTIONS" &&

 req.request != "DELETE") {

 return (pipe);

 }

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

 return (pass);

 }

 if (req.http.Authorization || req.http.Cookie) {

 return (pass);

 }

 return (lookup);

 }

 sub vcl_pipe {

 return (pipe);

 }

 sub vcl_pass {

 return (pass);

 }

 sub vcl_hash {

 hash_data(req.url);

 if (req.http.host) {

 hash_data(req.http.host);

 }

 else {

 hash_data(server.ip);

 }

 return (hash);

 }

 sub vcl_hit {

 return (deliver);

 }

 sub vcl_miss {

 return (fetch);

 }

 sub vcl_fetch {

 if (beresp.ttl <= 0s ||

 beresp.http.Set-Cookie ||

 beresp.http.Vary == "*") {

 set beresp.ttl = 120 s;

 return (hit_for_pass);

 }

 return (deliver);

 }

 sub vcl_deliver {

 return (deliver);

 }

 sub vcl_error {

 set obj.http.Content-Type = "text/html; charset=utf-8";

 set obj.http.Retry-After = "5";

 synthetic {"

 <?xml version="1.0" encoding="utf-8"?>

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

 <html>

 <head>

 <title>"} + obj.status + " " + obj.response + {"</title>

 </head>

 <body>

 <h1>Error "} + obj.status + " " + obj.response + {"</h1>

 <p>"} + obj.response + {"</p>

 <h3>Guru Meditation:</h3>

 <p>XID: "} + req.xid + {"</p>

 <hr>

 <p>Varnish cache server</p>

 </body>

 </html>

 "};

 return (deliver);

 }

 sub vcl_init {

 return (ok);

 }

 sub vcl_fini {

 return (ok);

 }

语句解析:

Varnish处理请求的主要处理方法
1. vcl_recv
首先接收请求,判断是否要进一步处理,还是直接转发给后端(pass)等。 此过程中可以使用和请求相关的变量,例如客户端请求的url,ip,user-agent,cookie等,此过程中可以把不需缓存的地址,通过判断(相等、不相等、正则匹配等方法)转给后端,例如gif/png/jpg/css/js等静态文件;
2. vcl_fetch
当从后端服务器获取内容后会进入此阶段,除了可以使用客户端的请求变量,还可以使用从后端获取的信息(bersp),如后端返回的头信息,设置此信息的缓存时间TTL等;
3. vcl_miss
缓存未命中时中要做的处理
4. vcl_hit
缓存命中后做的处理
5. vcl_deliver
发送给客户端前的处理
6. vcl_pass
交给后端服务器
7. vcl_hash
设置缓存的键值key
Varnish处理流程
首次请求时过程如下:
recv->hash->miss->fetch->deliver
缓存后再次请求:
recv->hash->hit->deliver(fetch的过程没了,这就是我们要做的,把要缓存的页面保存下来)
直接交给后端pass的情况:
recv->hash->pass->fetch->deliver(直接从后端获取数据后发送给客户端,此时Varnish相当于一个中转站,只负责转发)

三、测试

1、启动


1

/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,512M -g varnish -u varnish -T 127.0.0.1:2000 -a 0.0.0.0:80

-f:选项用于指定Varnishd使用的配置文件的路径。

-s malloc,2G:–s选项用来确定Varnish使用的存储类型和存储容量,这里使用的是malloc类型(malloc是一个C函数,用于分配内存空间),2G 定义多少内存被malloced。

-T:127.0.0.1:2000是Varnish基于文本方式的一个管理接口,启动后可以在不停止Varnish的情况下来管理Varnish。管理端口2000可以指定。因为不是任何人都可以访问Varnish管理端口,所以这里推荐只监听本机端口。

-a:0.0.0.0:80中-a选项表示Varnish监听所有IP发给80端口的HTTP请求。

2、设置varnish访问日志


1

2

3

4

5

6

7

8

/usr/local/varnish/bin/varnishncsa -n /usr/local/varnish/var/varnish/test.com -a -w /usr/local/varnish/access.log & #将varnish访问日志写入到access.log里

/usr/local/varnish/var/varnish/test.com :默认缓存目录

netstat -tuplan |grep varnish #查看是否启动200080端口

tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28551/varnishd

tcp 0 0 127.0.0.1:2000 0.0.0.0:* LISTEN 28550/varnishd

tcp 0 0 :::80 :::* LISTEN 28551/varnishd

curl -I http://ip #使用curl命令查看是否被缓存

killall -9 varnishd #关闭varnish

现在输入varnish服务器ip就可以访问到后端web服务器!

3、设置开机启动:


1

echo '/usr/local/varnish/sbin/varnishd -f /usr/local/varnish/etc/varnish/default.vcl -s malloc,512M -g varnish -u varnish -T 127.0.0.1:2000 -a 0.0.0.0:80' >> /etc/rc.local

4、添加多个后端服务器

如果添加多个后端网站服务器,在default.vcl里面添加不同网站的访问请求转发到对应的backend去。

时间: 2024-11-01 05:42:34

Varnish搭建缓存代理提高网站访问速度的相关文章

Squid搭建反向代理提高网站访问速度

反向代理简述: 反向代理服务器有两种传输模式: 1.同步模式:(如:squid)用户发起请求,请求立即被转到后端的服务器,于是在浏览器和后端服务器之间就建立了一个连接,在请求完成前这个连接是一直存在的. 2.异步模式:(如:nginx)用户发起的请求会发送到nginx,nginx接收到所有的数据后在转发到后端的服务器,后端服务器处理完成后把数据返回给nginx,nginx在返回给用户. 由此可见如果用户发起的请求的数据比较大,或者用户端的网速比较慢,同步模式时后端服务器的连接数相对于异步模式会比

提高网站访问速度的两种简单方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 引言:我们平时在上网的时候,当你在百度中搜索一个内容,点击进入这个网页或者是你直接输入网址进入某个网站,需要等待十几秒钟的时间才能完全打开你所需要的页面,相信没有几个人愿意再继续浏览该站的其它页面了,因为人在等待的过程当中,心情是极为痛苦不舒服的,就像你约了某位美女(或帅哥),到了约定的时间,但她(他)确迟迟末到,那么这个心情大家应该都很好理

如何提高网站访问速度?

据Websense调查公司称多达70%的上网者表示不愿意在页面读取上超过8秒钟,超过70%的人会因为"慢悠悠的网页下载速度"而放弃在线浏览和购物行为.网站的访问速度问题已经直接影响到了网站的流量,而网站的访问量几乎与网站的利益直接挂钩,因此网站的速度问题成为企业及站长十分关注的问题.笔者就如何提高网站访问速度提出自己的看法,希望对大家有所帮助. 统计显示,在我国,90%的企业网站选择虚拟主机作为网站空间.因此,选择好的虚拟主机商是保证速度和稳定的关键.从目前国内IDC的发展发展来看,解

清空IE缓存 提高网站访问速度

  清空IE缓存可以有效提高电脑访问网站的速度目前IE浏览器的版本有种首先检查电脑的IE是哪个版本查看IE浏览器版本的方法打开任何一个网页点击上方的帮助选择关于Internet Explorer自动弹出窗口中就会显示IE浏览器的版本如图(IE) 清空IE缓存方法 请您打开任意一个网页点击网页上方的工具= >Internet选项 根据自己使用的版本不同来操作以下是IE浏览器常用的个版本清空IE缓存的具体操作方法: 版本一:IE浏览器 第一步:在常规页面点击删除Cookies会自动弹出一个窗口再点击

WEB程序代码优化和提高网站访问速度

这里对web程序方面的优化作一个总结,虽然我用的是PHP其实不管理是什么语言方向都是一样的. 1.编码规范化可读性优化 编码规范我想一般程序员不会不了解,如果你这方面是空白你应该好好补补基础了,做到编码规范是一个好的程序员的最基础要求,一个团队也应该有自己的编码规范.所以程序的优化也应该包含到这个方面,在你开发程序的过程中可能会有些遗漏,所以在我们进行编码规范化可读性优化是很有必要的.其实一份再好的程序代码若干年后你自己都未必能看的懂更不用说别人来看你的代码,使你自己写出的代码有更好的可读性,这

双线机房为你解忧 如何提高网站访问速度

互联网的浪潮一浪高过一浪,普及率也在不断提高.由于信息化发展迅速,企业对建站要求不断提高,多数企业在建站时会选择购买服务器,服务器托管已成为十分普遍的现象.服务器托管的安全性和稳定性较好,而且自主管理权限要比http://www.aliyun.com/zixun/aggregation/14840.html">虚拟主机多. 根据艾瑞咨询集团(中国)近日发布的一组权威数据表明,企业在选择主机服务商时对"机房的安全保障"的关注度已经超出对"带宽资源"的将

“一起快”:让网站访问速度瞬间提升100%

中介交易 SEO诊断 淘宝客 云主机 技术大厅 网站访问慢,是国内大部分网站普遍面临的问题.由于我国南北线路差异,用户访问网站时会出现访问速度延迟问题,特别是在网站使用海外主机的情况下,访问慢的情况异常明显.网站访问慢不只会损害用户体验,更会导致用户流失.调查显示,用户打开网页速度一旦超过5秒,就有80%的用户关闭网页,并离开网站. 为了提高网站访问速度,很多站长会选择收费或免费的CDN加速产品.但是CDN接入对网站备案.资质等有诸多要求,这将很多不满足审核条件的网站排斥在外.另外,网站接入CD

使用Nginx反向代理和proxy_cache缓存搭建CDN服务器加快Web访问速度

碰到问题:移动用户访问web服务器www.osyunwei.com很慢解决办法:1.在移动机房放置一台nginx反向代理服务器2.通过域名DNS智能解析,所有移动用户访问www.osyunwei.com时解析到nginx反向代理服务器3.nginx反向代理服务器与web服务器之间采用专线连接系统运维  www.osyunwei.com  温馨提醒:qihang01原创内容版权所有,转载请注明出处及原文链接说明:1.web服务器线路:电信IP:192.168.21.129域名:www.osyunw

PHP 动态网站变 静态缓存 加快网站访问速度

有些php网站由于前期设计以及其它原因  网站是纯动态或者是大部分是动态的,对数据库的操作很频繁.  造成网站访问速度很慢!想实现静态,又没有生成静态功能.  因为我写了一个精简的生成静态的程序.很简单,一看就懂  适合基本上所有系统  要求  1.系统支持php  2.支持file_get_contents file_put_contents [也可以用同样作用的函数替换]  3.最好支持gzcompress  使用方法  1.下载下面分享的huncun.php文件  2.在网站根目录建文件夹