1. 程式人生 > >[日常]nginx與網絡事件模型

[日常]nginx與網絡事件模型

建立連接 沒有 上下文 限制 穩定 poll 並發數 1.0 最大

Nginx 的特點:
1.處理靜態文件
2.反向代理加速
3.fastCGI,簡單的負載均衡和容錯
4.模塊化的結構
5.分階段資源分配技術,使得它的 CPU 與內存占用率非常低,保持 10,000 個沒有活動的連接,它只占 2.5M 內存
6.支持內核 Poll 模型,能經受高負載的考驗,有報告表明能支持高達 50,000 個並發連接數
7.采用 master-slave 模型,能夠充分利用 SMP 的優勢,且能夠減少工作進程在磁盤 I/O 的阻塞延遲。當采用 select()/poll() 調用時,還可以限制每個進程的連接數
8.強大的 Upstream 與 Filter 鏈,有點像 Unix 的管道
9.采用了一些 os 提供的最新特性如對 sendfile (Linux2.2+),accept-filter (FreeBSD4.1+),TCP_DEFER_ACCEPT (Linux 2.4+)的支持

Nginx 架構
: 1.默認采用多進程後臺模式啟動,可以手動配置成單進程前臺模式用於調試,進程數一般和cpu內核數相同,太多進程會導致競爭cpu資源,帶來不必要的上下文切換 2.發送kill -HUP pid的信號給master進程,master進程會從新加載配置文件,啟動新的worker進程,退出老的worker進程,也是-s reload所做的 3.在master進程建立好需要listen的 socket,然後fork出子進程,子進程搶accept_mutex的互斥鎖,搶到的子進程進行 accept處理 4.每個子進程采用異步非阻塞事件處理, select/poll/epoll/kqueue的系統調用,設置超時時間,當事件沒準備好時,放到 epoll 裏面,事件準備好了,我們就去讀寫,當讀寫返回 EAGAIN(再試一次)時,我們將它再次加入到 epoll 裏面,線程還是只有一個,在請求間進行不斷的循環切換,這裏的切換沒有代價,只要內存夠大就行
5.apache那種簡單的多線程,每個請求會獨占一個工作線程,當並發數上到幾千時,就同時有幾千的線程在處理請求占用內存大,線程間上下文切換占用的cpu開銷大 6.事件處理通常包含,網絡信號(異步非阻塞),信號,定時器(放在一顆維護定時器的紅黑樹裏面) nginx的connection 1.主進程監聽端口創建socket,fork出子進程,子進程互斥鎖競爭accept新的連接,三次握手建立連接以後,異步非阻塞讀寫事件處理,nginx或客戶端主動關掉連接 2.每個進程都有連接數的限制,ulimit -n,超過時創建socket會失敗 3.nginx能建立的最大連接數 worker_連接數*worker_進程數;作為反向代理時則為worker_連接數*worker_進程數 /2 ,nginx也要請求另外的處理服務占用一個連接
4.利用accept_mutex鎖來平衡每個worker進程的連接數 nginx與keepalive 1.http1.0和http1.1都支持長連接,默認1.0是關閉的,1.1是打開的 2.http1.0需要指定Connection:keep-alive表示使用長連接,響應頭中會包含content-length,客戶端依據這個長度表示接收完成,否則會一直接收數據 3.http1.1不需要指定connection,響應頭中Transfer-encoding 為 chunked則會是流式傳輸,每塊會包含當前塊的長度;如果非chunked則要有content-length,否則會一直接收直到服務端主動斷開 4.keepalive_timeout 來配置超時時間,如果為0則會直接關閉,默認65秒

apache的三種模式

1. prefork 中沒有線程的概念,是多進程模型,一個進程處理一個連接;穩定;響應快。其缺點是在連接數比較大時就非常消耗內存。
2. worker 是多進程多線程模型,一個進程有多個線程,每個線程處理一個連接。與prefork相比,worker模式更節省系統的內存資源。不過,需要註意worker模式下的Apache與php等程序模塊的兼容性。
3. event 是worker模式的變種,它把服務進程從連接中分離出來,在開啟KeepAlive的場合下相對worker模式能夠承受更高的並發負載,不能很好的支持https的訪問
4.apache使用mod_php的話,不能使用worker模式,不是線程安全的

[日常]nginx與網絡事件模型