您在這裡

Nginx與Apache比較

2015-07-20 由 聖誕老人技術團隊 發表
 
在比較這兩者之前,我們先簡單介紹下什麼是apache與nginx
舉例來說,web伺服器是出國旅行前Check-in,的櫃台
apache就是每位要出國的人,必須要一位一位來辦,今天有1000人要出國,就必須等1000人辦Check-in的時間。
nginx就是今天有1000人要出國,但是他們全是同一個旅行社,只要導遊1人去辦Check-in,一樣是1000人,但所花費的時間有很大的不同
 
該如何比較nginx跟apache?你該使用哪個當作web伺服器或是兩個都用比較好呢?
 
在這裡我們來探討一下這個問題的答案
apache web server在1995年被使用以來 apache強大的效能把其他的產品踩在底下,則windows 的iis排在第二
由 於apache web server被放出已經許多年了而且也有許多的使用者,也有撰寫許多的模組來擴大他的功能,這些都是open source。其中一個流行的配置例如,使用apache server來提供靜態網頁服務,並使用mod_jk這個模組來運行Tomcat上的java跟jsp code,以便使程序交互應用。另一個例子是使用mod_php來執行php的腳本而不需要透過cgi。
但是apache在重度覆載底下會很緩慢,因為他需要產生新的程序,他會消耗很多的電腦記憶體跟cpu,他會創建一個新的線程來跟其他的線程爭奪記憶體跟cpu。當進程達到管理員的限制門檻時apache會拒絕新的連線。
nginx也是一個open source的web server他被撰寫來解決一些apache相關的性能以及擴展的問題,他是免費的,但是也有收費的版本。
nginx說是被來解決C10K的問題,意思是要如何可以提供同時超過一萬個使用者連線的效能問題,給予操縱系統的限制
nginx是事件驅動 而apache是依賴進程和線程他們之間有什麼不同?
 
apache如何運作以及侷限性
apache創建進程和線程來處理更多的連接,管理員可以設定伺服器限制最大的連線使用者,根據伺服器的記憶配置而定,而太多的進程使用記憶體,可能會導致電腦的記憶體交換到硬碟上,將會嚴重的降低效能,當進程達到限制數量apache拒絕其他連接。
apache 可以設定使用pre-forked模式或是worker multi-process模式(MPM),當使用者連接時他都創造了新的進程,兩者之間的差別在於,pre-forked為了每一個進程創建了一個線程 用來處理一個使用者的需求,worker multi-process 模式也創建新的進程,但是每個進程指少有一個線程,每一個線程用來處理單個使用者的需求,所以一個worker mode的進程處理至少一個連接,pre-forked進程只處理一個連結。所以worker mode使用的記憶體比pre-forked來的少,因為進程比線程消耗更多記憶體,線程只不過是運行進程內部的代碼。
此外worker mode線程不是安全的,你如果沒有使用線程安全模組像是mod_php來服務php頁面,你需要使用pre-forked模組,會消耗更多的記憶體,所以選擇模組以及調校時你必須選擇優化跟限制的問題。
在 調校apache的限制因素是記憶體和可能存在的dead-locked問題,線程會互相奪取cpu跟記憶體的資源,如果線程被暫停了,用戶的網頁就會出 現等待,直到這個程序被解決,才可以送回用戶的網頁。如果線程被dead-locked了他不知道該如何重新啟動就會造成卡住的狀態。
  • Prefork (multi-process):
Prefork 模式下,Apache 會預創一定數量子進程,每個進程起一個線程(thread),接一個請求,不夠就再創進程。數量到設置的最大值後,就拒絕新請求。
工作方式:
一個單獨的控制進程 (父進程) 負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的  (spare) 或者是空閒的子進程用於迎接即將到來的請求。這樣客戶端就不需要在得到服務前等候子進程的產生。在 Unix 系統中,父進程通常以  root 身份運行以便邦定 80 端口,而 Apache 產生的子進程通常以一個低特權的用戶運行。 User 和 Group  指令用於設置子進程的低特權用戶。運行子進程的用戶必須要對它所服務的內容有讀取的權限,但是對服務內容之外的其他資源必須擁有盡可能少的權限。
  • Worker (multi-threaded):
worker 模式下,Apache 創建若干個進程,每個進程起多個worker 線程,每個線程去接請求。 (一樣可以設置具體上限。)不同線程在處理請求時可以是並行的。
如果一個進程的所有worker 線程都滿負荷了,則會啟用另一個進程,在另一個進程裡再開worker 線程。
由於一個進程中的多個worker 線程可以同時執行,那麼這幾個worker 線程就共享同一份
shared data。所以就要考慮線程安全問題。
工作方式:
每 個進程可以擁有的線程數量是固定的。伺服器會根據負載情況增加或減少進程數量。一個單獨的控制進程 (父進程) 負責子進程的建立。每個子進程可以建立  ThreadsPerChild 數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache  總是試圖維持一個備用 (spare) 或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在 Unix  中,為了能夠綁定80端口,父進程一般都是以 root 身份啟動,隨後,Apache 以較低權限的用戶建立子進程和線程。User 和 Group  指令用於設置 Apache 子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但應該盡可能給予它較少的特權。另外,除非使用了 suexec  ,否則,這些指令設置的權限將被 CGI 腳本所繼承。
 
