Apache VS NGINX

簡介

ApacheNginx是現(xiàn)在最常用的兩種開源網(wǎng)絡(luò)服務(wù)器,二者加起來承擔(dān)了網(wǎng)絡(luò)上百分之50的流量。二者能夠處理不同的工作負(fù)載并且能夠和其他的軟件一起,提供一個完整的網(wǎng)絡(luò)環(huán)境

雖然Apache和Nginx有很多共同點,但是我們不能認(rèn)為他們可以完全痛喲哦那個。它們都有各自的長處,了解他們的長處與短處有助于重新評估的web服務(wù)器的選擇。

概覽

在深入了解Apache和Nginx不同之前,簡單的回顧下兩個服務(wù)器軟件的背景與特性。

Apache 服務(wù)器是1995年由 Robert McCool在Apache基金會的領(lǐng)導(dǎo)下開發(fā)出來的。因為Apache的靈活性,高性能和高擴展。它通常被系統(tǒng)管理員選擇作為web服務(wù)器。它可以通過動態(tài)加載模塊,來拓展功能,并且可以通過不連接其他第三方軟件的情況下,執(zhí)行多種解釋型語言。

Nginx 在2002年,Igor Sysoev開始著手寫Nginx服務(wù)器來解決C10K問題。C10K問題是Web服務(wù)器的一個挑戰(zhàn),要求同一個web服務(wù)器在同一時刻可以處理10000個連接請求,Nginx在2004年通過依靠異步事件驅(qū)動架構(gòu)來實現(xiàn)這個目的,并且發(fā)布了它的初始版本

Nginx的流行,源于它輕量級資源使用率和它能夠擴展到小型設(shè)備上。Nginx擅長快速處理靜態(tài)內(nèi)容,并且它旨在將動態(tài)請求傳遞給更適合這些目的的其他軟件。

對比

Nginx

  1. 輕量級,采用C進行編寫,同樣的Web服務(wù)器,會占用更少的內(nèi)存與資源
  2. 抗并發(fā),Nginx以epoll and kqueue作為開發(fā)模型,處理請求異步非阻塞,負(fù)載能力比Apache高很多,而Apache則是阻塞型。在高并發(fā)下Nginx能夠保持低資源低消耗高性能,而Apache在PHP處理慢或者前端壓力很大的時候,很容易出現(xiàn)進程數(shù)飆升,從而拒絕服務(wù)的情況。
  3. Nginx處理靜態(tài)文件的能力比Apache高出三倍以上。
  4. Nginx的設(shè)計高度模塊化,編寫模塊相對簡單。
  5. Nginx配置簡潔,正則配置讓很多事情變的簡單,而且改完配置能夠使用 -t測試配置是否有問題,Apache配置復(fù)雜。
  6. Nginx作為負(fù)載均衡服務(wù)器,支持7層負(fù)載均衡
  7. Nginx本身是一個反響代理服務(wù)器,而且可以作為非常優(yōu)秀的郵件代理服務(wù)器。
  8. 容易啟動,并且能夠做到7*24不間斷運行,即使運行數(shù)月也不需要重新啟動,還能夠不間斷服務(wù)的情況下進行軟件的版本升級
  9. 社區(qū)活躍,快速出品各種高性能模塊

Apache

  1. Apache的rewrite比Nginx強大,在rewrite頻繁的情況下,用Apache
  2. Apache發(fā)展到現(xiàn)在,模塊很多,能覆蓋用戶的基本需求
  3. Apache 很穩(wěn)定
  4. Apache 對PHP的支持較為簡單,Nginx需要配合其他后端使用
  5. Apache對處理動態(tài)請求有優(yōu)勢,Nginx在這方面遜色一些。一般動態(tài)請求要Apache去做,Nginx適合靜態(tài)和反向。
  6. Apache仍然是主流,擁有豐富的特性,成熟的技術(shù)和開發(fā)社區(qū)。

一點解釋

Apache

