天天看點

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,内容如下:

輕按兩下代碼全選

13 <code>backend default

{

.host = "192.168.0.77";

.port = "80";

}

sub vcl_fetch

remove beresp.http.Set-Cookie;

sub vcl_recv

remove req.http.Cookie;

}</code>

在我們要示範的這個執行個體中,這3個配置都不能少,如下,

backend default:指定我們的IIS站點的位址和端口;

sub vcl_fetch:這是一個varnish函數,它varnish從後端伺服器,也就是IIS中獲得資料後被調用;

sub vcl_recv:varnish函數,表示用戶端請求杠杠到達反向代理伺服器時被調用;

由于varnish預設在碰到http頭中含有Cookie相關辨別時直接忽略緩存,是以我們需要上面的兩個函數針對Cookie做特殊處理。當然,目前這兩個函數隻是簡單而野蠻的删除辨別,實際的應用中我們可能需要根據實際情況為它們加上一些判斷條件。

2:啟動varnish

下面的指令為我啟動varnish:

C:varnishbin>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頁面,内容如下:

22 <code>protected void Page_Load(object sender, EventArgs e)

this.Response.AddHeader("Cache-Control", "max-age=60");

this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));

DateTime IfModifiedSince;

if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))

if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 60)

Response.Status = "304 Not Modified";

Response.StatusCode = 304;

return;

string conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";

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()"))

var result = ds.Tables[0].Rows[0]["name"].ToString();

Response.Write(result);

對該頁面進行壓力測試,100個使用者,1000個請求,得到的結果如下:

ASP.NET性能優化之反向代理緩存

如果沒有緩存,則結果如下:

ASP.NET性能優化之反向代理緩存

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

4:監控varnish

可以使用varnishstat指令,對varnish進行監控,在上面的壓力測試中,如果我們使用監控,得到的結果如下: