作(zuò)者:程序君來(lái)源:Web編程開發
我們知道,不同膚色的人(rén)外貌差别很大(dà),而雙胞胎的辨識很難。有意思的是Web服務器/Web容器/Web應用程序服務器/反向代理(lǐ)有點像四胞胎,在網絡上經常一起出現。本文将帶讀(dú)者對這四個相(xiàng)似概念如(rú)何區分(fēn)。
一文看(kàn)懂(dǒng)web服務器、應用服務器、web容器、反向代理(lǐ)服務器區别與聯系
反向代理(lǐ)基本概念
反向代理(lǐ)基本工(gōng)作(zuò)原理(lǐ)
總結
Web服務器概念與基本原理(lǐ)
Web服務器的曆史
1989年(nián),互聯網之父Berners-Lee向其雇主CERN提出了一個新項目,目的是通過使用超文本系統來(lái)緩解科(kē)學家之間的信息交流。該項目導緻Berners-Lee在1990年(nián)編寫了兩個方案:
一個名爲WorldWideWeb的浏覽器。
世界上第一個網絡服務器,後來(lái)被稱爲CERN httpd,它運行在NeXTSTEP上
在1991年(nián)至1994年(nián)期間,用于通過萬維網沖浪和交換數據的早期技術(shù)的簡單性和有效性有助于将其移植到許多不同的操作(zuò)系統,并将其用于科(kē)學組織和大(dà)學,然後傳播到行業。
1994年(nián),Berners-Lee決定組建萬維網聯盟(W3C),通過标準化過程來(lái)管理(lǐ)涉及的許多技術(shù)(HTTP,HTML等)的進一步發展。
就(jiù)是這台服務器:
Web服務器的主要功能是存儲,處理(lǐ)和傳遞網頁給客戶。客戶端和服務器之間的通信使用超文本傳輸協議(yì)(HTTP)進行。交付的頁面最常見(jiàn)的是HTML文檔,除了文本内容之外,還(hái)可(kě)能包含圖像,樣式表和腳本。
一個用戶代理(lǐ),通常是web浏覽器或web爬蟲,通過發起一個HTTP請(qǐng)求以獲取服務器資源,服務器根據請(qǐng)求返回該資源或由于某種原因響應錯誤消息。該資源通常是服務器輔助存儲上的真實文件(jiàn),但(dàn)這不一定是這種情況,取決于Web服務器的實現方式。
雖然主要功能是提供内容,但(dàn)HTTP的完整實現還(hái)包括從(cóng)客戶端接收内容的方式。此功能用于提交Web表單,包括上傳文件(jiàn)。許多通用Web服務器還(hái)支持使用Active Server Pages(ASP),PHP或其他(tā)腳本語言的服務器端腳本。這意味着Web服務器的行爲可(kě)以在單獨的文件(jiàn)中腳本化,而實際的服務器軟件(jiàn)保持不變。通常,此函數用于動态生(shēng)成HTML文檔(“即時”),而不是返回靜(jìng)态文檔。前者主要用于從(cóng)數據庫檢索或修改信息。後者通常快(kuài)得(de)多,并且更容易被緩存,但(dàn)不能提供動态内容。
Web服務器不僅用于爲萬維網服務。它們也可(kě)以被嵌入到諸如(rú)打印機(jī),路(lù)由器,網絡攝像機(jī)等設備中,并且僅服務于本地網絡。然後,web服務器可(kě)以用作(zuò)用于監視或管理(lǐ)所討(tǎo)論的設備的系統的一部分(fēn)。這通常意味着客戶端計(jì)算機(jī)上不需要安裝其他(tā)軟件(jiàn),因爲隻需要一個網絡浏覽器(現在大(dà)多數操作(zuò)系統都(dōu)包含在内)。
Web服務器工(gōng)作(zuò)原理(lǐ)
HTTP協議(yì)基于TCP協議(yì)上,是一個應用層協議(yì),用于用戶代理(lǐ)和Web服務器進行通信。Web服務器通常采用一問(wèn)一答的方式進行工(gōng)作(zuò):
1、在用戶代理(lǐ)上用戶發起資源請(qǐng)求,請(qǐng)求内容包括但(dàn)不限于:指定資源的唯一标識IRI,指明動作(zuò)類型(GET/POST/DELETE/PUT...)
2、用戶代理(lǐ)解析用戶輸入IRI并從(cóng)中獲取目标域名,交由DNS服務器解析。如(rú)果IRI中指定某IP地址,這無需這步。
3、如(rú)果與服務器的會話(huà)還(hái)沒建立,此時先建立TCP連接,并完成HTTP協商(确定雙方均可(kě)接受的處理(lǐ)方式,包括協議(yì)版本,是否加密,内容格式等等)。
4、用戶代理(lǐ)把請(qǐng)求内容封裝成HTTP數據包向服務器發送。
5、服務器接收到資源請(qǐng)求并以之前協商好的方式解包并處理(lǐ)。
6、服務器請(qǐng)求的資源封裝成HTTP數據包并返回給用戶代理(lǐ)。
接下來(lái)重點說(shuō)說(shuō)服務器端的工(gōng)作(zuò)原理(lǐ)
TCP監聽模塊
服務器監聽某個端口(一般默認是8080端口,用戶可(kě)以設置其他(tā)端口),以建立和用戶代理(lǐ)之間的連接。一旦建立連接,用戶代理(lǐ)的後續HTTP請(qǐng)求将不用再進入監聽模塊。
預處理(lǐ)
此處主要做三件(jiàn)事(shì):1. 從(cóng)TCP報文中獲取HTTP請(qǐng)求報文。2. 根據和用戶代理(lǐ)的協商進行解密,解壓,安全處理(lǐ)等等。3. 根據服務器自(zì)身(shēn)的配置進行安全處理(lǐ),建立會話(huà)狀态等等。
UR路(lù)由
解析URL字符串和動作(zuò)以确定用戶代理(lǐ)請(qǐng)求的資源,根據匹配規則(通常根據正則表達式+後綴)路(lù)由到靜(jìng)态資源處理(lǐ)模塊或動态資源處理(lǐ)模塊。
靜(jìng)态資源處理(lǐ)模塊
負責找到靜(jìng)态資源,比如(rú)HTML/Javascript/CSS文件(jiàn)/圖片/圖像,确定内容是字符流或者字節流,并确定對應MIME,比如(rú)HTML生(shēng)成MIME爲text/html的字符流,mpeg視頻文件(jiàn)生(shēng)成MIME爲video/mpeg的字節流。
動态資源處理(lǐ)模塊
運行業務邏輯處理(lǐ),動态決定返回的資源内容和類型,内容和類型的處理(lǐ)原則同上。
後處理(lǐ)
根據和用戶協商的協議(yì)進行加密,壓縮,安全處理(lǐ)等等。
資源輸出模塊
把處理(lǐ)好的内容和類型封裝成HTTP報文,往TCP連接另一頭的用戶代理(lǐ)發送TCP報文(内容是HTTP報文)。
主流Web服務器
包括Apache、IIS 、Nginx,市場占有率如(rú)下
還(hái)有比較多使用Tomcat,Jetty,WebSphere,WebLogic,Kerstrel等等。
Web應用程序容器概念與基本原理(lǐ)
Web應用程序容器的由來(lái)
Web服務器的出現的标志着WWW時代的帶來(lái),世界變得(de)更加平面化。當初嘗到甜頭的開創者們開始不滿足與在互聯網上獲取靜(jìng)态資源,于是出現了CGI腳本來(lái)動态獲取資源。再後來(lái)網絡發展方向也是朝着增強Web服務器動态獲取資源的能力前進。以下是代表性的動态技術(shù):
随後Web服務器朝着企業級應用方向發展,快(kuài)速的業務變化,迫使Web開發人(rén)員(yuán)面對新的挑戰:如(rú)何快(kuài)速寫出魯棒,可(kě)靠,符合業務需求的程序并順利部署?解決這個挑戰的一個有效的辦法是,創造一個Web程序開發框架(含運行環境,比如(rú)解釋執行JSP,Web API),這個框架解決魯棒性,可(kě)靠性問(wèn)題,提供快(kuài)速開發接口。換言之,開發人(rén)員(yuán)隻需要專注于實現業務本身(shēn),如(rú)有更高的需求還(hái)可(kě)以對框架進行定制和擴展。這個框架的另外一個名字是Web應用程序容器。
Web應用程序容器的基本工(gōng)作(zuò)原理(lǐ)
一般情況下Web應用程序容器是以下構成體(tǐ)系:
注:淺藍色的模塊是實現業務程序的主要使用模塊。
相(xiàng)對于Web服務器,該容器新增或強化了以下模塊:
分(fēn)配線程池資源
容器爲每個請(qǐng)求分(fēn)配一個線程進行處理(lǐ),通常采取線程池的方式高效理(lǐ)由CPU算資源。
封裝Request上下文
一個請(qǐng)求對應一個Request上下文,它主要封裝了用戶請(qǐng)求的主要構成:URL,HTTP請(qǐng)求頭,以及基于請(qǐng)求頭構建的Session,Cookie等對象,方便編程使用。
封裝Response上下文
一個請(qǐng)求對應一個Response上下文,主要用于向用戶代理(lǐ)返回資源。可(kě)以在其中寫入輸出流,或者重定向,或者返回錯誤碼等等。
URL路(lù)由
在容器裡(lǐ),運行開發人(rén)員(yuán)設置不同的路(lù)由匹配規則,比如(rú)讓.HTM返回.HTML,也可(kě)以自(zì)定義.xyz返回.HTML資源。更加靈活的配置可(kě)以參考JAVA MVC或者ASP.NET MVC的配置方案。
動态資源處理(lǐ)模塊
通常在這裡(lǐ)具體(tǐ)的容器和開發語言都(dōu)有自(zì)己的高效開發模型,比如(rú)JAVA的Servlet,ASP.NET的Web Form,MVC。
回收資源
這裡(lǐ)會回收剛才的線程資源,爲了線程複用,除非服務器空閑一般會将線程返回線程池。
可(kě)以看(kàn)出,Web容器本身(shēn)具備了做爲一個Web服務器的功能,事(shì)實上通常實現Web容器功能的服務器就(jiù)是一個Web服務器.比如(rú)Tomcat , IIS ,Jetty。
主流Web容器
包括Tomcat , IIS ,Jetty 。
還(hái)有比較多使用WebSphere,WebLogic等等。
Web應用程序服務器概念及基本原理(lǐ)
在Web服務器發展的同一個時期,應用服務器已經存在并發展很長一段時間了。一些公司爲Unix開發了Tuxedo(面向事(shì)務的中間件(jiàn))、TopEnd、Encina等産品,這些産品都(dōu)是從(cóng)類似IMS和CICS的主機(jī)應用管理(lǐ)和監控環境衍生(shēng)而來(lái)的。大(dà)部分(fēn)的這些産品都(dōu)指定了“封閉的”産品專用通信協議(yì)來(lái)互連胖客戶機(jī)(“fat” client)和服務器。在90年(nián)代,這些傳統的應用服務器産品開始嵌入HTTP通信功能,剛開始要利用網關來(lái)實現。不久後它們之間的界線開始變得(de)模糊了。
同時,web服務器越來(lái)越成熟,可(kě)以處理(lǐ)更高的負載、更多的并發和擁有更好的特性;應用服務器開始添加越來(lái)越多的基于HTTP的通信功能。所有的這些導緻了web服務器與應用服務器的界線變得(de)更窄了。
目前,“應用服務器”和“web服務器”之間的界線已經變得(de)模糊不清了。但(dàn)是人(rén)們還(hái)把這兩個術(shù)語區分(fēn)開來(lái),作(zuò)爲強調使用。
當有人(rén)說(shuō)到“web服務器”時,你(nǐ)通常要把它認爲是以HTTP爲核心、web UI爲向導的應用。當有人(rén)說(shuō)到“應用服務器”時,你(nǐ)可(kě)能想到“高負載、企業級特性、事(shì)務和隊列、多通道通信(HTTP和更多的協議(yì))”。但(dàn)現在提供這些需求的基本上都(dōu)是同一個産品。
下圖描述一個典型的Web應用服務器的結構圖:
從(cóng)上圖中可(kě)以看(kàn)到Web應用服務器包括了Web容器,同時内置了支撐企業應用的事(shì)務,安全,集成,通信,高可(kě)用等等功能,極大(dà)了減少了重複開發量,保障了業務系統快(kuài)速開發和部署,而它本身(shēn)也是一個Web服務器。Web應用服務器可(kě)以選擇使用大(dà)廠(chǎng)的WebLogic和WebSphere這種重量級産品外,也可(kě)以使用類似與Tomcat、jetty這樣的web containner 再加上第三方的框架(spring,hibernate等)來(lái)構建自(zì)己的Application Server;.NET Core平台下可(kě)以選擇IIS, Apache,Nginx 與ASP.NET Core構建。
反向代理(lǐ)概念與基本原理(lǐ)
反向代理(lǐ)基本概念
反向代理(lǐ)是代理(lǐ)服務器的一種。它根據客戶端的請(qǐng)求,從(cóng)後端的服務器(如(rú)Web服務器)上獲取資源,然後再将這些資源返回給客戶端。與前向代理(lǐ)不同,前向代理(lǐ)作(zuò)爲一個媒介将互聯網上獲取的資源返回給相(xiàng)關聯的客戶端,而反向代理(lǐ)是在服務器端(如(rú)Web服務器)作(zuò)爲代理(lǐ)使用,而不是客戶端。客戶端通過前向代理(lǐ)可(kě)以訪問(wèn)很多不同的資源,而反向代理(lǐ)是很多客戶端都(dōu)通過它訪問(wèn)不同後端服務器上的資源,而不需要知道這些後端服務器的存在,而以爲所有資源都(dōu)來(lái)自(zì)于這個反向代理(lǐ)服務器。
互聯網中的請(qǐng)求發送給反向代理(lǐ),反向代理(lǐ)把請(qǐng)求轉發到内網中的服務器。
反向代理(lǐ)的主要作(zuò)用爲:
加密和SSL加速
負載均衡
緩存靜(jìng)态内容
壓縮
減速上傳
安全防火(huǒ)牆
外網發布
突破互聯網封鎖
解決跨域問(wèn)題
反向代理(lǐ)基本工(gōng)作(zuò)原理(lǐ)
一個反向代理(lǐ)服務器的構成和處理(lǐ)過程如(rú)下圖:
左邊淡黃(huáng)色功能模塊對外網報文進行處理(lǐ),右邊灰色功能模塊針對内網報文進行處理(lǐ)
TCP監聽模塊
監聽TCP請(qǐng)求,這裡(lǐ)的請(qǐng)求是指報文内容是某應用層協議(yì)(比如(rú)HTTP,FTP,EMAIL等應用層協議(yì))的請(qǐng)求。至于這裡(lǐ)是否會單獨産生(shēng)一個線程來(lái)開始處理(lǐ),這個由服務器自(zì)己決定,目前最流行的是先入消息隊列然後異步處理(lǐ),這樣能極大(dà)提高代理(lǐ)的吞吐量和穩定性。
匹配被代理(lǐ)服務器
代理(lǐ)服務器根據一個表(存放(fàng)外網url和内網服務器的對應關系,通常需人(rén)工(gōng)進行設置),如(rú)果匹配到則繼續處理(lǐ),否則依據外網協議(yì)返回錯誤信息,比如(rú)HTTP協議(yì)這返回404。
應用負載均衡策略
如(rú)果比較大(dà)型的互聯網應用,爲了整體(tǐ)系統穩定性,解決單點問(wèn)題,需要根據自(zì)定義策略合理(lǐ)的轉發報文給被代理(lǐ)服務器。簡單的策略是哈希分(fēn)發或者随機(jī)分(fēn)發,一般可(kě)以由用戶進行配置和選擇。
預處理(lǐ)
這裡(lǐ)依據協商好的外網應用協議(yì)進行解密,安全,會話(huà),解壓等處理(lǐ)。
新生(shēng)成網絡報文
這裡(lǐ)依據協商好的内網應用協議(yì)生(shēng)成網絡報文,這裡(lǐ)可(kě)能會進行加密,安全,會話(huà),壓縮等處理(lǐ)。
轉發給被代理(lǐ)服務器
把新生(shēng)成的網絡報文發送給内網服務器(可(kě)能是否Web服務器,Ftp服務器,郵件(jiàn)服務器)。
接受網絡報文
接受内網服務器反饋的網絡報文。
預處理(lǐ)
這裡(lǐ)依據協商好的外網應用協議(yì)進行加密,安全,會話(huà),壓縮等處理(lǐ)。
資源輸出模塊
這時生(shēng)成滿足外網應用協議(yì)要求的報文,并發送到外網連接的另一端(用戶代理(lǐ))。
常用的反向代理(lǐ)服務器
它們的名字您一定記得(de):Ngnix,IIS,Apache。
總結
從(cóng)概念上講:Web服務器是提供WWW服務的程序;Web容器是提供給開發者的框架;Web應用程序服務器内容豐富得(de)多,既可(kě)用各廠(chǎng)商通常遵循一定的工(gōng)業标準并自(zì)定義擴展功能而成,也可(kě)以利用開源組件(jiàn)輕量級拼裝打造;反向代理(lǐ)服務器在企業級應用中表現突出,具有解決集中式安全,負載均衡等等優點。如(rú)今這四個概念的邊界越來(lái)模糊,看(kàn)看(kàn)這個表就(jiù)知道了:
軟件(jiàn)名詞
是否Web服務器
是否Web容器
是否Web應用服務器
是否能反向代理(lǐ)
關于Kerstrel是否web容器,有兩種觀點:
1. 由于Kerstrel不提供編寫應用的框架,所以它不是容器;asp.net core才是容器,因爲它提供了開發應用的框架并提供web應用(MVC,Web API)運行環境。
2. Kerstrel提供了運行環境。
非常歡迎大(dà)家提出自(zì)己的有力觀點,幫助我們清晰化這個asp.net core容器概念。
聲明:本網站(zhàn)發布的内容(圖片、視頻和文字)以原創、轉載和分(fēn)享網絡内容爲主,如(rú)果涉及侵權請(qǐng)盡快(kuài)告知,我們将會在第一時間删除。文章(zhāng)觀點不代表本網站(zhàn)立場,如(rú)需處理(lǐ)請(qǐng)聯系客服,電話(huà):0755-22671324。