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 -n
nginx 上配置單個 worker 程序的最大連線數:worker_connections
上限為nofile
nginx 上配置 worker 程序的數量:worker_processes
因此,nginx 的最大連線數:
nginx 的最大連線數:worker 程序數量
x單個 worker 程序的最大連線數
上面是 nginx 作為通用伺服器時,最大的連線數
nginx 作為反向**
伺服器時,能夠服務的最大連線數:(worker 程序數量
x單個 worker 程序的最大連線數
)/ 2。
nginx 反向**時,會建立client 的連線
和後端 web server 的連線
,占用 2 個連線
思考:每開啟乙個 socket 占用乙個 fd
為什麼,乙個程序
能夠開啟的 fd 數量有限制?
請求行:method
、uri
、http version
請求頭
請求體響應行:http version
、status 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...