IIS架構與HTTP請求處理流程

     Windows操作系統中的IIS負責提供互聯網服務,一臺運行了IIS的計算機可以看成是一臺Web服務器。

       Windows XP SP2 中IIS主版本號爲5,Windows 2003 Server爲6,Vista和Windows Server 2008爲7。對於Windows 2003 Server,其默認支持的ASP.NET版本爲1.1,因此必須單獨安裝.NET Framework 2.0以上版本[1]。

       目前,IIS 6是使用最爲廣泛的版本,IIS 5已基本不在Web服務器上部署,IIS 6與IIS 5相比在系統架構上有着較大的差異,IIS 7與IIS 6相比,基本架構並沒有根本性的變化,但在許多方面有新的增強和改進。本書選擇IIS 6/7進行介紹,大部分內容也適合於IIS 5,但IIS 5一些已過時的特性就不介紹了。

       首先,我們來仔細分辨一下三個很容易混淆的基本概念。

8.1.1網站、Web應用程序和虛擬目錄

       在IIS中可以創建網站、Web 應用程序和虛擬目錄,以便與計算機網絡上的用戶共享信息。“網站”、“Web 應用程序”和“虛擬目錄”這三個概念的關係如圖8‑1所示。

網站,應用程序與虛擬目錄


圖8‑1網站,應用程序與虛擬目錄

       簡而言之,一個“網站(Web Site)”包含一個或多個“ Web 應用程序(Web Application)”,一個Web 應用程序包含一個或多個“虛擬目錄(Virtual Directory)”,而虛擬目錄則映射到 Web 服務器或遠程計算機上的物理目錄。

       圖8‑2所示爲運行IIS 7的一個Web服務器。

IIS 7中的網站,應用程序與虛擬目錄

圖8‑2IIS 7中的網站,應用程序與虛擬目錄

       圖8‑2中可以清楚地看到此Web服務器上有兩個“網站”:Default Web Site和NewWebSite,其中Default Web Site網站中有三個“Web 應用程序”:HappyBookShopService、HappyBookShopWebSite和OnlineAlbum。而HappyBookShopWebSite應用程序下的每一個子文件夾都是一個“虛擬目錄”。最頂層的虛擬目錄稱爲“根虛擬目錄”,圖8‑2中Web應用程序HappyBookShopWebSite的根虛擬目錄爲“/HappyBookShopWebSite”。

       下面逐個剖析這三個概念。

1網站(Web Site)

       網站是Web 應用程序的容器,每個網站都有一個唯一的標識,這一標識由它的IP 地址、端口和可選的主機頭/主機名組合而成,Web服務器根據收到的HTTP請求中的這些信息來確定是對哪一個網站的請求。

       在IIS 7中,將網站標識稱爲“網站綁定”,圖8‑3所示爲IIS 7默認網站的“網站綁定”對話框。

IIS7.0中的網站綁定

圖8‑3IIS7.0中的網站綁定

2 Web 應用程序(Web Application)

      Web 應用程序是一種在應用程序池(Application Pool)[3]中運行並通過HTTP 協議向用戶提供信息服務(通常以HTML 格式表達信息)的軟件程序。創建Web 應用程序時,Web 應用程序的名稱將成爲網站URL 的一部分,用戶可以通過Web 瀏覽器發出針對該URL的HTTP請求。

使用Visual Studio創建的“ASP.NET網站”,其實是一個“Web 應用程序”,它並不等於IIS中的“網站”。

       在IIS中,每個網站至少必須擁有一個Web 應用程序(但不一定是ASP.NET應用程序,可以是其他類型的Web應用程序),它被稱爲“根Web 應用程序”或“默認Web 應用程序”,除此之外,網站還可以包含一個或多個ASP.NET(或其他種類)Web 應用程序。

       在Windows XP SP2中,使用Visual Studio創建的ASP.NET網站發佈到本機IIS之後都是作爲本機默認網站(即“localhost”所代表的網站)所承載的Web應用程序而運行的。

       Windows Server和Vista可以爲某個ASP.NET應用程序創建一個獨立的IIS網站,此網站只承載這個唯一的ASP.NET應用程序,並且運行在一個獨立的應用程序池中。許多商業網站都採用這種方法以獲取較高的性能,同時將此網站與Web服務器上承載的其他網站相互隔離,以增強Web服務器的安全性。

