1. 程式人生 > >web伺服器學習體會

web伺服器學習體會

web伺服器其實就是一個應答器,他可以按照預先程式的設計響應客戶端瀏覽器的所有問題。在這個響應的過程中,在網路上使用的是http協議,當然為了安全性後來出現了https協議,而傳輸的內容時符合HTML標準的文件。當前市面上的web伺服器架構很多,比如微軟的iis,Apache、tomcat,nginx等等,其實現的功能都是相似的,只不過實現的具體方法不同。
一 、tomcat的結構圖為:
這裡寫圖片描述
這裡寫圖片描述
二、tomcat處理請求的流程
這裡寫圖片描述
下面以tomcat為例,說說web伺服器是如何實現響應使用者請求的任務的。
假設來自客戶的請求為:
http://localhost:8080/wsota/wsota_index.jsp

  1. 請求被髮送到本機埠8080,被在那裡偵聽的CoyoteHTTP/1.1 Connector獲得
  2. Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應
  3. Engine獲得請求localhost/wsota/wsota_index.jsp,匹配它所擁有的所有虛擬主機Host
  4. Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的預設主機)
  5. localhost Host獲得請求/wsota/wsota_index.jsp,匹配它所擁有的所有Context
  6. Host匹配到路徑為/wsota的Context(如果匹配不到就把該請求交給路徑名為""的Context去處理)
  7. path="/wsota"的Context獲得請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
  8. Context匹配到URLPATTERN為*.jsp的servlet,對應於JspServlet類
  9. 構造HttpServletRequest物件和HttpServletResponse物件,作為引數呼叫JspServlet的doGet或doPost方法
    10)Context把執行完了之後的HttpServletResponse物件返回給Host
    11)Host把HttpServletResponse物件返回給Engine
    12)Engine把HttpServletResponse物件返回給Connector
    13)Connector把HttpServletResponse物件返回給客戶browser

三、tomcat的配置
tomcat的配置在server.xml這個檔案中進行,下面講述這個檔案中的基本配置資訊,更具體的配置資訊請參考tomcat的文件:
server: 1、port 指定一個埠,這個埠負責監聽關閉tomcat的請求
2、shutdown 指定向埠傳送的命令字串
service: 1、name 指定service的名字
Connector (表示客戶端和service之間的連線):
1、port 指定伺服器端要建立的埠號,並在這個斷口監聽來自客戶端的請求
2、minProcessors 伺服器啟動時建立的處理請求的執行緒數
3、maxProcessors 最大可以建立的處理請求的執行緒數
4、enableLookups 如果為true,則可以通過呼叫request.getRemoteHost()進行DNS查

詢來得到遠端客戶端的實際主機名,若為false則不進行DNS查詢,而是返回其ip地址
5、redirectPort 指定伺服器正在處理http請求時收到了一個SSL傳輸請求後重定向的埠號
6、acceptCount 指定當所有可以使用的處理請求的執行緒數都被使用時,可以放到處理

佇列中的請求數,超過這個數的請求將不予處理
7、connectionTimeout 指定超時的時間數(以毫秒為單位)
Engine(表示指定service中的請求處理機,接收和處理來自Connector的請求):
1、defaultHost 指定預設的處理請求的主機名,它至少與其中的一個host元素的name屬性值是一樣的
Context (表示一個web應用程式):
1、docBase 應用程式的路徑或者是WAR檔案存放的路徑
2、path 表示此web應用程式的url的字首,這樣請求的url為http://localhost:8080/path/****
3、reloadable 這個屬性非常重要,如果為true,則tomcat會自動檢測應用程式的/WEB-INF/lib 和/WEB-INF/classes目錄的變化,自動裝載新的應用程式,我們可以在不重起tomcat的情況下改變應用程式
host (表示一個虛擬主機):
1、name 指定主機名
2、appBase 應用程式基本目錄,即存放應用程式的目錄
3、unpackWARs 如果為true,則tomcat會自動將WAR檔案解壓,否則不解壓,直接

從WAR檔案中執行應用程式
Logger (表示日誌,除錯和錯誤資訊):
1、className 指定logger使用的類名,此類必須實現org.apache.catalina.Logger 介面
2、prefix 指定log檔案的字首
3、suffix 指定log檔案的字尾
4、timestamp 如果為true,則log檔名中要加入時間,如下例:localhost_log.2001-10-04.txt
Realm (表示存放使用者名稱,密碼及role的資料庫):
1、className 指定Realm使用的類名,此類必須實現org.apache.catalina.Realm介面
Valve (功能與Logger差不多,其prefix和suffix屬性解釋和Logger 中的一樣):
1、className 指定Valve使用的類名,如用org.apache.catalina.valves.AccessLogValve類可以記錄應用程式的訪問資訊
directory(指定log檔案存放的位置):
1、pattern 有兩個值,common方式記錄遠端主機名或ip地址,使用者名稱,日期,第一行請求的字串,HTTP響應程式碼,傳送的位元組數。combined方式比common方式記錄的值更多

