Nginx 實現高併發的原理分析
本文將講解一下內容:
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 程式需要將每個請求處理完才能處理下一個請求。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Nginx實現高速併發處理的原理詳解Nginx
- 併發——深入分析ThreadLocal的實現原理thread
- Nginx Ingress 高併發實踐Nginx
- Java ConcurrentHashMap 高併發安全實現原理解析JavaHashMap
- 【死磕Java併發】-----深入分析synchronized的實現原理Javasynchronized
- Java 併發集合的實現原理Java
- 高併發微信域名攔截檢測介面實現原理
- 【死磕Java併發】—–深入分析volatile的實現原理Java
- nginx 高併發配置引數Nginx
- epoll程式設計,單epoll+執行緒池?執行緒池+epoll?nginx實現高併發的原理?程式設計執行緒Nginx
- 高併發中nginx較優的配置Nginx
- Nginx支援比Apache高併發的原因NginxApache
- java併發之SynchronousQueue實現原理Java
- 使用nginx搭建高可用,高併發的wcf叢集Nginx
- 說說Nodejs高併發的原理NodeJS
- 併發Lock之ReentrantLock實現原理ReentrantLock
- django框架怎麼實現高併發Django框架
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- nginx proxy cache的實現原理Nginx
- Nginx+php-fpm高併發優化NginxPHP優化
- 用PHP實現高併發伺服器PHP伺服器
- 如何快速實現高併發短文檢索
- 利用Redis實現高併發計數器Redis
- 探索 ConcurrentHashMap 高併發性的實現機制HashMap
- 分析如何支撐高併發?
- 高併發的核心技術-冪等的實現方案
- Nginx實現請求的負載均衡 + keepalived實現Nginx的高可用Nginx負載
- Redis 實現高併發下的搶購 / 秒殺功能Redis
- Springboot:高併發下耗時操作的實現Spring Boot
- 高併發系統的限流演算法與實現演算法
- 實現高效能高併發的計數器功能
- Java併發程式設計:Synchronized及其實現原理Java程式設計synchronized
- php利用pcntl擴充套件實現高併發PHP套件
- 使用keepalived實現nginx的高可用Nginx
- Nginx實現原理master和workerNginxAST
- keepalived + nginx 實現高可用Nginx
- nginx實現keepalived高可用Nginx
- 【高併發】面試官問我如何使用Nginx實現限流,我如此回答輕鬆拿到了Offer!面試Nginx