Apache在高負(fù)載的情況下表現(xiàn)的差強人意,原因是它需要運行新的進程,所以更加的消耗內(nèi)存,同時,他還要產(chǎn)生新的線程來與其他的線程競爭CPU和內(nèi)存。當(dāng)進程的流量達到了管理員設(shè)置的上限時,Apache會拒絕新的連接。

Apache可以通過設(shè)置來運行pre-forked模式或者worker multi-process模式(MPM).當(dāng)其他的用戶連接時,兩種方式都會創(chuàng)建新的進程。區(qū)別在于,pre-fork模式為每一個進程創(chuàng)建一個線程,用來處理一個用戶的請求。worker模式也創(chuàng)建新的進程,但是每一個進程至少有一個線程,每一個線程用來處理單個用戶的單個請求。所以一個worker mode的進程處理至少一個連接,而一個pre-fork模式的進程只處理一個連接。

相比forker模式,worker模式使用更少的內(nèi)存,原因是進程比線程消耗更多的內(nèi)存,線程只是運行進程中的代碼。

在調(diào)整Apache時的一個限制因素是內(nèi)存以及當(dāng)爭奪一個CPU和內(nèi)存時潛在的線程死鎖問題。如果一個線程停止了,用戶會一直處于等待頁面出現(xiàn)的狀態(tài),直至進程將該線程回收,以便可以發(fā)回頁面。如果一個線程發(fā)生了死鎖,它不知道如何重啟,因此會一直處于卡住狀態(tài)。

Nginx

和Apache相比,Nginx的工作方式有很大不同,主要是在于它如何處理線程。

Nginx并不會為每一個Web請求創(chuàng)建新的進程,相反,管理員可以配置Nginx主進程的工作進程數(shù)量(一個常見的做法是為每一個CPU配置一個工作進程)。所有這些進程都是單線程的。每一個工作進程可以處理數(shù)千個并發(fā)請求。它通過一個線程來異步的完成這些工作,而沒有使用多線程的編程模型。

Nginx還拆分了緩存加載器(Cache Loader)和緩存管理器(Cache Manager)進程用來從磁盤中讀取數(shù)據(jù),并將其加載到緩存中

Nginx有一系列的模塊組成,這些模塊在編譯的時候,就被包含進去了。這些模塊中包含連接后端應(yīng)用服務(wù)器,負(fù)載均衡,代理服務(wù)器以及其他。并沒有PHP模塊,因為Nginx可以自己編譯PHP代碼

Nginx架構(gòu)圖

avatar
avatar

通過上圖我們可以看出,Nginx使用FastCgi進程來執(zhí)行Python,Ruby以及其他代碼,使用Memcached對象緩存系統(tǒng)。工作進程為Http請求加載ht_core Nginx進程。我們還可以看到,Nginx和Windows以及Linux內(nèi)核的功能緊密的集成在了一起,以便提升性能。

Nginx聲稱是事件驅(qū)動,異步無阻塞的。事件指的是一個用戶的連接。異步指的是它一次處理多個用戶連接的用戶交互。 無阻塞 指的是它不會猶豫CPU處于忙狀態(tài)而停止磁盤I/O,在這種情況下,她會處理其他事件,知道I/O資源得到釋放。

總結(jié)

兩者核心區(qū)別在于Apache是同步多進程模型,一個連接對應(yīng)一個進程,而Nginx是異步的,多個連接可以對應(yīng)一個進程

一般來說,要求性能的Web服務(wù)器,使用Nginx。如果不要求性能,更求穩(wěn)定,可以使用Apache,后者的功能模塊是多于Nginx的。

epoll(freebsd 上時kqueue) 網(wǎng)絡(luò)IO模型是Nginx處理性能高的根本理由,但是當(dāng)如果本身提供的靜態(tài)服務(wù)就只有幾個文件,Apache的select 模型或許比epoll更高性能。

通用的方案為,前端Nginx抗并發(fā),后端Apache集群,配合起來會更好

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容