請求方式
- Nginx是一款高性能的web服務器,能夠同時處理大量的併發請求,主要是得益於Nginx的master-worker進程模式和異步機制。
- master-worker模式
- nignx服務器對於接收到的每一個請求,都會有主進程master生成一個工作進程(worker process)處理。工作進程讀取到這個客戶端請求事件後,調用後端的I/O進行處理。
- 對於worker的進程數量,肯定不是越多越好。因爲進程太多,會引發CPU的切換和調度,這樣會浪費資源。通常情況下,worker進程的數量與服務器CPU的核數相等。這樣做的好處,可以避免過多的worker進程競爭CPU資源。
- worker進程之間是相互獨立的,這樣設計就是避免了去競爭同一把鎖的性能開銷。同時一個進程異常退出之後,不影響其他進程正常工作。
- 異步非阻塞
- worker 進程接收到客戶端請求後,直接調用I/O處理,如果不能立即得到結果,就去處理其他事情。I/O處理完成後,會通知worker進程,該worker進程得到通知,暫時掛起當前處理的事物去響應客戶端。
- master-worker模式
事件驅動
- Nignx事件驅動模型主要分爲事件收集器,事件發送器,事件處理器三大部分。其中事件收集器讀取到worker的各種I/O請求後,交給事件發送器處理,事件發送器將讀取到的請求發送給事件處理器進行處理。
- 事件處理器是真正負責各種I/O事件的,事件處理器採用多路複用模式設計。
主要模型關係如下:
請求原理
- nginx採用master-worker進程模式工作,即一個master進程,多個worker子進程。對於客戶端發送過來的請求client-request,只能由一個worker進程處理,則多個worker進程是如何爭奪客戶端的client-request請求。
- nginx採用master-worker進程模式工作,即一個master進程,多個worker子進程。對於客戶端發送過來的請求client-request,只能由一個worker進程處理,則多個worker進程是如何爭奪客戶端的client-request請求。
- Nginx服務器啓動後,master進程創建listen的socket文件描述符,即listenfd。然後調用fork()函數創建子進程worker process。worker進程在讀取客戶端請求前,需要先獲取master進程中的accept_mutex互斥鎖,只有獲得accept_mutex鎖的worker進程才能註冊listenfd事件。即通過調用accept方法接收client的請求,解析請求,處理請求等。