SharePoint 【架构系列】-- SharePoint的处理(Process)与执行模型(Trust Model) 01
?
Sharepoint210有四種執行模型:
?
? 1、完全信任執行模型(Full Trust)
?
? 2、Bin/CAS 執行模型 (1與2都屬于場解決方案)
?
??3、沙盒執行模型(Sand Box)
?
? 4、 混合執行方法(Hybrid Approach)
?
?Sharepoint最簡單的處理模型就是一個完整的Asp.net應用程序處理模型,但由于Sharepoint2010中引入了沙盒處理方式,所以使得處理場景變得復雜。
?
?? 這里我們從一個Http請求開始,來看看Sharepoint的處理過程以及其執行信任模型。
?
?一、由HTTP.SYS到對應的應用程序池(Application Pool)
?
???當一個Http請求(Http Request)到達Sharepoint的前端 Web 服務器(Front-End Web Server)時,前端 Web 服務器(Front-End Web Server)上的HTTP.SYS就會偵測到有Http Request到來,于是對其進行分析判斷,看看這個Request請求的是哪個網站 (Website),這個網站 (Website)運行在哪個應用程序池(Application Pool)中,并把它提交到對應的應用程序池(Application Pool),如下圖:
?
?
?? HTTP.SYS是Web服務器上用于接收Http請求的偵聽器, 它是一個位于Windows中的操作系統核心組件,能夠讓任何應用程序通過它提供的接口,以http協議進行信息通訊。從外部來的所有的Http服務請求會在Http.sys里暫存入隊列,即使服務程序重啟,尚未被處理的請求也不會丟失.
?
二、Http Request被應用程序池內的IIS工作進程(W3WP)接管并處理
?
?? 當Http Request到達了應用程序池,便交IIS工作進程(Worker Process)繼續處理。
?
?? IIS工作進程(W3WP) 是IIS應用程序的宿主, 我們在任務管理器中可以查看到它。
?
???????
?
???? 它的主要任務就是對到來的HttpRequest進行處理,處理內容包括對Request的Session, ViewState,Cache的維護以及Request所請求的各種資源的分配等等。
?
2.1.1 IIS工作進程(W3WP)的創建
?
??? W3WP這個工作進程是由Windows Activation Service (WAS: Windows 進程激活服務)進行創建并管理的,Windows 進程激活服務管理的不僅是W3WP,它還負責管理應用程序池的配置(application pool configuration)以及與Http或與其它協議(protocol)相關的工作進程(Worker Process)的創建與生命周期的管理。
?
??????
?
???? 所以,當有Http請求(Http Request)進入時,WAS就會創建一個W3WP工作進程。但當你關閉了web網頁,由于http是無連接的訪問,它不會返回相應的關閉信息,所以W3WP這個進程不會因為你關閉了web應用程序爾關閉。但系統在應用程序池的配置中,默認的是20分鐘,你也可以設定你指定的時間,那么在這個時間范圍內沒有在訪問應用程序,那么系統會自動的關閉w3wp這個進程.而不需要我們人為的干預。
?
2.1.2關于應用程序池
?
???? 我們可以把應用程序池看成一個容器。它是將一個或多個應用程序鏈接到一個或多個工作進程集合的配置。因為應用程序池中的應用程序與其他應用程序被工作進程邊界分隔,所以某個應用程序池中的應用程序不會受到其他應用程序池中應用程序所產生的問題的影響
?
2.1.3 應用程序池與W3WP的關系
?
?? ? 對于 IIS,可能存在若干個應用程序池,而通常每個應用程序池都會創建一個 W3WP進程。 但是, 并不是所有情況都是一個應用程序池對應一個 W3WP進程。 Web Garden , 或者一些異常發生時候,就會一個 應用程序池對應多個 W3WP進程。
?
?? ? Web Garden 指的是一個應用程序可以在多個進程(w3wp)中來執行,一次請求使用其中的一個。用這個的主要目的是提高程序的可用性。當其中一個進程發生錯誤,那么也不會影響其他進程。發生錯誤的進程可以根據規則關閉,而其他的進程則可以繼續工作。
?
?? ? 而至于異常,則是指由于應用程序池會在沒有請求的時候定時回收,但在發生錯誤的時候,會自動重新建立一個處理進程( W3WP進程)
?
2.1.4 W3WP工作進程標識(Worker Process Identity - WPI)
?
???? 在W3WP工作進程運行時需要有明確的身份,這個身份就叫作工作進程標識(Worker Process Identity - WPI) 。服務器并沒有提供一個直接的手段來設置工作進程在什么身份標識下運行, 而是通過應用程序池的身份標識設定來實現的.
?
???? 在IIS6, Windows 2008 IIS7下, 默認關聯權限是NetworkService.
?
???? 在Windows 2008 R2 IIS7.5下, 默認是關聯權限是Application Pool Identity(應用程序池標識帳戶). 在稍后我們還要具體說明。
?
???? 在運行時IIS會將應用程序池(Application Pool)的身份(即: 應用程序池標識API)注入到Worker Process中, 就會以應用程序池的身份運行. 可以認為應用程序池與其包含的Worker Process的運行身份是一致的。
?
2.1.5 應用程序池標識(Application Pool Identity -API)
?
??? 前面提到了應用程序池標識,應用程序池標識是運行應用程序池的工作進程所使用的服務帳戶名稱。
?
??? 在IIS6, Windows 2008 IIS7下, 應用程序池標識默認關聯權限是NetworkService.
?
??? 在Windows 2008 R2 IIS7.5下, 應用程序池默認是關聯權限是Application Pool Identity.
?
??? 需要特別注意的是,這里的Application Pool Identity是指的應用程序池標識帳戶,它屬于應用程序池標識(Application Pool Identity -API)的關聯帳戶的一種,雖然它們的英文拼寫一樣,但卻是不同的兩個概念,即一個是指的標識,一個是指的帳戶,我們可以從Application Pool的Advanced Setting中看到下圖, 從此圖中我們可以看到二者的區別。
?
?
???? 從上圖我們可以看出,應用程序池標識(API)可以設置為許多類型的帳戶(Local Service, Local System, NetworkService, 應用程序池標識帳戶<Application Pool Identity> 以及 用戶自定義帳戶)。
?
?? 2.1.6 W3WP的服務帳戶(Service Account)
?
??? 服務帳戶(Service Account)是Windows服務器為運行于其上的程序提供的帳戶,它的作用就是通過提供安全上下文(Security Context)來為訪問者提供在本系統中有效的安全屬性或規則集合。我們既可以在Active Directory下創建基于域的Service Account,也可以在本機創建基于本地的Service Account。
?
2.1.7應用程序池帳戶(Application Pool Account)
?
??? IIS中的W3WP進程也和其它所有程序或進程一樣,必須在特定的Service Account下運行,這個Service Account就是應用程序池帳戶(Application Pool Account)。當你在IIS中創建一個應用程序池時,Windows 進程激活服務(WAS)就會自動為你創建一個應用程序池帳戶(Application Pool Account),這個帳戶通常是Sharepoint服務器場帳戶,因此該進程(W3WP)具有 SharePoint 資源的讀寫權限。在多服務器服務器場上,服務器場帳戶通常是域用戶(Domain User)。該帳戶是訪問內容數據庫(Content Database)的同一帳戶
?
??? 所以,從上面的描述我們可以看出應用程序池帳戶(Application Pool Account)其實就是我們前面講到的W3WP工作進程標識(Worker Process Identity - WPI)與應用程序池標識(Application Pool Identity -API)所關聯的帳戶。它只是網上不同的文章從不同的角度抽象出的這個概念而已。換句話說,應用程序池帳戶(Application Pool Account)就是應用程序池標識(Application Pool Identity -API)或W3WP工作進程標識(Worker Process Identity - WPI)所關聯的帳戶,它們都屬于服務帳戶(Service Account)。
?
我們前面提到,在IIS7.5中(僅win7,win2008 SP2,win2008 R2支持),應用程序池的運行帳戶(Application Pool Account),除了指定為LocalService,LocalSystem,NetWorkService這三種內置帳戶外,還新增了一種ApplicationPoolIdentify(應用程序池標識帳戶),下面分別說明這些內置帳戶:
?
- ApplicationPoolIdentity帳戶(應用程序池標識帳戶) : IIS7.5在默認情況下,選擇"應用程序池標識"帳戶。此帳戶對于您的應用程序來說是最安全的,因為這個賬戶的權限很低, 只屬于 IIS_IUSRS 用戶組 ,ApplicationPoolIdentity 這個帳戶是一個"虛擬"帳戶,說它是虛擬的,是因為在用戶管理里看不到該用戶或用戶組,在命令行下輸入net user也無法顯示,但該帳號又是確實存在的。事實上Application Pool Identity只是一個統稱, 并不存在實際的這個命名. 他依賴你的Application Pool的名稱, 例如有一個Application Pool名字叫做: DefaultAppPool, 那么這個虛擬標識的全名是: IIS AppPool\ DefaultAppPool運行在此Application Pool下的Worker Process從任務管理器中可以看到w3wp是在DefaultAppPool這個用戶下運行的.
?
你可以在文件系統中對這個帳戶分配權限. 這么做的好處是能夠將權限分離開來做粒度更細的配置, 不像是NetworkService有很多應用基于此, 設置一個權限影響一大片。如果你的程序需要訪問本地文件系統 (比如日志輸出) , 就需要為 ApplicationPoolIdentity 賬戶設置 NTFS 權限, 這個賬戶在安全對話框是找不到的, 只能手工輸入 IIS APPPOOL\{app pool name} 進行設置。
- LocalService "本地服務"帳戶是用戶組的成員之一,它擁有與"網絡服務"帳戶(NetworkService)相同的用戶權限,但僅限于在本地計算機上使用。當應用程序池中的工作進程不需要訪問它所運行在的 Web 服務器以外的內容時,可以使用此帳戶。
- LocalSystem "本地系統"帳戶擁有所有用戶權限,它是 Web 服務器上的管理員組的成員之一。Local System 帳戶是一個有權訪問整個系統(包括域控制器上的目錄服務)的功能強大的帳戶。如果某個服務登錄到域控制器上的 Local System 帳戶,則該服務有權訪問整個域。默認情況下,某些服務將配置為登錄到 Local System 帳戶。不要更改默認的服務設置。應盡可能避免使用"本地系統"帳戶,因為它會給 Web 服務器帶來更嚴重的安全風險。
- NetworkService "網絡服務" 帳戶是用戶組的成員之一,并擁有運行應用程序所需的用戶權限。通過使用計算機帳戶的憑據,它可以在整個基于 Active Directory 的網絡上進行交互。 在IIS 6.0 與IIS 7 中,工作進程默認運行于此類型,它是Window內建的Identity。它不需要密碼并且僅擁有用戶權限。
?
???? 應用程序池帳戶(Application Pool Account)設置好后,會被自動加入到Sharepoint Farm內的每個服務器(Server)上的WSS_WPG、WSS_ADMIN_WPG或IIS_USERS這三個組的成員(Member)中,或者換過來說,這三個組都擁有應用程序池帳戶(Application Pool Account)。
?
??? 下面分別看看Sharepoint Farm內的這三個組:
?
????? WSS_WPG組具有對本地資源的讀取訪問權限,除了Application Pool Account它還擁有LOCAL SERVICE, NETWORK SERVICE (如果Application Pool Account使用的不是它們)等帳戶。
?
????? WSS_ADMIN_WPG 組也具有對本地資源的讀取訪問權限,除了擁有Application Pool Account,它還擁有 Builtin\Administrators, NETWORK SERVICE, Sharepoint Farm admin以及Timer services等帳戶
?
????? IIS_IUSRS Group 組:這是IIS7的內置組,用于代替IIS6中的IIS_WPG 組。默認它會擁有適當的權限來運行Worker Process. 所有的工作進程標識(Worker Process Identity - WPI)下的運行帳戶均被隱式的自動加入到這個組中, 以獲得最小的運行權限. 例如當你將MyAppPool這個Application Pool的運行身份設置為Application Pool Identity, 那么IIS AppPool\MyAppPool這個用戶會被自動加入到IIS_IUSRS組中擁有他的全部權限. 因此對此組權限賦值需很小心很容易不知不覺中影響一大片.同時在IIS7中,它還使用內置的IUSER帳戶來代替以前IIS6中的IUSR_MachineName帳戶。IUSR是一個匿名帳戶,雖然它是一個匿名帳戶并且沒有密碼, 但他屬于authenticated users ,而authenticated users屬于Users組, 因此IUSR默認具備了Users組的權限
?
??
?
??? 在SQL Server數據庫方面,應用程序池帳戶(Application Pool Account)還需要以下權限配置設置
?
???? 1.為 Web 應用程序的應用程序池帳戶分配內容數據庫(content database)的 db_owner 角色。
?
???? 2.為此帳戶分配與服務器場配置數據庫關聯的 WSS_CONTENT_APPLICATION_POOLS 角色。
?
???? 3.為此帳戶分配與 SharePoint_Admin 內容數據庫關聯的 WSS_CONTENT_APPLICATION_POOLS 角色。
?
???? 此外,應用程序池帳戶(Application Pool Account)還有別于服務器場管理員帳戶(Farm Administration Account),后者除了前者所屬的WSS_WPG、WSS_ADMIN_WPG、IIS_USERS這三個組外,還包含在WSS_RESTRICTED_WPG_V4以及Performance Monitor User這兩個組中。
?
???? 但應用程序池帳戶也有例外,如: SharePoint 管理中心網站(Central Administration Web Site)的應用程序池標識所用帳戶與Windows SharePoint Services 定時服務的進程帳戶"不是"應用程序池帳戶(Application Pool Account),而是服務器場帳戶,此帳戶也稱為數據庫訪問帳。
?
???? 簡單總結:SharePoint 是一個 ASP.NET 應用程序,它與 ASP.NET 應用程序類似,當前端 Web 服務器收到某個 HTTP 請求時,特殊的驅動程序(即 HTTP.SYS)將檢測該請求,并將其路由到處理目標 IIS 網站和目標 SharePoint Web 應用程序的請求的應用程序池。每個應用程序池均有一個 IIS 工作進程 (w3wp.exe)用于執行每個請求的請求管道,此工作進程需要設置應用程序池帳戶(Application Pool Account, 這通常是服務器場帳戶,因此該進程具有 SharePoint 資源的讀寫權限。在多服務器服務器場上,服務器場帳戶通常是域用戶。該帳戶是訪問內容數據庫的同一帳戶),而應用程序池帳戶可以設置為LocalService,LocalSystem,NetWorkService以及 ApplicationPoolIdentify這些內置帳戶,也可以設置用戶自定義帳戶,然后Sharepoint會把這個帳戶設置到Farm內每個服務器上的WSS_WPG、WSS_ADMIN_WPG或IIS_USERS這三個組中,同時應用程序池帳戶還會具備SQL Server數據庫方面的權限以訪問Sharepoint的數據庫內容(eg:Content Database)。
?
???? 進入IIS 工作進程(IIS Worker Process)的階段是Sharepoint的四種執行模型都必須經過的處理階段。場解決方案與任何 ASP.NET 應用程序一樣是在 IIS 工作進程(w3wp)中運行。而沙盒解決方案卻在具有特殊限制的執行環境中運行(這對于阻止未授權或性能不佳的代碼減慢應用程序池的速度或導致應用程序池發生崩潰很重要。因此,SharePoint 將對可在沙盒解決方案中執行的代碼施加限制)。當請求嘗試訪問沙盒解決方案時,IIS 工作進程(w3wp)將會把工作交給在它內部運行的 SharePoint 執行管理器(Execution Manager),由執行管理器(Execution Manager)負責查找沙盒工作進程(SPUCWorkerProcess.exe)(如果未運行任何沙盒工作進程,則啟動一個沙盒工作進程)。沙盒工作進程就是負責運行沙盒解決方案代碼的進程
?
轉載:http://www.cnblogs.com/wsdj-ITtech/archive/2012/11/06/2544118.html
轉載于:https://www.cnblogs.com/greeny/archive/2013/02/19/2917197.html
總結
以上是生活随笔為你收集整理的SharePoint 【架构系列】-- SharePoint的处理(Process)与执行模型(Trust Model) 01的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java jdbc中的date,大文本等
- 下一篇: 用键盘上下左右键和ctrl键移动Tree