1. 程式人生 > >web伺服器、Apache 和 tomcat 關係的理解

web伺服器、Apache 和 tomcat 關係的理解

以一次JSP請求響應為例,講解伺服器,Apache、Tomcat之間的關係。

  • 帶著這樣一個概念去看:Apache與Apache Tomcat(簡稱Tomcat)都是可以獨立執行的伺服器。你平時見到的apache-tomcat-7.0.72實際上只是Tomcat伺服器。此處整合了Apache和Apache Tomcat。Apache用來處理靜態資源,減少Tomcat的服務開銷。

先來個熱身

一個請求到發出到響應返回的全過程 
HTTP請求到響應

  • 首先,客戶端發出一個請求 
    看到瀏覽器上的URL地址了麼,那就是你的請求的主要內容。請求以一串文字的形式傳送,例如http://www.baidu.com代表按照http協議獲取www.baidu.com

    這個資源(關於資源的概念請參見URI和URL)。當然實際上你的請求不是這麼寫的,這麼寫只是為了讓你有一個直觀的感受,具體請參見HTTP協議

  • 第二步,伺服器(硬體)收到這個請求,也就是那一串文字。 
    伺服器的概念之一就是一臺電腦。你提交的請求會被髮送到這臺電腦上。 
    顯然啊,伺服器就是一臺電腦,沒有軟體的話它是無法識別請求並做出響應的

  • 第三步,伺服器(硬體)將請求交付給伺服器(軟體,例如Apache就是一個常用的伺服器軟體)。 
    假設請求的是一個動態頁面(動態頁面就是需要動態生成的頁面,例如QQ空間,每人每時每刻都不同,需要動態生成),在本例中是JSP,那麼apache則會將請求繼續轉給下一個部分

  • 第四步,伺服器(軟體)將請求交給Tomcat 
    因為Apache本身不提供動態頁面訪問能力的,所以對jsp的支援要靠其他的東西來實現,這個東西類似於外掛(但嚴格來說Tomcat並不是Apache的一個外掛)。在本例中,這個外掛就是Tomcat。要注意:Tomcat本身也是可以單獨作為伺服器來執行的。Tomcat 有時也被稱為Apache Tomcat,這個Apache指的並不是Apache伺服器,而是一個“商標”,因為Tomcat是屬於Apache這個專案的 
    Tomcat是一個執行環境,或者叫容器。Tomcat負責例項化jsp並且處理請求(通俗的講就是“執行”jsp,搞到對應的響應資訊),並且返回一個響應到apache,apache則繼續將響應返回到客戶端。

  • 至此,一個響應完成

熱身,again

以上內容說白了就是輸入和輸出,給定一個輸入,產生一個輸出。根據這個,我們來模擬下web的進化史。

  • 最初,人們的需求很低,只要求能夠有靜態頁面就好了。 
    舉個例子,例如要做一個公告網頁,上面公示每天的重要通知。怎麼做呢?好辦啊! 
    我們用一個簡化的輸入輸出來表示,只要你輸入“公告”,我就輸出“2017-3-26 XXX寫下了第一篇關於幾個概念的理解的部落格”,不要想得太多,就是一個標準輸入,標準輸入。 
    用Java寫很簡單,寫成一個控制檯標準輸入輸出就好了。用偽程式碼表示如下,
  1. if(輸入=“公告”) then

  2. print “2017-3-26 XXX寫下了一篇關於幾個概念的理解的部落格”

  • 1
  • 2

這就是滿足了需求,就這麼簡單,然後將他改成網路IO就好了。

  • 要是公告變了怎麼辦?好辦,將print “2017-3-26 XXX寫下了第一篇關於幾個概念的理解的部落格”該掉就好了。也就是說,只要資訊變動,你就要重寫訊息源,改動原始碼。很蠢是吧。這還好說,要是生成的像QQ空間那樣的頁面怎麼搞?好辦!套模板啊。一個頁面變動的只是少數,有很大一部分是不變的。想填空題一樣,將空填起來就好了,像這樣
  1. date = "2017-3-26"

  2. name = "一隻準程式設計師"

  3. about = "幾個概念的理解"

  4. if(輸入=“公告”) then

  5. print date + name + “寫下了一篇關於" + about + "的部落格”

這幾個變數完全可以從資料庫中自動獲取。也就是說,只要更新資料庫,然後頁面就會自動更新了。雖然還是很蠢,但是動態頁面就是這個原理。

(你寫JSP不就是填空嗎,在模板上填空。${name}這樣的不就是“空”嗎)

  • 總結下,Apache負責請求轉發&&靜態頁面處理,Tomcat來處理動態頁面解析

現在,進入正題

概念闡述

藉助以上過程和概念,來談一談伺服器、Apache、Tomcat之間的關係

  • 伺服器 
    經過以上過程,這個概念很熟了吧,有兩個主要概念 
    • 硬體:一臺電腦。這臺電腦上執行著至少一個伺服器軟體,能夠處理請求
    • 軟體:一個提供網頁的伺服器程式。處理請求並返回響應
  • Apache 
    Apache就是一個伺服器(軟體),提供了靜態頁面的訪問能力。它配置上外掛(模組)後可以以各種語言實現動態頁面。(但是一定要注意Tomcat並不是Apache的外掛)
  • Tomcat 
    Apache Tomcat(即平時所說的Tomcat),也是一個伺服器。在這個案例中,Tomcat充當了一個外掛的作用,這個外掛是針對於Java的,或者說是jsp/servlet的。它是一個容器。何為容器?容器麼,就是容器。容的是什麼,JSP、Servlet。容器管理jsp、servlet的宣告週期,包括建立,執行,銷燬。它是一個jsp、servlet的執行環境。通俗點說,請求發過來,Tomcat負責執行JSP、Servlet,並返回結果。關於生命週期這東西,在此不做闡述。也就是說,沒有Tomcat,Apache是不認你JSP的。懂設計模式的可以想想了。。。當然,整個過程都有設計模式的影子

Apache與Tomcat比較聯絡

  • apache支援靜態頁,tomcat支援動態的,比如servlet等。

  • 一般使用apache+tomcat的話,apache只是作為一個轉發,對jsp的處理是由tomcat來處理的。

  • apache可以支援php\cgi\perl,但是要使用java的話,你需要tomcat在apache後臺支撐,將java請求由apache轉發給tomcat處理。

  • apache是web伺服器,Tomcat是應用(java)伺服器,它只是一個servlet(jsp也翻譯成servlet)容器,可以認為是apache的擴充套件,但是可以獨立於apache執行。

  • 共同點

    1. 兩者都是apache組織開發的
    2. 兩者都有HTTP服務的功能
    3. 兩者都是免費的
  • 不同點: 
    1. Apache是專門用了提供HTTP服務的,以及相關配置的(例如虛擬主機、URL轉發等等)
    2. Tomcat是Apache組織在符合J2EE的JSP、Servlet標準下開發的一個JSP伺服器