Nginx 爲什麼這麼快!

Nginx 是一個免費的,開源的,高性能的 HTTP 服務器和反向代理,以及 IMAP / POP3 代理服務器。Nginx 以其高性能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。本文從底層原理分析 Nginx 爲什麼這麼快!

Nginx 的進程模型

Nginx 服務器,正常運行過程中:

  1. 對外接口:接收外部的操作(信號)

  2. 對內轉發:根據外部的操作的不同,通過信號管理 Worker

思考:

  1. 請求是連接到 Nginx,Master 進程負責處理和轉發?

  2. 如何選定哪個 Worker 進程處理請求?請求的處理結果,是否還要經過 Master 進程?

HTTP 連接建立和請求處理過程:

Nginx 高性能、高併發:

Nginx 的事件處理模型

request:Nginx 中 http 請求。

基本的 HTTP Web Server 工作模式:

  1. 接收請求:逐行讀取請求行請求頭,判斷段有請求體後,讀取請求體

  2. 處理請求

  3. 返回響應:根據處理結果,生成相應的 HTTP 請求(響應行響應頭響應體

Nginx 也是這個套路,整體流程一致。

模塊化體系結構

nginx 的模塊根據其功能基本上可以分爲以下幾種類型:

常見問題剖析

Nginx vs. Apache

nginx:

IO 多路複用,epoll(freebsd 上是 kqueue)

高性能

高併發

佔用系統資源少

apache:

阻塞 + 多進程 / 多線程

更穩定,bug 少

模塊更豐富

參考:

http://www.oschina.net/translate/nginx-vs-apache

https://www.zhihu.com/question/19571087

場景:

處理多個請求時,可以採用:IO 多路複用 或者 阻塞 IO +多線程

1.IO 多路服用一個 線程,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;

2. 阻塞 IO + 多線程:每一個請求,新建一個服務線程

思考IO 多路複用 和 多線程 的適用場景?

IO 多路複用:單個連接的請求處理速度沒有優勢,適合 IO 密集型 場景,事件驅動

阻塞IO多線程:實現簡單,可以不依賴系統調用,適合 CPU 密集型 場景

Nginx 最大連接數

基礎背景:

因此,Nginx 的最大連接數:

思考:

  1. 每打開一個 socket 佔用一個 fd

  2. 爲什麼,一個進程能夠打開的 fd 數量有限制?

附     錄

HTTP 請求和響應

HTTP 請求:

HTTP 響應:

IO 模型

場景:

處理多個請求時,可以採用:IO 多路複用 或者 阻塞 IO +多線程

1.IO 多路服用一個 線程,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;

2. 阻塞 IO + 多線程:每一個請求,新建一個服務線程

思考:IO 多路複用 和 多線程 的適用場景?

select/poll 和 epoll 比較

詳細內容,參考:select poll epoll 三者之間的比較

select/poll 系統調用:

1// select 系統調用
2intselect(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);
3// poll 系統調用
4int poll(struct pollfd fds[], nfds_t nfds, int timeout);
5

select:

poll:

epoll,event 事件驅動:

select,poll,epoll:

Nginx 的併發處理能力

關於 Nginx 的併發處理能力:併發連接數,一般優化後,峯值能保持在 1~3w 左右。(內存和 CPU 核心數不同,會有進一步優化空間)

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/YARz5nXnqQ3fiKgeZledrw