3 虛擬目錄(Virtual Directory)

      

    虛擬目錄是在IIS 中指定並映射到本地或遠程服務器上的物理目錄的目錄名稱。然後,此虛擬目錄名稱將成爲Web 應用程序URL 的一部分,用戶可以通過Web 瀏覽器向IIS請求訪問此URL所對應的物理目錄中的資源。

       在IIS中,每個Web 應用程序都必須擁有一個最頂層的虛擬目錄,它被稱爲“根虛擬目錄”。

       在Visual Studio中,可以在屬性窗口中直接設定ASP.NET網站的根“虛擬路徑”(圖8‑4)。

ASP.NET網站的虛擬路徑

圖8‑4ASP.NET網站的虛擬路徑

       但要注意,這裏設定的“虛擬路徑”是Visual Studio自帶的輕量級Web服務器“ASP.NET Development Server”的虛擬路徑,而非IIS中的虛擬路徑。如果使用Visual Studio完整版本(比如團隊開發版),則可以使用一個“發佈網站”的功能。在使用此功能發佈網站時可以直接指定ASP.NET應用程序在IIS中所對應的根虛擬目錄圖8‑5)。

定IIS中ASP.NET網站的根虛擬目錄

圖8‑5設定IIS中ASP.NET網站的根虛擬目錄

       圖8‑5中將ASP.NET網站所對應的IIS根虛擬目錄設爲MyNewWebSite。

       一個Web 應用程序可以擁有多個虛擬目錄,這些虛擬目錄都將成爲Web 應用程序根虛擬目錄的子目錄。

       可以很方便地在IIS中創建一個虛擬目錄(圖8‑6)。

在IIS 7中創建一個虛擬目錄

圖8‑6在IIS 7中創建一個虛擬目錄

       給Web應用添加完虛擬目錄之後,可以通過以下URL訪問虛擬目錄中的網頁

    http://網站名稱/Web應用程序根虛擬目錄/新創建的子虛擬目錄/Web網頁名稱

       在上面的例子中,Web應用程序根虛擬目錄爲“/MyNewWebSite”,新加的虛擬目錄爲“MyNewVirtualDir”,它指向“D:/MyDir”目錄。現假設D:/MyDir目錄中有一個ASP.NET網頁(不妨設爲Sample.aspx),則通過以下URL可以訪問此網頁:

    http://localhost/MyNewWebSite/MyNewVirtualDir/Sample.aspx


[1] 建議在Windows 2003 Server上安裝最新版本的.NET Framework以支持一些新技術,比如AJAX和Silverlight。

[2] 更具體來說,是Windows Server的一個系統核心組件:HTTP.SYS負責這一工作。後面在介紹IIS架構時還將介紹HTTP.SYS組件。

[3]後文將應用程序池作更詳細的介紹

[4]“虛擬目錄”有時又被稱爲“虛擬路徑”,兩者代表同一概念。

[5]對於Visual Web Developer速成版,它沒有提供“發佈網站”的功能,但可以在“複製網站”對話窗口找到相應的按鈕完成這一工作。或者更直接些,直接使用IIS管理器來完成這一工作。

[6]在IIS 5/6中使用“虛擬目錄創建嚮導”來創建虛擬目錄,其方法是在IIS的某個Web應用程序節點上右擊,從快捷菜單中選“新建”-->“虛擬目錄”命令。IIS 7的操作是類似的,但它直接在快捷菜單的第一級中就提供了“添加虛擬目錄”的命令。

8.1.2 應用程序池與工作者進程


       “應用程序池(Applicaion Pool)”是Windows Server爲提升Web服務的性能和可靠性而引入的一個Web程序隔離機制。

       一個應用程序池可包含一個或多個Web應用程序。ASP.NET Web應用程序必須運行在一個應用程序池中。

       在Windows Server中,一個或多個“工作者進程(Worker Process)”爲應用程序池提供服務,停止一個應用程序池將導致這些工作者進程被關閉,這時,所有發往此應用程序池中Web應用程序的HTTP請求將收到“503服務不可用”的響應信息。

       圖8‑7展示了一臺Web服務器上正在運行的應用程序池。

應用程序池

