Nginx 實現高併發的原理分析

PHP定製開發發表於2022-09-20

本文將講解一下內容:

1、Nginx 的程式模型分析

2、Nginx 實現高併發原理分析

這篇文章首先會講解一下 Nginx 的程式模型,只有先理解了 Nginx 程式模型,才能深入理解 Nginx 實現高併發的原理。

1、 Nginx 程式模型介紹

Nginx 的程式模型也是採用  。當 Nginx 啟動時,會先建立一個 Master 程式,Master 程式會 fork 出若干個 Worker 子程式(具體是多少個子程式可以在 Nginx 的配置檔案中來配置)

Master 程式的作用如下:

Master 程式主要是接收外界訊號(如過載配置等),傳遞給 Worker 程式

監聽 Worker 程式的執行狀態,負責 Worke 程式的建立和銷燬  Worker 程式的作用如下:

處理 Master 程式傳遞過來的訊號

處理網路事件,比如客戶端請求

這種程式模型看似跟   的處理方式類似,它們之間的區別在哪裡呢?

回答這個問題,就要從兩者的定位入手了。Nginx 是一個 HTTP 伺服器,負責轉發請求,不負責處理具體的業務。PHP-FPM 需要處理具體的業務,特別是有些是耗時的業務場景。在 Nginx+PHP-FPM 的架構中,Nginx 的 Worker 程式將請求轉發給 PHP-FPM 後,並沒有停下來等待 PHP-FPM 返回資料,而是設定了一個回撥事件,然後就去處理請他請求了。當 PHP-FPM 業務邏輯處理完後,會執行 Nginx 中 Worker 程式設定的回撥事件,這時 Nginx 的 Worker 程式就會停下手中的工作,開始處理回撥函式的返回值,直到資料返回給使用者端。

所以,Nginx 的 Worker 程式無需等待,可以一直處理請求。但是 PHP-FPM 的 Worker 程式需要將每個請求處理完才能處理下一個請求。

Nginx 實現高併發的原理分析

2、 Nginx 實現高併發的原理分析

Nginx 和 Apache 都是 Web 伺服器,但是兩者有著很大的區別。

Apache 處理請求是同步阻塞方式,每一個請求到達,apache 都會去 fork 一個子程式去處理這個請求,直到這個請求處理完畢。低併發時,這種模式沒有什麼缺點。面對高併發時,如果要想提高處理能力,就需要建立很多程式,程式太多了會出現程式切換,浪費 CPU 資源。

與 Apache 相比,Nginx 在處理高併發時特別有優勢。Nginx 是如何實現高併發的呢?答案就是 I/O 複用技術(select、poll、epoll 模型),即多個 I/O 可以複用一個程式。

elect、poll 原理: 當連線有 I/O 流事件產生的時候,就會去喚醒程式去處理,但是程式不知道是哪個連線產生的 I/O 流事件,於是就得挨個去遍歷程式,遍歷程式會浪費大量 CPU 時間片。 select、poll 原理是一樣的,只不過 select 只能觀察 1024 個連線,poll 可以觀察無限個連線。

epoll 原理 連線有 I/O 流事件產生的時候,epoll 就會去告訴程式哪個連線有 I/O 流事件產生,然後程式就去處理這個連結。

Nginx 就是採用 epoll 模型來實現的。流程就像上文所說的一樣,每處理完一個請求,就會設定一個事件回撥,然後開始處理新的請求。當回撥事件被觸發時再騰出手來處理回撥事件之後的邏輯,整個過程中不會出現等待的情況。所以理論上 Ngnix 的一個程式就可以處理無限數量的連線,而且無需輪詢。

以上就是對文中開始提到的兩個問題的解答,有點繞,可能沒有完全解釋清楚。後面將會在新的文章中把大家提出的問題逐步解答清楚。

完整附件:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70021881/viewspace-2915414/,如需轉載,請註明出處,否則將追究法律責任。

相關文章