天天看點

三、Nginx伺服器架構初探(3.2 Nginx伺服器的web請求處理機制)

  1. Nginx的與衆不同之處展現在:
    1. 子產品化設計;
    2. 對用戶端請求的并行處理:
      1. 多程序;
      2. 多線程;
      3. 異步;
  2. 多程序方式:
    1. 處理方式:伺服器主程序每接收到一個用戶端時就建立一個子程序,與該用戶端建立連接配接、處理互動,直接連接配接斷開,子程序結束。
    2. 優點:
      1. 實作簡單。
      2. 服務穩定。一個子程序異常,不會影響到其他程序。
    3. 缺點:
      1. 建立子程序系統開銷大。大量并發請求時,會導緻系統性能下降。
    4. Apache實作方式:最初采用多程序方式;後改為程序池方式(初始化時建立一組工作程序,連接配接到來時配置設定一個程序處理該連接配接請求,請求處理結束後,程序不退出,并等待下一個連接配接請求)。
  3. 多線程方式:
    1. 處理方式:伺服器主程序每接收到一個用戶端時就建立一個線程,與該用戶端建立連接配接、處理互動,直接連接配接斷開,線程結束。
    2. 優點:
      1. 系統開銷小。
    3. 缺點:
      1. 多線程共享同一記憶體空間,出錯風險大。
    4. IIS采用該方式實作。
    5. 額外說明:為防止錯誤累積,最好定期檢查和重新開機web伺服器。
  4. 異步方式:
    1. 同步、異步和阻塞、非阻塞:
      1. 概念:
        1. 同步:發送方發送請求後,等待接收方傳回的響應後,才會繼續其他處理。
        2. 異步:發送方發送請求後,不等待接收方傳回響應,就繼續其他處理。
          1. 同步、異步針對的是發送方。
        3. 阻塞:   等待IO調用結果,目前線程挂起,直至IO調用傳回。
        4. 非阻塞:不等待IO調用結果,目前線程可以繼續其他處理。
          1. 阻塞、非阻塞針對的是IO。
      2. 四種組合:
        1. 同步阻塞:
          1. 發送方發送請求後,等待接收方的回應;
          2. 接收方處理請求時,等待IO操作傳回結果,之後對發送方作出響應。
          3. 特點:實作簡單,效率低。
        2. 同步非阻塞:
          1. 發送方發送請求後,等待接收方的回應;
          2. 接收方處理請求時,不等待IO操作傳回結果,轉而處理其他事情;
          3. IO操作結束後,接收方獲得IO結果,并對發送方作出響應。
          4. 特點:實際不使用。原因:接收方沒有有用的事情可做。
        3. 異步阻塞:
          1. 發送方發送請求後,不等待接收方的回應,轉而處理其他事情;
          2. 接收方處理請求時,等待IO操作傳回結果,之後對發送方作出響應。
          3. 特點:實際不使用。原因:接收方處理不過來。
        4. 異步非阻塞:
          1. 發送方發送請求後,不等待接收方的回應,轉而處理其他事情;
          2. 接收方處理請求時,不等待IO操作傳回結果,轉而處理其他事情;
          3. IO操作結束後,接收方獲得IO結果,并對發送方作出響應。
          4. 特點:對于發送方和接收方而言,通信效率最高。
  5. Nginx的處理方式:
    1. 多程序機制 + 異步機制(異步非阻塞方式)。
  6. Nginx伺服器的事件處理機制:
    1. 非阻塞方式中,IO調用如何将自己的工作狀态通知給工作程序?
      1. 周期性檢測IO狀态,不理想。
      2. IO調用結束後主動通知工作程序,使用select/poll/epoll/kqueue等事件驅動模型。
  7. Nginx伺服器的事件驅動模型:
    1. select庫:
      1. 适用平台:Linux、Windows
    2. poll庫:
      1. 适用平台:Linux 2.1.23以上版本。
    3. epoll庫:
      1. 适用平台:Linux 2.6以上版本。
      2. epoll與select(poll)的差別:
        1. select:
          1. 處理過程:
            1. 建立描述符集合,設定關心的事件,将該集合由使用者态賦複制到核心态;
            2. 描述符上設定的關心的事件發生時,将描述符集合由使用者态複制到核心态;
            3. 輪詢該描述符集合,檢查每個描述符是否有相應的事件發生;
          2. 特點:
            1. 頻繁的核心态到使用者态的描述符集合的複制,IO開銷大。
            2. 輪訓描述符集合,IO效率随描述符數量增加而線性下降。
        2. epoll:
          1. 處理過程:
            1. 描述符集合由核心态建立,使用者态設定各個指定描述符的關心的事件;
            2. 描述符集合上有某個描述符發生指定的事件時,核心僅向使用者态發送該描述符的資訊。
          2. 特點:
            1. 避免了核心态到使用者态的描述符集合的複制。
            2. 避免了輪詢整個描述符清單。
    4. rtsig模型:
      1. 适用平台:Linux 2.2.19以上版本。
    5. 以上四種是主要的事件驅動模型,以下三種是特定的Linux平台的事件驅動模型:
      1. kqueue模型:
        1. 适用平台:FreeBSD 4.1、OpenBSD 2.9、NetBSD2.0、MAC OS X。
      2. /dev/poll模型:
        1. 适用平台:Solaris7 11/99、HP/UX 11.22、IRIX 6.5.15、Tru64 UNIX 5.1A。
      3. eventpoll模型:
        1. 适用平台:Solaris10。

繼續閱讀