Nginx為什麼快到根本停不下來?

2021-10-12 20:47:07 字數 4044 閱讀 4358

nginx 伺服器,正常執行過程中:

多程序:乙個 master 程序、多個 worker 程序

master 程序:管理 worker 程序

對外介面:接收外部的操作(訊號)

對內**:根據外部的操作的不同,通過訊號管理 worker

監控:監控 worker 程序的執行狀態,worker 程序異常終止後,自動重啟 worker 程序

worker 程序:所有 worker 程序都是平等的

實際處理:網路請求,由 worker 程序處理;

worker 程序數量:在 nginx.conf 中配置,一般設定為核心數,充分利用 cpu 資源,同時,避免程序數量過多,避免程序競爭 cpu 資源,增加上下文切換的損耗。

思考:請求是連線到 nginx,master 程序負責處理和**?

如何選定哪個 worker 程序處理請求?請求的處理結果,是否還要經過 master 程序?

http 連線建立和請求處理過程:

nginx 啟動時,master 程序,載入配置檔案

master 程序,初始化監聽的 socket

master 程序,fork 出多個 worker 程序

worker 程序,競爭新的連線,獲勝方通過三次握手,建立 socket 連線,並處理請求

nginx 高效能、高併發:

nginx 採用:多程序+非同步非阻塞方式(io 多路復用epoll)

請求的完整過程:

建立連線

讀取請求:解析請求

處理請求

響應請求

請求的完整過程,對應到底層,就是:讀寫 socket 事件

request:nginx 中 http 請求。

基本的 http web server 工作模式:

接收請求:逐行讀取請求行請求頭,判斷段有請求體後,讀取請求體處理請求返回響應:根據處理結果,生成相應的 http 請求(響應行響應頭響應體

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

nginx的模組根據其功能基本上可以分為以下幾種型別:

nginx vs. apache:

網路 io 模型:

nginx:io 多路復用,epoll(freebsd 上是 kqueue )

高效能高併發占用系統資源少

apache:阻塞 + 多程序/多執行緒

更穩定,bug 少

模組更豐富

場景:處理多個請求時,可以採用:io 多路復用或者阻塞 io+多執行緒

io 多路服用乙個執行緒,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;

阻塞 io+多執行緒:每乙個請求,新建乙個服務執行緒

思考io 多路復用多執行緒的適用場景?

阻塞io+多執行緒:實現簡單,可以不依賴系統呼叫,適合cpu 密集型場景

基礎背景:

nginx 是多程序模型,worker 程序用於處理請求;

單個程序的連線數(檔案描述符 fd),有上限(nofile):ulimit -nnginx 上配置單個 worker 程序的最大連線數:worker_connections上限為nofilenginx 上配置 worker 程序的數量:worker_processes

因此,nginx 的最大連線數:

nginx 的最大連線數:worker 程序數量x單個 worker 程序的最大連線數上面是 nginx 作為通用伺服器時,最大的連線數

nginx 作為反向**伺服器時,能夠服務的最大連線數:(worker 程序數量x單個 worker 程序的最大連線數)/ 2。

nginx 反向**時,會建立client 的連線後端 web server 的連線,占用 2 個連線

思考:每開啟乙個 socket 占用乙個 fd

為什麼,乙個程序能夠開啟的 fd 數量有限制?

請求行:methodurihttp version請求頭

請求體響應行:http versionstatus code響應頭

響應體場景:

處理多個請求時,可以採用:io 多路復用或者阻塞 io+多執行緒

io 多路服用乙個執行緒,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;

阻塞 io+多執行緒:每乙個請求,新建乙個服務執行緒

思考:io 多路復用多執行緒的適用場景?

select/poll 和 epoll 比較

// select 系統呼叫int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); // poll 系統呼叫int poll(struct pollfd fds, nfds_t nfds, int timeout);
poll

資料複製:使用者空間和核心空間,複製連線就緒狀態資訊

epoll: event 事件驅動

fd 數量:無限制(os 級別的限制,單個程序能開啟多少個 fd)

select,poll,epoll:

i/o多路復用的機制;

i/o多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。

監視多個檔案描述符

但select,poll,epoll本質上都是同步i/o

使用者程序負責讀寫(從核心空間拷貝到使用者空間),讀寫過程中,使用者程序是阻塞的;

非同步 io,無需使用者程序負責讀寫,非同步io,會負責從核心空間拷貝到使用者空間

關於 nginx 的併發處理能力:

蓋樓掙話費 根本停不下來

一 活動時間 5月13日 5月23日 二 活動規則 三 參與條件 四 參與方法 五 獎項設定以及評獎規則。1 貢獻獎 跟帖整百樓層即可獲得50元話費,整千樓層即可獲得100元話費。2 幸運獎 所有跟帖賬號隨機抽取3名,獎品為30元話費。六 獎品領取 活動結束後,7個工作日內公布獲獎名單,獲獎會員聯絡...

2048 根本停不下來的開源HTML5遊戲

遊戲的玩法很簡單,在4x4的棋盤上,用方向鍵選擇數字移動的方向,遇到相同的數字就會合併,每次移動會增加乙個數字。合併出2048就算通關。雖然簡單,但是很有樂趣,被譽為 根本停不下來的遊戲 這個遊戲完全使用html5開發,基於mit協議開源。遊戲的css部分使用了sass,一門編譯到css的語言。sa...

為什麼選擇Nginx

nginx 是乙個高效能的 web 和反向 伺服器,它具有有很多非常優越的特性 作為 web 伺服器 相比 apache,nginx 使用更少的資源,支援更多的併發連線,體現更高的效率,這點使 nginx 尤其受到虛擬主機提供商的歡迎。能夠支援高達 50,000 個併發連線數的響應,感謝 nginx...