W3SVC也許是IIS 6.0體系中最不令人注意的組件,不過這並不說明它不重要。W3SVC的任務是根據配置數據的設置創建和監視工作線程,由工作線程運行Web網站應用。在IIS 5.0中,與IIS 6.0 W3SVC組件最接近的是IIS管理服務,IIS管理服務是Inetinfo的一部分;因此,如果Inetinfo出現問題,IIS管理服務也會出現問題,而且此時的IIS管理服務不能再重新啟動Inetinfo或其他故障的應用程序。在IIS 6.0中,W3SVC作為一個獨立的進程運行,Web應用的故障不可能波及W3SVC,因為W3SVC之內根本沒有第三方的代碼運行。W3SVC總是處於運行狀態,因此它能夠監視Web應用的健康狀況,並在必要時采取行動。由於這一策略,服務器能夠根據用戶指定的參數監視和重新啟動應用程序。
■ http.sys
IIS 6.0體系設計中最重大的變化是加入了http.sys驅動程序,http.sys驅動程序的任務是處理HTTP請求,而且它在內核模式下執行操作。不要小看這一改變,將處理HTTP請求的任務從IIS 5.0、IIS 4.0的用戶模式改變到IIS 6.0的內核模式標志著新一代IIS服務器的誕生。
在Win 2K和NT 4.0中,IIS在用戶模式下運行。運行在用戶模式下的應用程序不直接與硬件通信,它們直接調用的是一些標准過程,這些標准過程或者將數據傳入內核模式的組件(例如網卡驅動程序,圖形子系統),或者調用內核模式組件的函數,以此完成保存文件、設置IP地址、將HTML文件發送到網絡之類的任務。
用戶模式和內核模式之間的轉換是一項開銷很大的操作,服務器首先從內核模式的TCP/IP棧將傳入的HTTP請求傳遞給用戶模式的Winsock,由Winsock將請求傳遞給IIS。從內核模式到用戶模式的切換很快發生,但不可避免地給處理過程帶來瞬間的延遲。當負載較大時,這種延遲不斷累加,同時由於這種轉換是必不可少的,所以管理員根本沒有辦法優化處理過程。
IIS 6.0的https.sys內核模式驅動程序極大地減少了用戶模式和內核模式之間的切換次數。http.sys監聽著HTTP請求,決定由哪一個用戶模式的進程來處理該請求,或者是否由驅動程序本身返回用戶請求的內容。
IIS 6.0在用戶模式下運行,完全依賴內核模式的http.sys作為接收用戶請求的服務器引擎。因此,http.sys必須能夠在任何時候作出相應,必須具有極高的可靠性。用戶代碼可能導致進程出錯,所以微軟把http.sys設計成不執行任何用戶代碼,這樣,即使應用程序出現了故障,也不會影響到IIS 6.0本身,IIS 6.0仍能夠照常監聽HTTP請求。
如果要從內核模式的緩沖區返回靜態的應答,一個高速的、內核模式的、不允許運行應用程序代碼的HTTP處理器是十分理想的,它減少了切換到用戶模式的昂貴開銷,能夠從內核模式的緩沖區快速返回應答。IIS 6.0的http.sys就管理著這樣一個緩沖區,而且使用了高度優化的啟發式緩沖區算法來確定哪些內容要放入緩沖區,例如,http.sys可能只緩沖那些出現了一次以上請求的內容。
由於http.sys直接從應答緩沖區提取靜態內容,不必再切換到用戶模式,所以與IIS 5.0的性能相比,IIS 6.0的整體性能有了顯著提升。根據微軟的資料顯示,WebBench基准測試表明IIS 6.0返回靜態內容的速度要比IIS 5.0快150%。即使以IIS 5.0的隔離模式運行IIS 6.0服務器(這時,IIS 6.0的體系結構與IIS 5.0的相似),同樣也能從http.sys驅動程序的應答緩沖區和其他改進之處獲益。
另外,微軟在http.sys驅動程序中采用了許多優化的算法,使其能夠將請求直接轉發到適當的工作進程。在IIS 4.0和IIS 5.0中,必須通過多個步驟才能確定進程的哪一個實例擁有了應當接收當前請求的Web應用,但在IIS 6.0中,http.sys注冊了所有IIS 6.0應用,賦予每一個進程一個句柄,IIS內部利用這些句柄來標識注冊的應用程序要用到的一個或多個名稱空間。因此,當http.sys接收到一個HTTP請求,它能夠很快地將請求從內核模式的http.sys傳遞到正確的用戶模式的Web應用。
http.sys驅動程序還要執行其他一些任務,其中包括:
⑴ 將傳入的URL與各種長度、格式方面的規則進行比較。
⑵ 管理傳入請求的隊列。
⑶ 擔負著記錄IIS Web網站日志信息的任務(從而提高了記錄日志的性能)。
⑷ 實施帶寬限制策略以及支持TCP/IP級的管理。
⑸ 實現客戶證書請求服務(但不支持安全套接字層——SSL)。
由於http.sys是一個操作系統的驅動程序,而不是一個IIS組件,因此該驅動程序的配置在注冊表而不是IIS配置數據中進行。當前,還有許多http.sys的注冊表設置項目尚無正式的說明文檔,它可能意味著微軟不鼓勵用戶修改這些設置,因為這些設置項目將來可能會有變化。http.sys驅動程序的注冊表設置項目位於HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP下面,在這裡可添加各種注冊鍵(默認配置中不包含這些注冊鍵),諸如:
⑴ EnableNonUTF8:如果加入EnableNonUTF8子鍵,並將它的值設置成0,http.sys只接受UTF-8編碼的URL。UTF-8的全稱是Universal Character Set(UCS)Transformation Format 8,這是一種字符集標准,標准全文http://www.ietf.org/rfc/rfc2279.txt,它允許使用多國語言的字符集。默認情況下,EnableNonUTF8的值是1,表示IIS接受UTF-8、ANSI、雙字節字符集(DBCS)編碼的URL。
⑵ PercentUAllowed:當這個子鍵設置成1時(默認值),http.sys認可那些部分字符用%uNNNN表示的URL,其中NNNN是一組表示實際字符的數字。當PercentUAllowed設置成0時,IIS 6.0將拒絕那些部分字符用這種方式表示的URL。
%uNNNN是一種不太常用的Unicode符號,不要將它與常見的UTF-8表示形式混淆。在UTF-8表示形式中,%20表示一個空格,例http://www.iisanswers.com/new article.htm相當http://www.iisanswers.com/new%20article.htm,兩者之間的轉換由IE浏覽器自動完成,不管EnableNonUTF8和PercentUAllowed設置成了什麼值,IIS 6.0都會接受。
這兩項設置,再加上其他可以在IIS 6.0文檔中找到的設置項目,從一個側面反映了IIS 6.0在URL解析方面的改進。在IIS 5.0中,一些重大的安全問題與Web服務器解析URL的方式有密切的關系,現在微軟終於解決了原先存在的缺陷,同時作出了一些改進,允許管理員更加明確地定義IIS 6.0解析URL的規則。在天生具有國際化特點的Internet上,多國語言並存,這些改進之處尤其具有重要意義。
關於Unicode的更多信息,請參http://www.unicode.org;關於IIS 5.0缺陷的更多信息,請參見 http://www.wiretrip.net/rfp/p/doc.asp/i5/d57.htm。在Windows Server 2003 Resource Kit中可以找到一個幫助配置http.sys的工具。
■ W3Core
默認情況下,IIS 6.0在工作進程隔離模式下運行,如圖五所示。在這種模式中,對於每一個Web應用,IIS 6.0都用一個獨立的w3wp.exe的實例來運行它。w3wp.exe也稱為工
因此,工作進程隔離模式不存在進程內(In-Process)應用程序存在的問題,有效地提高了可靠性和安全性。可靠性的提高是因為一個Web應用的故障不會影響到其他Web應用,也不會影響http.sys,每一個Web應用由W3SVC單獨地監視其健康狀況。安全性的提高是由於應用程序不再象IIS 5.0和IIS 4.0的進程內應用那樣用System帳戶運行,默認情況下,w3wp.exe的所有實例都在一個權限有限的“網絡服務”帳戶下運行,如圖六所示,必要時,還可以將工作進程配置成用其他用戶帳戶運行。
圖六
如果緩沖區溢出攻擊成功入侵了一個Web應用,攻擊者只能訪問當時運行工作進程的帳戶有權訪問的資源,默認的網絡服務帳戶不能寫入Inetpub文件夾,執行權限也極其有限,所以象CodeRed蠕蟲之類的攻擊根本不可能得逞。
某些Web應用,特別是有些Internet Server API(ISAPI)篩選器,在進程外運行時可能會遇到問題。在IIS 5.0和IIS 4.0中,ISAPI篩選器總是在Inetinfo之內運行,它們的設計目標本來就不是在進程外運行,正是由於這個原因,某些篩選器在IIS 6.0的工作進程隔離模式中運行時可能會出現問題——特別地,調用SF_READ_RAW_DATA或SF_SEND_RAW_DATA的篩選器尤其明顯。為此,IIS 6.0還提供了第二種操作模式,稱為IIS 5.0隔離模式。如果ISAPI篩選器不能在工作進程隔離模式下正常運行,在IIS 5.0隔離模式下應該沒有問題。在這第二種操作模式中,應用程序仍舊能夠從IIS 6.0的許多改進中獲益,例如http.sys驅動程序帶來的性能、可靠性的提高。
在IIS 6.0文檔中,可以看到一種叫做“應用程序池”的新特性。一個應用程序池包含一個或者一組工作進程,而且應用程序池是可以命名的。應用程序池可以從下列角度理解:在IIS 5.0中,我們可以將應用程序保護設置為低級(IIS進程)、中級(緩沖池)、高級(隔離),這個功能雖然很有用,但如果我們想要在一個池(一個dllhost.exe的實例)中運行兩個應用程序,在另一個池(另一個dllhost.exe的實例?)中運行另外兩個應用,該怎麼辦?IIS 5.0沒有提供命名dllhost.exe實例的途徑,因而也就不能將兩個特定的應用放入某個池運行。IIS 6.0的應用程序池允許指定名稱,如圖七,通過網站“屬性”對話框的“主目錄”頁,可以方便地將Web網站或目錄放入應用程序池。