圖8‑7IIS 7中的應用程序池

       如圖8‑7所示,本臺Web服務器上的設置了3個應用程序池,每個應用程序池中可運行多個Web應用程序,圖中DefaultAppPool這一應用程序池運行了5個Web應用程序。每個應用程序池都可以加載特定版本的.NET Framework,以對ASP.NET應用程序提供支持。在IIS 7中,應用程序池有兩種運行模式——經典模式和集成模式

       經典模式下,IIS7應用程序池運行方式同IIS 6 [1]。

       集成模式下,IIS 7直接預裝載.NET Framework,從而爲ASP.NET應用程序提供了更好的性能。

       在IIS管理器中可以隨時啓動和停止某個應用程序池。

       Windows Server上運行應用程序池的系統帳號是“NetworkService”。在後面的章節中可以看到在部署ASP.NET網站時往往需要給此帳號設置特定的權限(比如允許ASP.NET應用程序向某文件夾中添加文件)。

       下面深入介紹一下IIS的系統架構以及Windows Server是如何響應HTTP請求的。


8.1.3 IIS的系統架構

       IIS 6(運行於Windows 2003 Server)的架構如圖8‑8所示。


IIS 6架構

圖8‑8IIS 6的架構

       從圖8‑8中可以看到,IIS 6架構由以下幾個部分組成:

(1)HTTP.SYS:運行於Windows核心(Kernel)的一個組件,它負責偵聽(Listen)來自於外部的HTTP請求(通常來自網絡中另一臺計算機上的瀏覽器),根據請求的URL將其轉發給相應的應用程序池,由運行於應用程序池中的工作者進程來響應此HTTP請求。當此HTTP請求處理完成時,它又負責將處理結果發送出去(其接收者通常爲發出HTTP請求的瀏覽器)。

       爲了提供更好的性能,HTTP.SYS內部建立了一個緩衝區,將最近的HTTP請求處理結果保存起來,如果發現某個HTTP請求“不久以前”處理過了(即在緩衝區中可以找到),它就簡單地直接從緩衝區中取出這些結果發回給客戶端(通常爲發出HTTP請求的瀏覽器)。

(2)InetInfo:在IIS 5時代,InetInfo是IIS服務的主進程,在IIS 6中,它不再負責處理HTTP請求,但它繼續負責管理除了WWW服務之外的其他互聯網服務,比如用於文件傳輸的FTP服務和用於郵件收發的SMTP服務。

       InetInfo內部維護了一個元數據庫(Metabase),在這個數據庫中存入了一些重要的信息,這些信息對於維護各種互聯網服務(比如WWW和FTP)等是必不可少的。

(3)Worker Process:負責處理HTTP請求,被譯爲“工作者進程”,事實上,它是由一個可執行程序W3WP.EXE運行時所生成的一個進程[2],每一個工作者進程內部都可以管理一個或多個ASP.NET應用程序。工作者進程運行於一個應用程序池(Application Pool)中。IIS 6可以創建多個應用程序池,並指定某個ASP.NET應用程序在特定的應用程序池中運行(圖8‑9)。


設定程序池

圖8‑9設定ASP.NET網站所屬的應用程序池(圖截自Windows 2003 Server)

       一般情況下,一個應用程序池只有一個工作者進程,但也可通過配置必要的參數讓多個工作者進程同時運行在同一個應用程序池中,在這種情況下,這個應用程序池被稱爲“Web Garden(Web園)”。

(4)WAS(Web Admin Service):這是一個監控程序,它一方面可以存取放在InetInfo元數據庫(Metabase)中的各種信息,另一方面也負責監控應用程序池(Application Pool)中的工作者進程的工作狀態況,必要時它會關閉一個老的工作者進程並創建一個新的取而代之。



[1] IIS 6中應用程序池的運行方式後文有詳細介紹

[2]“進程(Process)”是一個具有一定獨立功能的程序在一個數據集合上的一次動態執行過程。如用通俗的語言來表達,可以簡單地將“進程”理解成一個正在運行的程序。

8.1.4 HTTP請求的處理過程

在瞭解了IIS的架構之後,來看一下IIS架構中的各個組成部分是如何相互配合處理HTTP請求的。

先來從總體上看看HTTP請求的處理過程(圖8‑10)。

http請求處理過程

圖8‑10HTTP請求的處理過程

圖8‑10清晰地展示出了HTTP請求處理就是瀏覽器與Web服務器間“一問一答”的過程

