1. 程式人生 > >tomcat 與 nginx,apache的區別是什麼

tomcat 與 nginx,apache的區別是什麼

作者:知乎使用者
連結:https://www.zhihu.com/question/32212996/answer/87524617
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
 

題主說的Apache,指的應該是Apache軟體基金會下的一個專案——Apache HTTP Server Project;Nginx同樣也是一款開源的HTTP伺服器軟體(當然它也可以作為郵件代理伺服器、通用的TCP代理伺服器)。

HTTP伺服器本質上也是一種應用程式——它通常執行在伺服器之上,繫結伺服器的IP地址並監聽某一個tcp埠來接收並處理HTTP請求,這樣客戶端(一般來說是IE, Firefox,Chrome這樣的瀏覽器)就能夠通過HTTP協議來獲取伺服器上的網頁(HTML格式)、文件(PDF格式)、音訊(MP4格式)、視訊(MOV格式)等等資源。下圖描述的就是這一過程:


不僅僅是Apache HTTP Server和Nginx,絕大多數程式語言所包含的類庫中也都實現了簡單的HTTP伺服器方便開發者使用:

使用這些類庫能夠非常容易的執行一個HTTP伺服器,它們都能夠通過繫結IP地址並監聽tcp埠來提供HTTP服務。

Apache Tomcat則是Apache基金會下的另外一個專案,與Apache HTTP Server相比,Tomcat能夠動態的生成資源並返回到客戶端。Apache HTTP Server和Nginx都能夠將某一個文字檔案的內容通過HTTP協議返回到客戶端,但是這個文字檔案的內容是固定的——也就是說無論何時、任何人訪問它得到的內容都是完全相同的,這樣的資源我們稱之為靜態

資源。動態資源則與之相反,在不同的時間、不同的客戶端訪問得到的內容是不同的,例如:

  • 包含顯示當前時間的頁面
  • 顯示當前IP地址的頁面

Apache HTTP Server和Nginx本身不支援生成動態頁面,但它們可以通過其他模組來支援(例如通過Shell、PHP、Python指令碼程式來動態生成內容)。
如果想要使用Java程式來動態生成資源內容,使用這一類HTTP伺服器很難做到。Java Servlet技術以及衍生的Java Server Pages技術可以讓Java程式也具有處理HTTP請求並且返回內容(由程式動態控制)的能力,Tomcat正是支援執行Servlet/JSP應用程式的容器(Container):

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的負載均衡功能可以把請求通過演算法分發到各個不同的例項進行處理。