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

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

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模式,不是執行緒安全的