鏈接:https://www.zhihu.com/question/32212996/answer/87524617
來源:知乎
著作權歸作者所有,轉載請聯繫作者獲得授權。
HTTP服務器本質上也是一種應用程序——它通常運行在服務器之上,綁定服務器的IP地址並監聽某一個tcp端口來接收並處理HTTP請求,這樣客戶端(一般來說是IE, Firefox,Chrome這樣的瀏覽器)就能夠通過HTTP協議來獲取服務器上的網頁(HTML格式)、文檔(PDF格式)、音頻(MP4格式)、視頻(MOV格式)等等資源。下圖描述的就是這一過程:
<img src="https://pic2.zhimg.com/904696074e077934e601f175913f42fd_b.png" data-rawwidth="849" data-rawheight="273" class="origin_image zh-lightbox-thumb" width="849" data-original="https://pic2.zhimg.com/904696074e077934e601f175913f42fd_r.png">
不僅僅是Apache HTTP Server和Nginx,絕大多數編程語言所包含的類庫中也都實現了簡單的HTTP服務器方便開發者使用:
使用這些類庫能夠非常容易的運行一個HTTP服務器,它們都能夠通過綁定IP地址並監聽tcp端口來提供HTTP服務。
Apache Tomcat則是Apache基金會下的另外一個項目,與Apache HTTP Server相比,Tomcat能夠動態的生成資源並返回到客戶端。Apache HTTP Server和Nginx都能夠將某一個文本文件的內容通過HTTP協議返回到客戶端,但是這個文本文件的內容是固定的——也就是說無論何時、任何人訪問它得到的內容都是完全相同的,這樣的資源我們稱之爲靜態資源。動態資源則與之相反,在不同的時間、不同的客戶端訪問得到的內容是不同的,例如:
- 包含顯示當前時間的頁面
- 顯示當前IP地址的頁面
如果想要使用Java程序來動態生成資源內容,使用這一類HTTP服務器很難做到。Java Servlet技術以及衍生的Java Server Pages技術可以讓Java程序也具有處理HTTP請求並且返回內容(由程序動態控制)的能力,Tomcat正是支持運行Servlet/JSP應用程序的容器(Container):
<img src="https://pic3.zhimg.com/2651b72ce2170336d10ad17fd020ae7a_b.png" data-rawwidth="885" data-rawheight="502" class="origin_image zh-lightbox-thumb" width="885" data-original="https://pic3.zhimg.com/2651b72ce2170336d10ad17fd020ae7a_r.png">Tomcat運行在JVM之上,它和HTTP服務器一樣,綁定IP地址並監聽TCP端口,同時還包含以下指責:Tomcat運行在JVM之上,它和HTTP服務器一樣,綁定IP地址並監聽TCP端口,同時還包含以下指責:
- 管理Servlet程序的生命週期
- 將URL映射到指定的Servlet進行處理
- 與Servlet程序合作處理HTTP請求——根據HTTP請求生成HttpServletResponse對象並傳遞給Servlet進行處理,將Servlet中的HttpServletResponse對象生成的內容返回給瀏覽器
雖然Tomcat也可以認爲是HTTP服務器,但通常它仍然會和Nginx配合在一起使用:
- 動靜態資源分離——運用Nginx的反向代理功能分發請求:所有動態資源的請求交給Tomcat,而靜態資源的請求(例如圖片、視頻、CSS、JavaScript文件等)則直接由Nginx返回到瀏覽器,這樣能大大減輕Tomcat的壓力。
- 負載均衡,當業務壓力增大時,可能一個Tomcat的實例不足以處理,那麼這時可以啓動多個Tomcat實例進行水平擴展,而Nginx的負載均衡功能可以把請求通過算法分發到各個不同的實例進行處理
Apache HTTP服務器是一個模塊化的服務器,可以運行在幾乎所有廣泛使用的計算機平臺上。其屬於應用服務器。Apache支持支持模塊多,性能穩定,Apache本身是靜態解析,適合靜態HTML、圖片等,但可以通過擴展腳本、模塊等支持動態頁面等。
(Apche可以支持PHPcgiperl,但是要使用Java的話,你需要Tomcat在Apache後臺支撐,將Java請求由Apache轉發給Tomcat處理。) 缺點:配置相對複雜,自身不支持動態頁面。
2. Tomcat:
Tomcat是應用(Java)服務器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認爲是Apache的擴展,但是可以獨立於Apache運行。
3. Nginx
Nginx是俄羅斯人編寫的十分輕量級的HTTP服務器,Nginx,它的發音爲“engine X”,是一個高性能的HTTP和反向代理服務器,同時也是一個IMAP/POP3/SMTP 代理服務器。
1. Apache與Tomcat的比較
相同點:
兩者都是Apache組織開發的 兩者都有HTTP服務的功能 兩者都是免費的 不同點:
Apache是專門用了提供HTTP服務的,以及相關配置的(例如虛擬主機、URL轉發等等),而Tomcat是Apache組織在符合Java EE的JSP、Servlet標準下開發的一個JSP服務器.
Apache是一個Web服務器環境程序,啓用他可以作爲Web服務器使用,不過只支持靜態網頁如(ASP,PHP,CGI,JSP)等動態網頁的就不行。如果要在Apache環境下運行JSP的話就需要一個解釋器來執行JSP網頁,而這個JSP解釋器就是Tomcat。
Apache:側重於HTTPServer ,Tomcat:側重於Servlet引擎,如果以Standalone方式運行,功能上與Apache等效,支持JSP,但對靜態網頁不太理想;
Apache是Web服務器,Tomcat是應用(Java)服務器,它只是一個Servlet(JSP也翻譯成Servlet)容器,可以認爲是Apache的擴展,但是可以獨立於Apache運行。
實際使用中Apache與Tomcat常常是整合使用:
可以理解Tomcat爲Apache的一種擴展。
2. Nginx與Apache比較
1) nginx相對於apache的優點
輕量級,同樣起web 服務,比apache佔用更少的內存及資源 抗併發,nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高性能 高度模塊化的設計,編寫模塊相對簡單 提供負載均衡
社區活躍,各種高性能模塊出品迅速 2) apache 相對於nginx 的優點 apache的 rewrite 比nginx 的強大 ; 支持動態頁面;
支持的模塊多,基本涵蓋所有應用; 性能穩定,而nginx相對bug較多。
Nginx 配置簡潔, Apache 複雜 ;
Nginx 靜態處理性能比 Apache 高 3倍以上 ;
Apache 對 PHP 支持比較簡單,Nginx 需要配合其他後端用; Apache 的組件比 Nginx 多 ;
apache是同步多進程模型,一個連接對應一個進程;nginx是異步的,多個連接(萬級別)可以對應一個進程; nginx處理靜態文件好,耗費內存少;
動態請求由apache去做,nginx只適合靜態和反向; Nginx適合做前端服務器,負載性能很好;
Nginx本身就是一個反向代理服務器 ,且支持負載均衡
3. 總結
Nginx優點:負載均衡、反向代理、處理靜態文件優勢。nginx處
理靜態請求的速度高於apache;
Apache優點:相對於Tomcat服務器來說處理靜態文件是它的優
勢,速度快。Apache是靜態解析,適合靜態HTML、圖片等。 Tomcat:動態解析容器,處理動態請求,是編譯JSP\Servlet的容
器,Nginx有動態分離機制,靜態請求直接就可以通過Nginx處理,動態請求才轉發請求到後臺交由Tomcat進行處理。