近觀Web伺服器-認知篇
作者:曹文龍、李維森
在許多使用者看來,一個Web網站的成敗主要在於它所提供的內容和功能,殊不知支援這些內容和功能的Web伺服器才是真正的幕後英雄。據統計,全世界已有500多萬個網站。每個網站的後面都運行著一個Web伺服器,那麼什麼是Web伺服器?它是怎樣工作的?......
從C/S到Web
最早的網路系統是簡單的主機/終端系統,所有的應用程式都由主機完成,終端只是運行伺服器上相應的程式。PC時代的到來,使電腦網路和電腦應用得到了很大的發展,由於PC價格的不斷下降和效能的不斷提高,面向終端的大型主機的應用領域越來越少。特別是網路作業系統如NetWare和Windows NT的興起,以及網路資料庫系統的出現,開闢了網路應用的新模式——C/S(Client/Server-客戶/伺服器)模式。C/S模式是一種兩層結構的系統,第一層是在客戶機上處理表示邏輯與商務邏輯,第二層則是通過網路啟動並執行資料庫等伺服器系統。C/S模式將事務分開進行處理,實現了網路的分散式運算,很長時間裡也協助企業實現了區域網路建設,完善了企業內部業務管理,提高了工作效率。然而C/S模式在系統的整合與維護、操作介面一致性、系統的擴充性等方面都存在明顯的局限性,所以就象主機/終端式網路被C/S模式的網路系統所取代一樣,在Internet/Intranet技術環境裡,也會出現更新的系統模式。
基於Web技術的Internet/Intranet近年來已經得到了廣泛的應用,Intranet是以TCP/IP協議為基礎、以Web為核心的企業內部網,使用者通過低成本、簡單易用的客戶瀏覽器就能隨時隨地到企業的Web網站上查閱自己所需的資料。瀏覽器用戶端操作介面的一致性避免了C/S模式用戶端程式的多樣性,而伺服器端的開放和基於標準的串連方案使企業很方便地通過Internet同外界聯絡;同時,Web資訊動態、互動發布方式從根本上改變了企業的服務品質,增加了企業的商業機會。
在三層結構的Web技術中,資料庫不是直接向每個客戶機提供服務,而是與Web伺服器溝通,實現了對客戶資訊服務的動態性、即時性和互動性。這種功能是通過諸如CGI、ISAPI、NSAPI以及Java建立的伺服器應用程式實現的。1所示。
什麼是Web伺服器(Web Server)
Web技術的獨特之處是採用超連結和多媒體資訊。Web伺服器使用超文字標記語言 (HTML)(HTML-HyperText Marked Language)描述網路的資源,建立網頁,以供Web瀏覽器閱讀。HTML文檔的特點是互動性。不管是一般文本還是圖形,都能通過文擋中的連結串連到伺服器上的其他文檔,從而使客戶快速地搜尋他們想要的資料。HTML網頁還可提供表單供使用者填寫並通過伺服器應用程式提交給資料庫。這種資料庫一般是支援多媒體資料類型的。
Web瀏覽器(Web Browser)是一個用於文檔檢索和顯示的客戶應用程式,並通過超文字傳輸通訊協定 (HTTP)HTTP(HyperText Transfer Protocol)與Web伺服器相連。通用的、低成本的瀏覽器節省了兩層結構的C/S模式用戶端軟體的開發和維護費用。目前,流行的Internet Explorer和Netscape Navigator除提供基本的文檔檢索、顯示和導航特性外,還支援HTML的進階顯示(如表和幀)以及ActiveX、Java、JavaScript等特性。
Web伺服器是怎樣工作的
在許多使用者看來,一個Web網站的成敗主要在於它所提供的內容和功能,殊不知支援這些內容和功能的Web伺服器才是真正的幕後英雄。那麼,一個Web伺服器是怎樣工作的呢?
幾年前,當Web伺服器剛剛出現的時候,它所支援的應用只是簡單的HTML檔案和映像的瀏覽,當Web伺服器接到一個對Web頁面的請求,如http://www.ccidnet.com.index.html,就會通過URL(Uniform Resource Locator-統一資源定位器)定位到相應的宿主檔案伺服器上,並找到相應的檔案index.html,然後從宿主檔案伺服器上下載該檔案並通過HTTP協議把它傳輸給Web瀏覽器(Web Browser)。當然,這隻是一個基礎功能,Web伺服器同Web瀏覽器之間的關係遠非這樣簡單。Web應用的最重要的一個擴充是動態內容的引入。例如,Web伺服器可以根據使用者輸入的請求,去直接或間接地建立Web網頁,然後返回給Web瀏覽器。最早實現動態內容應用的方法是通過CGI(Comman Gateway Interface公用網關介面),它對Web伺服器上程式的運行及Web伺服器同Web瀏覽器之間動態內容的傳輸有一個基本的定義。2 所示。
Web應用的另一個進展是HTTPS(HyperText Transmission Protocol, Secure安全超文字傳輸通訊協定 (HTTPS))的出現,這種協議保證了Web伺服器和Web瀏覽器之間的通訊安全,從而使得電子交易成為可能。
Web伺服器同Web瀏覽器之間的通訊是通過HTTP協議進行的,那麼,什麼是HTTP協議?簡單說,HTTP協議是Web瀏覽器和Web伺服器之間的應用程式層協議,它基於TCP/IP協議,是通用的、無狀態的、物件導向的協議。它的作用原理包括四個步驟:
串連:Web瀏覽器與Web伺服器建立串連,開啟一個稱為socket(通訊端)的虛擬檔案,此檔案的建立標誌著串連成功。
請求:Web瀏覽器通過socket向Web伺服器提交請求。
應答:Web瀏覽器提交請求後,通過HTTP協議傳送給Web伺服器。Web伺服器接到後,進行交易處理,處理結果又通過HTTP傳回給Web瀏覽器,從而在Web瀏覽器上顯示出所請求的頁面。
關閉串連:當應答結束後,Web瀏覽器與Web伺服器必須斷開,以保證其它Web瀏覽器能夠與Web伺服器建立串連。
這樣,Web伺服器的處理過程包括了一個完整的邏輯階段:接受串連——產生靜態或動態內容並把它們傳回瀏覽器——關閉串連——接受下一個串連,如此進行下去。可以想象,在訪問者多的情況下,伺服器必然會應接不暇。解決這個問題可以藉助兩種技術:多線程和多進程。Web伺服器支援Unix系統的連接埠監視模組(一種多進程的模式)、多線程、多進程或兩種技術的混合。
有了串連,Web伺服器怎樣向Web瀏覽器提供內容呢?這裡的關鍵是內容必須能為瀏覽器識別並且表現出來。這其中決定如何顯示內容的主要機制是MIME(Multiple Purpose Internet Mail Extension-多用途網際網路郵件擴充)類型,MIME會告訴Web瀏覽器什麼樣的文檔將被發送,而且,這種類型的鑒別並不局限於簡單的圖象文檔和HTML文檔。例如,Apache WebServer 的mine.type設定檔中有370種預設的MIME類型,而且這還不是MIME類型的全部。MIME類型通過與檔案尾碼相關的類型/子類型文法來區分,例如,包含MPEG視頻內容的檔案會有mpeg、mpg或mpe的尾碼。
Web伺服器的作用最終體現在對內容特別是動態內容的提供上,這也是Web伺服器同應用伺服器的根本不同,Web伺服器主要負責同Web瀏覽器互動時提供動態產生的HTML文檔(除了提供HTML文檔服務外,Web伺服器還提供諸如XML格式的應用資料,也就是說,Web伺服器不僅僅提供HTML文檔,還可以在更大的範圍內與各種資料來源建立串連,為Web瀏覽器提供更豐富的內容。)
實現Web動態內容的技術有很多,第一種是CGI,它根據使用者輸入的請求動態地傳送HTML資料。CGI並不是開發語言,它只是能夠利用為它編寫的程式來實現Web伺服器的一種協議。由於每一次對於動態內容的請求都需要啟動一個新的CGI程式,因而會增加Web伺服器的負擔,所以CGI的一個很大的缺陷是容易影響Web伺服器的速度。
Microsoft ASP(Active Server Pages-動態伺服器頁面)技術由嵌入在IIS裡的VBScript解譯器構成,同時它還支援多種指令碼語言,包括JavaScript、PerlScript以及VBScript,以COM為基礎,它可以很容易地訪問其他伺服器的軟體組件。
PHP象JSP和ASP技術一樣是由一套放在HTML文檔裡的附加的代碼標記組成。不同之處是它專為開發Web網頁而用,所以用它開發的應用會比用VBScript或JSP等開發的相應的應用更為簡潔。
今天所有的Web伺服器都支援Perl的加速解決方案。Apache的mod_perl免費解決方案就把Perl嵌入了Apache伺服器。這樣不僅提高了Perl代碼的解釋速度,而且由於mod_perl緩衝作用,代碼的執行效率也會有很大的提高。Mod_perl還同Apache緊密相連,因此Perl開發人員可以象C語言開發人員編寫底層的Apache API程式一樣控制Web伺服器的工作。
在系統運行時,Web伺服器往往要支撐大量而又密集的使用者點擊和對動態內容的需求,所以即使再高檔的伺服器裝置,面對不斷增加的使用者,單位時間內所支援的訪問量也是會有一個限度,尤其是對於動態內容較多的情況,因為動態內容的應用需要頻繁地調用資料庫的資料和應用程式,會佔用大量的伺服器資源。這時就需要在多個伺服器裝置之間或多個網站之間分散伺服器的負載。
負載平衡的方法有很多,最簡單的方法是在不同的伺服器之間分配網站的內容。例如,在一個伺服器上存放靜態HTML頁面,另一個上面存放圖象檔案,而在第三台上運行所有的CGI程式。不過很明顯,這種方法效率不會很高,因為它無法在主機之間實現自動的內容分配,如果其中某一方面的內容過多,仍然會形成負載瓶頸。
DNS負載平衡(Domain Name Server-網域名稱伺服器)的基本方法是把同一網站的不同的拷貝放在相同的物理伺服器上,然後,DNS伺服器可以返回多個IP地址,方法是DNS伺服器既可以返回網域名稱的多個IP地址,也可以對同一個DNS請求返回不同的IP地址。由於難以確定一個用戶端對應的是哪一個IP地址,所以DNS只能提供基本的負載平衡服務。而且,由於DNS請求留在了用戶端和其它的伺服器的緩衝裡,同一個用戶端會繼續訪問同一個Web伺服器。所以就有可能造成一大批頻繁上網的使用者用一個IP地址,而另外較少上網的使用者卻訪問另一個IP地址,從而造成分配不均。還有一個問題是DNS的緩衝並不是持續啟用的,這就可能造成當一個用戶端正在使用一個Web網站時,會結束對該網站其它IP地址的訪問。這會給動態網站帶來問題,特別是對於需要接受並儲存用戶端的資料的情況。
軟、硬體的負載平衡方法與DNS負載平衡相似,但網站只發布一個IP地址,專門設定一台機器接受針對這個IP地址的HTTP請求並把這些請求分發給網站的各個伺服器。這種分發通常發生在TCP/IP路由的層次上,可以透明地把這個單一的源/目標IP地址映射到一個特定的伺服器上。這種技術可以通過軟體或硬體的方式實現。硬體方式的方案效率較高,成本也較高。因為其負載平衡功能可以在Web伺服器之間均衡地分配訪問請求,所以這種方式比DNS方式要好。而且,這種方式可以不斷地監測Web伺服器,如果某一個伺服器出現故障或問題,則可以把請求動態地重新定向到功能相同的伺服器上。
反向 ProxyReverse Proxying也是一種簡便易行的辦法,代理截獲用戶端的請求,把請求轉寄給Web伺服器,再把伺服器的回複傳給用戶端並把內容放入自己的緩衝裡。這樣,同樣內容的訪問就不必直接由伺服器處理,可以在很大程度上減輕伺服器的負擔。
負載平衡是一種橫向擴充伺服器效能的方法,我們還可以通過提高Web伺服器本身效能,即縱向的方法來提高伺服器的效能。最明顯的一種方式是增加伺服器的資源,包括硬碟速度、記憶體和CPU的處理能力。CPU的處理能力對於內容服務很重要,但主要是對動態網站起作用,因為動態網站需要運行相應的程式,需要花費大量的系統資源。單純提高硬碟的存取速度或增加記憶體也是簡單易行的方法。代理的方法前面已介紹過,有一點需要補充的是Web伺服器上的資料同資料庫伺服器或檔案伺服器的資料的儲存結構是不同的,資料庫等的資料結構的設定是為了內容檢索的方便,而Web伺服器的目錄結構則為了便於使用者查看進行最佳化組織,那麼代理的功能之一就是提供這種資料結構的轉化。
最後一方面,很多網站的資訊傳輸都需要SSL加密,然而建立SSL串連需要佔用大量的系統資源,所以還需要採用SSL加速的技術。有很多第三方廠商開發的SSL加速卡產品是不錯的選擇,這些產品價格不貴,而且由於Web伺服器的SSL密鑰通常存在卡上,可以避免非法入侵者從網站上竊取SSL密鑰。
由於Internet/Intranet應用的特點,Web伺服器的安全性同樣是一個關鍵的問題。Web伺服器的安全性有兩個層次,一是資料流的安全,防止被第三方看到或惡意修改;二是內容的安全,即只有經過授權和通過認證的使用者才能看和修改資訊。
我們前面提到過,由“https”打頭的URL利用SSL(現在所說的Tranport Level Security——TLS)演算法,這種演算法的基本原理是在Web伺服器和Web瀏覽器之間建立安全的、加密的串連。這種情況下,SSL保護的是兩種資料,一是發向Web伺服器的資料,例如使用者的姓名和信用卡密碼;二是從Web伺服器檢索的秘密的資料,例如拍賣網站上向使用者傳送的價格資訊等。授權和認證是也是Web伺服器常用的安全技術,實際工作時,Web伺服器會向Web瀏覽器發送一個資訊詢問使用者的名字和密碼並讓使用者填寫,以此確認使用者的正確身份。
通過前面的介紹,我們已經掌握了很多關於Web伺服器的知識。但我們都知道,一個Web應用只有Web伺服器是不夠的,它需要同應用伺服器協同工作,才能完成一個Web網站的功能,那麼Web伺服器同應用伺服器有什麼不同?簡單說,Web伺服器專門用來向瀏覽器提供HTML文檔和圖象資料,Web伺服器上的應用程式也是用來產生HTML文檔和圖象資料的,這一點不同於應用伺服器的應用程式,應用伺服器則只包含應用的商務邏輯,負責處理業務應用,而不包括資料庫和使用者介面程式。
多數情況下,應用伺服器作為三層結構的中介層存在。通常,在三層結構中,其它兩層分別是使用者介面和資料庫/資料存放區。需要說明的是,上述區分只是功能上的,隨著資料標準技術的發展,特別是由於XML的出現,打破了Internet上各種資料擷取協議和開發語言之間的界限,Web伺服器和應用伺服器也都可以處理對方的資料,具有對方的功能。這種情況下,我們在選用伺服器時可能會碰到困難,是選擇Web伺服器還是應用伺服器?是不是用一個伺服器解決兩方面問題就可以了?實際應用中,還是應該把二者區分開來,使它們專註於自己的功能。例如,雖然應用伺服器很容易具有提供Web網頁的功能,但是卻很難給應用伺服器配置所有的Web功能。把兩種服務分開還可以提高兩種伺服器的效能,降低維護的複雜性,例如由於Web伺服器要頻繁而又大量地傳送HTML和圖象資料,所以它們一般都需要較高的I/O速度,而應用伺服器要對資料做大量的處理,因此需要較大的CPU的處理能力。另外,把二者區分開來有助於系統的穩定性,因為二者的效能指標不一樣,所以在調試和配置的時候要求也不一樣,把它們混在一起會增加維護難度。