1. 程式人生 > >nginx為什麼比Apache支援高併發???

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

        最開始接觸程式設計時,使用的是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無檔案描述字大小限制僅與記憶體大小相關

      2epoll返回時已經明確的知道哪個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為什麼Apache支援併發???

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

nginxapache處理靜態檔案速度快,但是nginx處理大量併發的php請求時,容易出現502錯誤,頻率大概是多少

首先要明確一點的是502是怎麼出現的,為什麼會出現502呢?一般而言,出現502的錯誤是因為php-cgi連線數不夠導致的。舉個例子:php-cgi開10個程序,前端發20個請求,每個請求的指令碼都sleep100s,那麼必然有至多10個請求會出現502錯誤。因此,出現502是因為php程序不夠用了,和ngi

支援併發的IIS Web伺服器常用設定

適用的IIS版本:IIS 7.0, IIS 7.5, IIS 8.0 適用的Windows版本:Windows Server 2008, Windows Server 2008 R2, Windows Server 2012 1、應用程式池(Application Poo

Tornado從入門到進階 打造支援併發的技術論壇

第5章 tornado的web基礎 本章介紹torando的web框架的主要模組,本章節我們將會涉及到tornado程序web開發的主要模組,為什麼我們不能再tornado中寫阻塞的io介面、以及tornado的幾個核心模組的程式碼結構,讓大家可以和上一章的知識點融合起來,本章節我們將會體會到opti

Tornado從入門到進階打造支援併發的技術論壇

第5章 tornado的web基礎 本章介紹torando的web框架的主要模組,本章節我們將會涉及到tornado程序web開發的主要模組,為什麼我們不能再tornado中寫阻塞的io介面、以及tornado的幾個核心模組的程式碼結構,讓大家可以和上一章的知識點融合起來,本章節我們將會體會到opti

用 PHP 編寫支援併發的網站,需要做什麼處理?

php是一個語言工具,由php來把apache/nginx/memcache/redis/mysql/httpds等工具組合到一起,根據具體的業務需求,選取不同的系統架構模型;高併發其實考驗的是系統的架構 1. 資料的讀寫層 高併發更多考驗的是資料的讀寫,最終考驗的是根據具體的業務需求進行系統的架構;哪些資料

nginxapache快的原因

先總的說幾個概念: 1:在高併發的情況下nginx比apache快,低併發體現不明顯 2:快的原因得益於nginx的epoll模型 apache是多執行緒或者多程序,在工作的時候,當來了一個http響應,一個程序接收(listen)–>識別處理—&g

支援併發的IIS Web伺服器常用設定--實現10萬個併發請求

<processModel enable="true" maxWorkerThreads="100" maxIoThreads="100" minWorkerThreads="50" minIoThreads="50"/> 說明: 我們來看一下ASP.NET中執行緒相關的設定——machine

一個支援併發的jdbc,內建連線池

筆者根據連線池原理,寫的一個Java對應mysql的連線池,jar包較小,可單獨使用 v1.0.8更新 調整呼叫方式為介面呼叫增加分頁查詢增加事務呼叫功能優化查詢物件的裝載效率獨立出一個連線支援所

web Socket與netty框架支援併發

ONE、分析HTTP與WEB SOCKET的優缺點: 一、HTTP協議的弊端 將HTTP協議的主要弊端總結如下: (1)半雙工協議:可以在客戶端和服務端2個方向上傳輸,但是不能同時傳輸。同一時刻,只能在一個方向上傳輸。 (2) HTTP訊息冗長

簡單的MySQL連線池,支援併發

/** * 連線池類 */ package com.junones.test; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; imp

面試官:你是如何使用JDK來實現自己的快取(支援併發)?

需求分析 專案中經常會遇到這種場景:一份資料需要在多處共享,有些資料還有時效性,過期自動失效。比如手機驗證碼,傳送之後需要快取起來,然後處於安全性考慮,一般還要設定有效期,到期自動失效。我們怎麼實現這樣的功能呢? 解決方案 使用現有的快取技術框架,比如redis,ehcache。優點:成熟,穩定,功能強大;

C#實現請求唯一性校驗支援併發

使用場景描述:   網路請求中經常會遇到傳送的請求,服務端響應是成功的,但是返回的時候出現網路故障,導致客戶端無法接收到請求結果,那麼客戶端程式可能判斷為網路故障,而重複傳送同一個請求。當然如果介面中定義了請求結果查詢介面,那麼這種重複會相對少一些。特別是交易類的資料,這種操作更是需要避免重複傳送請求。另外

為何Nignx的併發能力Apache強那麼多

Nginx和Apache都是Web伺服器。Nginx能抗住幾萬的高併發,而Apache卻只能幾千。主要的原因在於IO多路複用的選擇。 白話版: 專業版: 我們先來理解什麼是使用者態和記憶體態: 核心態:       CPU可以訪問記憶體所有資料, 包括外圍裝

ApacheNginx比較(Nginx 併發情況常用,必須學習)

Apache與Nginx的優缺點比較 1、nginx 輕量級,同樣起web 服務,比apache 佔用更少的記憶體及資源。          抗併發,nginx 處理請求是非同步非阻塞的,而apache 則是阻塞型的,在高併發下nginx 能保持低資源低消耗高效能    

使用docker搭建併發網站架構實踐6--Keepalived+Nginx實現熱備份

Keepalived+Nginx實現熱備份 思路說明: 1. 利用linux映象容器,在其中安裝keepalived和nginx, 製作新映象支援熱備份,這樣便於直接使用,但在linux映象中安裝keepalived無法實現虛擬IP,也可能是網絡卡等設定不對。 2. 在linux主機內,

Nginx併發優化方案(血薦!)

一、一般來說nginx 配置檔案中對優化比較有作用的為以下幾項: 1. worker_processes 8; nginx 程序數,建議按照cpu 數目來指定,一般為它的倍數 (如,2個四核的cpu計為8)。 2. worker_cpu_affinity 00000001 0000001

為什麼我覺得 nio aio 更適合併發

nio 是同步非阻塞的,aio 是非同步非阻塞的,初看,肯定是非同步的更好更高階啊,那為什麼我覺得 nio 比 aio 更適合高併發呢?嗯,一定是哪兒出了問題。 這個要涉及到它們兩個的具體實現和使用了。 首先,我們想象 bio 高併發的最主要限制條件是什麼?阻塞。對,阻塞是對資源極

Nginx併發處理

#user nobody; #nginx程序數,建議按照cpu數目來指定,一般跟cpu核數相同或為它的倍數。 worker_processes 18; #下面這個指令是指當一個nginx程序開啟的最多檔案描述符數目,理論值應該是系統的最多開啟檔案數(ulimit -n)與nginx程序數相除,但是n

併發nginx較優的配置

一、這裡的優化主要是指對nginx的配置優化,一般來說nginx配置檔案中對優化比較有作用的主要有以下幾項: nginx程序數,建議按照cpu數目來指定,一般跟cpu核數相同或為它的倍數。 worker_processes 8; 為每個程序分配cpu,上例中