1. 程式人生 > >Nginx學習-初步理解

Nginx學習-初步理解

請求方式

  • Nginx是一款高效能的web伺服器,能夠同時處理大量的併發請求,主要是得益於Nginx的master-worker程序模式和非同步機制。
    • master-worker模式
      1. nignx伺服器對於接收到的每一個請求,都會有主程序master生成一個工作程序(worker process)處理。工作程序讀取到這個客戶端請求事件後,呼叫後端的I/O進行處理。
      2. 對於worker的程序數量,肯定不是越多越好。因為程序太多,會引發CPU的切換和排程,這樣會浪費資源。通常情況下,worker程序的數量與伺服器CPU的核數相等。這樣做的好處,可以避免過多的worker程序競爭CPU資源。
      3. worker程序之間是相互獨立的,這樣設計就是避免了去競爭同一把鎖的效能開銷。同時一個程序異常退出之後,不影響其他程序正常工作。
    • 非同步非阻塞
      1. worker 程序接收到客戶端請求後,直接呼叫I/O處理,如果不能立即得到結果,就去處理其他事情。I/O處理完成後,會通知worker程序,該worker程序得到通知,暫時掛起當前處理的事物去響應客戶端。

事件驅動

  1. Nignx事件驅動模型主要分為事件收集器,事件傳送器,事件處理器三大部分。其中事件收集器讀取到worker的各種I/O請求後,交給事件傳送器處理,事件傳送器將讀取到的請求傳送給事件處理器進行處理。
  2. 事件處理器是真正負責各種I/O事件的,事件處理器採用多路複用模式設計。
  3. 主要模型關係如下:
    事件驅動模型

    請求原理

    1. nginx採用master-worker程序模式工作,即一個master程序,多個worker子程序。對於客戶端傳送過來的請求client-request,只能由一個worker程序處理,則多個worker程序是如何爭奪客戶端的client-request請求。
      這裡寫圖片描述
  4. Nginx伺服器啟動後,master程序建立listen的socket檔案描述符,即listenfd。然後呼叫fork()函式建立子程序worker process。worker程序在讀取客戶端請求前,需要先獲取master程序中的accept_mutex互斥鎖,只有獲得accept_mutex鎖的worker程序才能註冊listenfd事件。即通過呼叫accept方法接收client的請求,解析請求,處理請求等。