四、Context的部署配置檔案web.xml的說明
一個Context對應於一個Web App,每個Web App是由一個或者多個servlet組成的
當一個Web App被初始化的時候,它將用自己的ClassLoader物件載入“部署配置檔案web.xml”中定義的每個servlet類
它首先載入在$CATALINA_HOME/conf/web.xml中部署的servlet類
然後載入在自己的Web App根目錄下的WEB-INF/web.xml中部署的servlet類
web.xml檔案有兩部分:servlet類定義和servlet對映定義
每個被載入的servlet類都有一個名字,且被填入該Context的對映表(mapping table)中,和某種URL PATTERN對應
當該Context獲得請求時,將查詢mapping table,找到被請求的servlet,並執行以獲得請求迴應。(所以我們自己定義的每一個servlet都應該在web.xml中進行定義和對映)

分析一下所有的Context共享的web.xml檔案,在其中定義的servlet被所有的Web App載入

 <!----------------------------------------------------------------------------------------------->  
  
  
<web-app>  
  
  
  <!-- 概述:  
       該檔案是所有的WEB APP共用的部署配置檔案,  
       每當一個WEB APP被DEPLOY,該檔案都將先被處理,然後才是WEB APP自己的/WEB-INF/web.xml  
       -->  
  
  
  
  <!--  +-------------------------+  -->  
  <!--  |    servlet類定義部分    |  -->  
  <!--  +-------------------------+  -->  
  
    
  
  <!-- DefaultServlet  
       當用戶的HTTP請求無法匹配任何一個servlet的時候,該servlet被執行  
       URL PATTERN MAPPING : /  
       -->  
  
    <servlet>  
        <servlet-name>default</servlet-name>  
        <servlet-class>  
          org.apache.catalina.servlets.DefaultServlet  
        </servlet-class>  
        <init-param>  
            <param-name>debug</param-name>  
            <param-value>0</param-value>  
        </init-param>  
        <init-param>  
            <param-name>listings</param-name>  
            <param-value>true</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
  
  
  <!-- InvokerServlet  
       處理一個WEB APP中的匿名servlet  
       當一個servlet被編寫並編譯放入/WEB-INF/classes/中,卻沒有在/WEB-INF/web.xml中定義的時候  
       該servlet被呼叫,把匿名servlet對映成/servlet/ClassName的形式  
       URL PATTERN MAPPING : /servlet/*  
       -->  
  
    <servlet>  
        <servlet-name>invoker</servlet-name>  
        <servlet-class>  
          org.apache.catalina.servlets.InvokerServlet  
        </servlet-class>  
        <init-param>  
            <param-name>debug</param-name>  
            <param-value>0</param-value>  
        </init-param>  
        <load-on-startup>2</load-on-startup>  
    </servlet>  
  
  
  <!-- JspServlet  
       當請求的是一個JSP頁面的時候(*.jsp)該servlet被呼叫  
       它是一個JSP編譯器,將請求的JSP頁面編譯成為servlet再執行  
       URL PATTERN MAPPING : *.jsp  
       -->  
  
    <servlet>  
        <servlet-name>jsp</servlet-name>  
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>  
        <init-param>  
            <param-name>logVerbosityLevel</param-name>  
            <param-value>WARNING</param-value>  
        </init-param>  
        <load-on-startup>3</load-on-startup>  
    </servlet>  
  
  
  
  <!--  +---------------------------+  -->  
  <!--  |    servlet對映定義部分    |  -->  
  <!--  +---------------------------+  -->  
  
      
    <servlet-mapping>  
        <servlet-name>default</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
  
    <servlet-mapping>  
        <servlet-name>invoker</servlet-name>  
        <url-pattern>/servlet/*</url-pattern>  
    </servlet-mapping>  
  
    <servlet-mapping>  
        <servlet-name>jsp</servlet-name>  
        <url-pattern>*.jsp</url-pattern>  
    </servlet-mapping>  
  
  
  <!--  +------------------------+  -->  
  <!--  |    其它部分,略去先    |  -->  
  <!--  +------------------------+  -->  
  
    ... ... ... ...  
  
</web-app>