首先,瀏覽器嘗試連接Web服務器的80端口,如果Web服務器可以響應此連接請求,就在瀏覽器與Web服務器間建立了一個通訊鏈路,在此“通道”上瀏覽器與Web服務器可以相互發送與接收信息。

假設瀏覽器向Web服務器發出一個讀取某ASP.NET站點上的某個ASPX網頁的請求。當此請求通過網絡到達Web服務器時,此請求被HTTP.SYS組件所接收。HTTP.SYS系統組件會檢查此HTTP請求的相關信息,根據其URL將此HTTP請求發送給運行在某個應用程序池中的工作者進程處理。如果同時有多個針對此ASP.NET站點的HTTP請求,HTTP.SYS會將這些請求排隊,加入到對應的應用程序池的HTTP請求隊列中等待。

如果這是第一個對ASP.NET站點的HTTP請求,工作者進程會加載aspnet_isapi.dll,並將請求轉給它,aspnet_isapi.dll接着會裝載.NET CLR[1], 創建一個針對此ASP.NET站點的應用程序域[2],然後啓動一個複雜的由多個步驟和組件參與的處理流程,當此處理流程結束,要發回給客戶端的結果(通常是HTML代碼,當然也可以是其他類型的資源,比如由程序動態生成的圖片)已經生成,此結果被轉發給HTTP.SYS。

注意:對於以集成模式運行的IIS 7,.NET CLR在應用程序池一啓動就自動裝載,從而避免了臨時裝載CLR的花銷。後繼處理過程與IIS 6基本一致。

HTTP.SYS接收到請求的處理結果之後,將其緩存到緩衝區中,然後把處理結果發回給發出HTTP請求的瀏覽器。

       上述過程是對IIS處理HTTP請求全過程的粗略描述。8.2節將選取這個處理過程中的主要階段,詳細介紹針對ASP.NET網頁的HTTP請求處理過程。

       在IIS的文檔中經常會提到兩個術語:ISAPI擴展和ISAPI篩選器。

1 ISAPI擴展

       “ISAPI擴展(ISAPI Extension)”是一種可以添加到IIS中以增強Web服務器功能的程序,其載體爲DLL文件。它通常直接負責響應HTTP請求。

       根據HTTP請求要訪問的資源擴展名(通過URL獲取),IIS會選取特定的ISAPI擴展來處理這一請求,這一過程被稱爲“程序映射”。而用於響應HTTP請求的這一ISAPI擴展被稱爲“HTTP Handler(HTTP處理程序)”。圖8‑11展示了IIS 6中的程序映射。

程序映射

圖8‑11程序映射(IIS 6)

       在圖8‑11中可以看到,IIS指定對ASP.NET網頁(其擴展名爲.aspx)的請求將由aspnet_isapi.dll處理(圖8‑12)。

編輯映射

圖8‑12aspnet_isapi.dll負責處理對ASP.NET網頁的請求

       IIS 7中的程序映射與IIS 6略有不同。當IIS 7以“經典模式”運行時,與IIS 6一樣使用aspnet_isapi.dll響應針對“.aspx”的請求。但當IIS 7以“集成模式”運行時,則使用託管處理程序(System.Web.UI.PageHandlerFactory)響應針對“.aspx”的請求(圖8‑13)。


IIS7下的程序映射

圖8‑13IIS 7集成模式下的程序映射

2 ISAPI篩選器

       “ISAPI篩選器(ISAPI Filter)”也是一種DLL,但它不負責生成HTTP請求,它的主要作用是響應某些特定的事件。當這些事件發生時ISAPI篩選器被調用,它可以修改傳入或傳出的HTTP數據。

在IIS 7中,使用“HTTP模塊(HTTP Module)”取代了傳統ISAPI篩選器的功能。

注意:ISAPI擴展與ISAPI篩選器名字很相近,但其在IIS中的地位和所起的作用是不同的。

[1]CLR(Comon Language Runtime):通用語言運行時,是.NET的核心,可以將其看成是一臺虛擬的專用於運行.NET程序的計算機。

[2]應用程序域(Application Domain):.NET引入的一種代碼隔離機制,一個託管進程可以擁有多個應用程序域,在應用程序域中可以裝載程序集,創建特定類型的對象,調用對象的方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章