nginx為什麼比Apache支援高併發???

2021-08-13 21:42:52 字數 2100 閱讀 9148

最開始接觸程式設計時,使用的是apache伺服器,後來隨著**使用者訪問量的增加,考慮高併發是必不可少的環節,越來越多的公司使用nginx伺服器。我們公司最近也打算更換nginx伺服器。那麼nginx和apache有哪些異同點呢,nginx為什麼比apache支援高併發呢?

首先,先看一下各自使用的io模型。

apache使用的是select模型,該模型特點如下:

1、每個連線對應乙個描述。select模型受限於 fd_setsize(即程序最大開啟的描述符數),linux2.6.35為1024,實際上linux每個程序所能開啟描數字的個數僅受限於記憶體大小,然而在設計select的系統呼叫時,卻是參考fd_setsize的值。可通過重新編譯核心更改此值,但不能**此問題,對於百萬級的使用者連線請求即便增加相應程序數,仍顯得杯水車薪。

2、select每次都會掃瞄乙個檔案描述符的集合,這個集合的大小是作為select第乙個引數傳入的值。但是每個程序所能開啟檔案描述符若是增加了,掃瞄的效率也將減小。

3、核心到使用者空間,採用記憶體複製方式傳遞資訊。 

nginx使用的是epoll模型,該模型特點如下:

1、無檔案描述字大小限制僅與記憶體大小相關。

2、epoll返回時已經明確的知道哪個socket fd發生了什麼事件,不用像select那樣再乙個個比對。

3、核心到使用者空間,採用共享記憶體方式傳遞訊息。

其次,看一下各自的優勢。

apache的優點:

1、rewrite ,比nginx 的rewrite 強大;

2、模組超多,基本想到的都可以找到;

3、bug少 ,nginx的bug相對apache較多;

4、超穩定,

最核心的區別在於apache是同步多程序模型,乙個連線對應乙個程序;nginx是非同步的,多個連線(萬級別)可以對應乙個程序。

nginx的優點:

1、輕量級,同樣起web 服務,比apache 占用更少的記憶體及資源;

2、抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能;

3、高度模組化的設計,編寫模組相對簡單;

4、社群活躍,各種高效能模組發布迅速。

最後,epoll相對select的優點總結如下:

1、select的控制代碼數目受限,在linux/posix_types.h標頭檔案有這樣的宣告:#define __fd_setsize    1024  表示select最多同時監聽1024個fd。而epoll沒有,它的限制是最大的開啟檔案控制代碼數目。
2、epoll的最大好處是不會隨著fd的數目增長而降低效率,在selec中採用輪詢處理,其中的資料結構類似乙個陣列的資料結構,而epoll是維護乙個佇列,直接看佇列是不是空就可以了。epoll只會對"活躍"的socket進行操作---這是因為在核心實現中epoll是根據每個fd上面的callback函式實現的。那麼,只有"活躍"的socket才會主動的去呼叫 callback函式(把這個控制代碼加入佇列),其他idle狀態控制代碼則不會,在這點上,epoll實現了乙個"偽"aio。但是如果絕大部分的i/o都是「活躍的」,每個i/o埠使用率很高的話,epoll效率不一定比select高(可能是要維護佇列複雜)。

3、使用mmap加速核心與使用者空間的訊息傳遞。無論是select,poll還是epoll都需要核心把fd訊息通知給使用者空間,如何避免不必要的記憶體拷貝就很重要,在這點上,epoll是通過核心於使用者空間mmap同一塊記憶體實現的。

個人拙見,如有錯誤,歡迎指正~o(∩_∩)o

.nginx的工作原理:

nginx並不會為每乙個的web請求建立新的程序,相反,管理員可以配置nginx主程序的工作程序的數量(乙個常見的做法是為每乙個cpu配置乙個工作程序)。所有這些程序都是單執行緒的。

每乙個工作程序可以處理數千個併發的請求。它通過乙個執行緒來非同步非阻塞的完成了這些工作(epoll),而沒有使用多執行緒的程式設計模型。

nginx的優勢:

採用單執行緒來非同步非阻塞處理請求,不會為每個請求分配cpu和記憶體資源,節省了大量資源,同時也減少了大量的cpu的上下文切換。所以才使得nginx支援更高的併發。

為什麼 比list()更快?

我最近比較了和list 的處理速度,並且驚訝地發現執行速度比list 快三倍以上。我跑了相同的測試與 和dict 結果幾乎相同 和 兩個花了大約0.128sec 百萬次,而list 和dict 大約花費每個0.428sec 萬次。後來我查了查原因,得到的結論如下 list 需要全域性查詢和函式呼叫,...

為什麼選擇Nginx

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

為什麼選擇Nginx

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