apache 特色
  • 幾乎可以運行在所有的電腦平臺上. 
  • 支援最新的http/1.1協定 
  • 簡單而且強有力的基於檔的配置(httpd.conf). 
  • 支援通用閘道介面(cgi)
  • 支援虛擬主機. 
  • 支持http認證. 
  • 集成perl. 
  • 集成的代理伺服器 
  • 可以通過web流覽器監視伺服器的狀態, 可以自定義business日誌. 
  • 支援伺服器端包含命令(ssi). 
  • 支持安全socket層(ssl). 
  • 具有用戶會話過程的跟蹤能力. 
  • 支持fastcgi 
  • 支持java servlets
 
Nginx
和Apache相比,Nginx的工作方式有很大不同,主要是在於它如何處理線程。
 
Nginx 並不會為每一個的web請求創建新的進程,相反,管理員可以配置Nginx主進程的工作進程的數量(一個常見的做法是為每一個CPU配置一個工作進程)。 所有這些進程都是單線程的。每一個工作進程可以處理數千個並發的請求。它通過一個線程來異步的完成了這些工作,而沒有使用多線程的編程模型。
 
Nginx還拆分了緩存加載器(cache loader)和緩存管理器(cache manager)進程用來從硬碟中讀取數據並將其加載到緩存中,當緩存直接讀取的時候緩存過期。
 
Nginx有一系列的模塊組成,這些模塊在編譯的時候就被包含進去了。這意味著,用戶下載源碼並選擇他們要編譯的模塊。這些模塊中包括連接後端應用服務器,負載均衡,代理服務器以及其他。並沒有PHP的模塊,因為Nginx可以自己編譯PHP代碼。
 
nginx特色
  • 處理靜態檔,索引檔以及自動索引;打開文件描述符緩衝.
  • 無緩存的反向代理加速,簡單的負載均衡和容錯.
  • FastCGI,簡單的負載均衡和容錯.
  • 模組化的結構。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其他代理伺服器處理單頁中存在的多個SSI,則這項處理可以並行運行,而不需要相互等待。
  • Nginx專為性能優化而開發,性能是其最重要的考量,實現上非常注重效率。它支援內核Poll模型,能經受高負載的考驗,有報告表明能支持高達 50,000個併發連接數。
  • Nginx具有很高的穩定性。其他HTTP伺服器,當遇到訪問的峰值,或者有人惡意發起慢速連接時,也很可能會導致伺服器實體記憶體耗盡頻繁交換,失去回應,只能重啟伺服器。例如當前apache一旦上到200個以上進程,web回應速度就明顯非常緩慢了。而Nginx採取了分階段資源分配技術,使得它的CPU與記憶體佔用率非常低。nginx官方表示保持10,000個沒有活動的連接,它只占2.5M記憶體,所以類似DOS這樣的攻擊對nginx來說基本上是毫無用處的。就穩定性而言,nginx比lighthttpd更勝一籌。
  • Nginx支持熱部署。它的啟動特別容易, 並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啟動。你還能夠在不間斷服務的情況下,對軟體版本進行進行升級。

 

nginx與apache比較
apache2.4有multi-process mode事件模組,他用非同步的方式處理一些連線類型,與nginx相同,但是方法不太一樣,目的就是為了減少伺服器的覆載。
與 早期的相比,apache2.4包括上面提到的worker跟pre-forked,但是加入了mpm_event_module(Apache MPM 事件module)要解決線程的問題,始終保持在最佳的狀態等待用戶連接解決問題,MPM通過減少創建線程跟進程的數量,保持在低覆載來處理 sockets,這些解決了舊版的問題。
apache 跟nginx的MPM事件不太一樣,因為他為了新的請求附加新的進程(由管理員限制),nginx並不設定多進程給每個使用者連接。apache2.4附 帶的改進是,這些線程的運轉效能會比一般的apache worker來的好,這是因為一個線程可以處理多個連接,不需要為每個連結產生新的進程。
 
apache 是功能nginx是速度,這意味者nginx處理提供靜態內容更快,但是apache的模組需要後台應用服務端的運行腳本語言,nginx跟apache 都可以當作proxy server,但是使用nginx當作proxy server和apache當作後端伺服器是一種很常見的作法,nginx包含了高的覆載平衡能力和cache能力,apache當然也是可以,只是需要 佈署較大的效能。
另 一種配置是nginx獨立運作php-fpm應用,再這邊說php-fpm是一個應用是因為,他在載入執行的時候不是.dll或是.so檔,如同 apache模組相同的情況。Php-fpm (the FastCGI Process Manager)可以與nginx用來執行php腳本的能力來呈現靜態php內容
 
 
資料來源:
         
                
 
標籤:
尚未有任何內容