利用IIS管理器模擬CDN

CDN(Content Delivery Network,內容分發網絡)。其含義,在百度百科上是這麼寫的:CDN 是構建在數據網絡上的一種分佈式的內容分發網。CDN 的做用是採用流媒體服務器集羣技術,克服單機系統輸出帶寬及併發能力不足的缺點,可極大提高系統支持的併發流數目,減小或避免單點失效帶來的不良影響。。。後面一大堆。jquery

至於它到底寫的是什麼。我也解釋不清楚。其做用簡單粗暴地理解就是:加速。舉例說明:ajax

使用Chrome上一個網站(在這以前調出開發者工具(F12)):http://www.codeproject.com/windows

而且在開發者工具中選中「Network」。api

  

 

而後按下回車進入網站。等待網站加載完畢。而後看到這個Network裏面的內容。瀏覽器

 

有一條極其可恥的紅色請求。請求的文件名爲:jquery.min.js,類型爲Get,狀態爲(faild),還花費了10.93S。最下面的信息顯示總共花費了12.84秒,而這個jquery的請求就花費了10.93s,還失敗了。緩存

如今再單擊這條紅色的請求,來查看詳情。服務器

以下圖:網絡

看到這個Request URL,發現這條請求是發送到googleapis.com主機的。問題就在這裏。谷歌在中國,基本上是被防火牆轟殺至渣的。這條請求根本不能完成正常的響應,致使了花了10.93s尚未響應,最後還請求失敗了。併發

發生這類狀況,通常都是在咱們訪問國外的網站的時候發生的,國內開發者都知道國情,因此要麼已經把腳本放在本身的網站下了,或者直接把請求發送到某個CDN服務器上來加載。可是向Codeproject、Stackoverflow等國外網站都直接用googleapis,mvc

因此有這問題。

那麼這個問題該如何解決。這時候,CDN技術就能夠派上用場了。我這個所謂的CDN,只是一個測驗而已,擺不上臺面的。本身玩玩就能夠了。

那麼如何來操做。

下面分兩大塊來測試。一、不寫一行代碼;二、用少許的代碼控制(.net mvc4)

首先來講第一種:不寫一行代碼如何來作。

(1)須要的設備:一臺服務器(windows),一臺客戶機(windows)。注意:若是沒有服務器,那麼只有一臺客戶機也是能夠的,就是一臺計算機又當服務器,又當客戶機。

(2)服務器(或者客戶機)須要去控制面板打開IIS管理,這個不說了。

(3)下載一個jQuery文件。這裏有個微軟CDN服務器能夠下載,打開連接以後,Ctrl+S就好了——http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.1.4.min.js

(4)原理簡介:咱們在瀏覽器輸入一個域名(網址),按下回車以後,計算機(windows)作的事情,就是先在本地的一個名叫hosts的文件中查找映射關係。

這個hosts文件的做用就是解析域名,把請求的域名轉換成IP。來看一下hosts文件中內容(能夠直接用記事本打開,此處使用Notepad++,強烈推薦啊)。以下圖:

看到這個文件有不少的註釋,這些信息很是有用,建議仔細研讀,這裏稍做解釋。這些註釋說的大意就一句話:

本文件用於域名解析,用法:一行只能寫一個映射關係,語法是:IP 空格 域名。

也就是說,咱們只要像他那樣寫,在最後追加一行,並保存,好比

127.0.0.1 www.baidu.com

而後去瀏訪問百度,發現並無訪問到百度。由於域名解析被指向了本地127.0.0.1。

由此能夠想到,若是能把這個ajax.googleapis.com域名解析成咱們能夠訪問到的IP不就能夠了嘛。因而先肯定服務器(或者客戶機)的IP地址。我這裏的IP地址是局域網IP地址:192.168.1.108。

若是是客戶機,好比是本身的計算機,那麼能夠寫127.0.0.1。因而追加到hosts中去:

192.168.1.108 ajax.googleapis.com

接下來,看到光是域名解析作完了是不夠的,由於那一段請求很是的長,後面有不少級目錄:http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js

那麼這時候IIS的功能就要用起來了。首先到服務器中建立好本地目錄,注意這個目錄的結構要作成:/ajax/libs/jquery/1.6.2/jquery.min.js以下圖:

而後在IIS中添加網站,怎麼添加這裏不說,添加以後如圖:

 

 

而後注意,在訪問codeproject以前最好作一件事情,就是清空瀏覽器緩存,不然可能會從緩存中讀取,看不到效果。接着來訪問網站。

 

 

 

看到這結果,完美加載狀態碼爲200,成功了。而後單擊這條查看詳情:

 

咱們看到這裏多了一個Remote Address,就是咱們想要解析到的IP地址,後面的80是默認端口。簡直完美運行啊。

這裏不得不說明一下,hosts文件應該是不支持端口映射的,我試了不少,像什麼冒號+端口,逗號+端口,都不行,去查好像也是說不行,

也就是說咱們解析的時候只能使用80端口。而80端口是默認的,因此在hosts文件中不用指明。

那麼再來考慮一種狀況,不一樣的網站jquery文件請求版本可能不一樣。codeproject是1.6.2,stackoverflow的是1.7.1,jquery.com的請求是1.11.2。而咱們剛纔只有一個1.6.2。

既然這樣,那咱們會想,我在剛纔的文件夾/ajax/libs/jquery/下,多加幾個版本文件夾不就好了嗎。好比再加一個1.7.1,再加一個1.11.2,而後在這兩個文件夾下再各放一個

jquery.min.js。不錯,這的確是能夠的。這個jquery.min.js文件的實際版本,你能夠不跟文件夾對應,你能夠所有都是1.6.2,只要外面的文件夾版本寫對就好了,可是這樣不是很好,

由於有些網站用的1.11.2版本里的特性,而你給他解析加載的其實是1.6.2,這樣就會報錯了。因此最好仍是對應起來。

 

接下來講第二種方法,用少許的.net mvc手段來控制。

可讓jquery的實際版本和文件夾寫出來的版本號完美對應。

首先用visial studio 2012 update5來建立一個mvc4項目。

以下:

建立完了以後沒用的東西所有刪除,其中這個script文件夾中放了不少的jquery版本,如圖:

好了。而後咱們來建立一個控制器,取名爲HomeController,寫一個Action,取名爲Index,以下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CDN.Controllers
{
    public class HomeController : Controller
    {
        public void Index(object id)
        {
            var js = String.Format(@"/Script/jquery-{0}.min.js", id);
            var temp = Server.MapPath("~" + js);
            Response.WriteFile(temp);
        }
    }
}

而後根據http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js這個請求的特性,來配置一下路由參數。以下代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace CDN
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "ajax/libs/jquery/{id}/jquery.min.js",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}

懂MVC4的人一眼就知道了,若是不懂的,建議先看看mvc4的路由規則,這裏再也不贅述。這個url,就是根據那條請求特性寫的,把版本號用{id}來代替,把請求指向/Home/Index?id=版本號。

因而HomeController中的Index順利的接收到了請求,再根據id中傳過來的版本號找到服務器中相關文件,而後response出去,就能夠了。最後發佈出來,部署到IIS中。詳細過程不贅述。如圖:

而後去訪問一下,結果跟上面如出一轍,這裏不截圖了。

 

我的感受第二種方法好一點,用程序控制版本。不過第一種方法簡單粗暴,也是能夠的。

模擬CDN就完成了。這裏用googleapis來舉例,由於用到的仍是挺多,因此就用這個了。這種方法本身隨便玩玩就好了。畢竟要改hosts,不宜作什麼用處。

相關文章
相關標籤/搜索