ASP.NET性能优化之反向代理缓存

开发 后端
今天我们将要讲到的是大型站点的一种常用做法,将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存。

  到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish。这两款软件通常都部署在非WINDOWS平台上,对于Windows平台上的Asp.net来说,其实一样能使用,我们完全可以把反向代理软件部署在LINUX上,然后代理会路由到后台的WINDOWS WEB(IIS)服务器。总之,非WINDOWS的世界很精彩。

  当然,无论是squid还是varnish都有Windows的扩展版本。本文为了简便起见,基于varnish的Windows版本来描述的。

  varnish的官方站点:https://www.varnish-cache.org/,

  varnish的Windows版本:http://www.cygwin.com/,如果要编译过的直接可用的版本,在这里:http://www.software112.com/products/cygwin-varnish-cache.html。

  1:将varnish配置为IIS的代理

  首先需要为varnish准备配置文件,比如,可以为default.vcl,内容如下:

  1.   backend default  
  2.   {  
  3.   .host = "192.168.0.77";  
  4.   .port = "80";  
  5.   }  
  6.   sub vcl_fetch  
  7.   {  
  8.   remove beresp.http.Set-Cookie;  
  9.   }  
  10.   sub vcl_recv  
  11.   {  
  12.   remove req.http.Cookie;  
  13.   } 

  在我们要示范的这个实例中,这3个配置都不能少,如下,

  backend default:指定我们的IIS站点的地址和端口;

  sub vcl_fetch:这是一个varnish函数,它varnish从后端服务器,也就是IIS中获得数据后被调用;

  sub vcl_recv:varnish函数,表示客户端请求杠杠到达反向代理服务器时被调用;

  由于varnish默认在碰到http头中含有Cookie相关标识时直接忽略缓存,所以我们需要上面的两个函数针对Cookie做特殊处理。当然,目前这两个函数只是简单而野蛮的删除标识,实际的应用中我们可能需要根据实际情况为它们加上一些判断条件。

  2:启动varnish

  下面的命令为我启动varnish:

  C:varnishin>varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -s file,c:/varnish/var/cache,100M

  -a:8011表示,让varnish监听在8011端口。由于我测试环境下varnish和iis是在同一台机器上,所以IIS已经占用了80,我这里只有使用其它端口。

  -T是为varnish指定一个管理端口;

  -f指定所要使用的配置文件;

  后面的参数只是让varnish使用文件缓存,大小为100M,当然,应该根据实际情况指定大小;

  启动varnish后,如果我们请求http://地址:端口/,就可以等到200OK状态码,那表示varnish已经在正确滴接受请求。

  3:一个实例

  创建asp.net页面,内容如下:

  1.   protected void Page_Load(object sender, EventArgs e)  
  2.   {  
  3.   this.Response.AddHeader("Cache-Control""max-age=60");  
  4.   this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));  
  5.   DateTime IfModifiedSince;  
  6.   if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))  
  7.   {  
  8.   if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds <60)  
  9.   {  
  10.   Response.Status = "304 Not Modified";  
  11.   Response.StatusCode = 304;  
  12.   return;  
  13.   }  
  14.   }  
  15.   string conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";  
  16.   using (DataSet ds = Common.SqlHelper.ExecuteDataset(conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))  
  17.   {  
  18.   var result = ds.Tables[0].Rows[0]["name"].ToString();  
  19.   Response.Write(result);  
  20.   }  
  21.   } 

  对该页面进行压力测试,100个用户,1000个请求,得到的结果如下:

  如果没有缓存,则结果如下:

  可以看到吞吐率有非常大的提升。

  4:监控varnish

  可以使用varnishstat命令,对varnish进行监控,在上面的压力测试中,如果我们使用监控,得到的结果如下:

  在本例中,我们可以看到共请求了1000次,其中999次命中缓存,那是因为***次显然肯定是要从IIS中拿输出滴。

  5:管理varnish

  可以通过多种途径来进行varnish的管理,包括更改配置、停止服务、启动服务、清理缓存等。可以通过varnishadm命令进行管理,如果你是在远程的话,可以使用telnet来进行管理:

  telnet 192.168.0.77 8088

  其中8088就是我们刚在启动varnish的时候指定的管理端口。连接上之后,stop停止服务、start启动服务,可以敲入help查看所有命令。下面的命令,清除所有缓存:

  purge.url *$

  6:谨慎引入varnish后带来的缓存变化

  引入varnish后,可以发现使用强制刷新(ctrl+R5)后,动态行为发生了改变,即客户端浏览器会去VARNISH上请求数据,但是此时的缓存中已经存在静态的缓存内容,varnish会首先根据请求的HTTP头去和这个缓存内容判断得出需要是否更新,即由于缓存内容的存在,请求不会去IIS上进行缓存协商。这个时候,缓存中的静态内容会直接返回给客户端浏览器,这样一来的话,我们在Page_Load中的代码就根本不会执行,因为它是在IIS中的。

  要避免这种情况的发生,我们必须更改VARNISH配置文件,让VARNISH碰到强制更新的时候,忽略缓存,直接去IIS上请求,为配置文件增加如下函数:

  1.   sub vcl_hit {  
  2.   if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){  
  3.   set obj.ttl=0s;  
  4.   return (restart);  
  5.   }  
  6.   return (deliver);  
  7.   } 

  经过上面的修改后,再次使用强制更新varnish将会忽略缓存,到IIS上去拿正文。

原文:http://www.cnblogs.com/luminji/archive/2011/10/17/2178759.html

【编辑推荐】

  1. ASP.NET MVC会成为ASP.NET未来主流的UI平台?
  2. ASP.NET性能优化之构建自定义文件缓存
  3. 想爱容易相处难:当ASP.NET MVC爱上IoC
  4. 导致ASP.NET站点重启的十大原因
  5. 浅谈ASP.NET核心对象
责任编辑:彭凡 来源: 博客园
相关推荐

2011-10-19 09:41:15

ASP.NET性能优化

2011-09-08 13:56:41

ASP.NET性能

2012-05-16 10:24:26

ASP.NET性能优化

2009-08-13 16:22:18

ASP.NET性能优化

2009-08-13 15:49:18

ASP.NET性能优化

2009-02-23 15:55:29

ASP.NET.NET性能提升

2011-02-13 09:37:55

ASP.NET

2009-08-03 18:47:12

ASP.NET数据缓存

2011-02-22 09:16:24

高性能ASP.NET

2009-07-29 15:38:01

2009-07-31 10:23:44

缓存页面ASP.NET缓存

2011-07-06 08:46:30

2021-05-19 08:04:11

ASP.Net服务性原则

2011-02-17 09:13:57

ASP.NET

2009-07-28 17:17:19

ASP.NET概述

2009-07-29 14:35:34

页面输出缓存ASP.NET

2009-07-31 10:33:54

ASP.NET页面输出

2009-08-04 15:22:33

ASP.NET缓存机制

2011-06-28 15:14:10

ASP.NET性能优化

2018-02-23 13:55:16

ASP.NET性能优化技巧
点赞
收藏

51CTO技术栈公众号