ASP.NET 效能最佳化之反向 Proxy緩衝使用介紹

來源:互聯網
上載者:User

到目前為止,我們討論了把緩衝存放在ASP.NET的輸出緩衝中(記憶體和硬碟),以及瀏覽器緩衝中,而大型網站的另一種常用做法是將緩衝部署在反向 Proxy伺服器上,這類緩衝我們通常稱之為反向 Proxy緩衝,比如Squid和Varnish。這兩款軟體通常都部署在非WINDOWS平台上,對於Windows平台上的Asp.net來說,其實一樣能使用,我們完全可以把反向 Proxy軟體部署在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,內容如下:

複製代碼 代碼如下:backend default
{
.host = "192.168.0.77";
.port = "80";
}
sub vcl_fetch
{
remove beresp.http.Set-Cookie;
}
sub vcl_recv
{
remove req.http.Cookie;
}

在我們要示範的這個執行個體中,這3個配置都不能少,如下,
backend default:指定我們的IIS網站的地址和連接埠;
sub vcl_fetch:這是一個varnish函數,它varnish從後端伺服器,也就是IIS中獲得資料後被調用;
sub vcl_recv:varnish函數,表示用戶端請求杠杠到達反向 Proxy伺服器時被調用;
由於varnish預設在碰到http頭中含有Cookie相關標識時直接忽略緩衝,所以我們需要上面的兩個函數針對Cookie做特殊處理。當然,目前這兩個函數只是簡單而野蠻的刪除標識,實際的應用中我們可能需要根據實際情況為它們加上一些判斷條件。
2:啟動varnish
下面的命令為我啟動varnish:
C:\varnish\bin>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頁面,內容如下: 複製代碼 代碼如下: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個請求,得到的結果如下:

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

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

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上請求,為設定檔增加如下函數:

複製代碼 代碼如下:sub vcl_hit {
if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){
set obj.ttl=0s;
return (restart);
}
return (deliver);
}

經過上面的修改後,再次使用強制更新varnish將會忽略緩衝,到IIS上去拿本文。
參考:
https://www.varnish-cache.org/docs/trunk/reference/varnishlog.html
https://www.varnish-cache.org/trac/wiki/Introduction#TheVarnishConfigurationLanguage
http://www.docunext.com/wiki/Varnish
http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.