2010-09-03 164 views
10

這個問題不是nginx vs apache。我對NGinx在Apache上的架構優勢更感興趣。正如我所能理解的那樣 -nginx和apache web服務器

  • nginx是一個異步的,事件驅動的Web服務器,它的性能遠遠優於Apache。

這是爲什麼? Apache落後於何處?

+0

你確定Nginx是純粹的異步? – 2017-02-18 08:48:42

回答

13

nginx嚴格「超越Apache」沒有任何理由。對於許多加載模式,您可以配置Apache以便處理此負載。對於一些(非常繁忙的)加載模式,默認配置中的nginx可能會出現性能下降,並且可能需要微調才能正常工作。

然而,很多人都認爲,nginx實際上可以「更好地」開箱即用,或者通過簡單的調整。當nginx作爲前端安裝時,許多系統的性能都有了明顯的提高,Apache移動到了後端。

主要原因是nginx是事件驅動的,並且包含處理連接生命週期的狀態機。這樣,你可以擁有很少的「工作者」進程,每個進程同時處理數百甚至數千個連接。對於Apache,您必須運行與連接數相同數量的子進程(或線程)。

很明顯,針對一千個流程的三個流程至少應該是一個巨大的勝利。

特別是,nginx可以很容易地減少靜態文件(圖片,Javascript,CSS)的負載。在nginx中處理每個額外的連接是非常便宜的,因爲靜態文件在請求數量方面通常佔大多數,所以您可以獲得高效的處理。

另外,對於「慢速客戶端」,nginx性能更好。當Apache直接訪問Internet並且客戶端通過(擁塞)線路發送請求時,您的(快速)服務器必須耐心地爲(慢速)客戶端提供服務,等待它消耗整個響應。因此,Apache子(或線程)不能做任何有用的事情。另一方面,Nginx的工作者只是簡單地將這個緩慢的連接保留在描述符的epoll集合中,而一直處理其他連接。

從概念的角度來看,您應該始終嘗試將請求的「類」與他們自己的性能配置文件和需求分開。例如,服務小靜態文件就是這樣的類之一;提供動態頁面是另一個這樣的類;提供巨大的靜態文件是另一回事。將nginx引入你的系統隱式處理這種分離。

+0

Quote:*對於Apache你將不得不運行相同數量的子進程(或線程)作爲連接數。*我相信這不適用,如果你使用'mpm_event'? – 2013-04-25 09:03:39

+0

不,它也適用於'mpm_event'(從閱讀http://httpd.apache.org/docs/2.4/mod/event.html,'mpm_event'只是'工作人員'扭曲)。 Apache沒有合適的FSM模塊。 – squadette 2013-04-27 18:12:22

+0

@squadette從我對「mpm_event」代碼的少量閱讀中,我不同意:通過'mpm_event',工作人員只能在套接字準備就緒時執行I/O並運行handers和過濾器,例如,以同樣的方式,工人用在libevent(libevhtp),切諾基等人之下。在'mpm_event'下,只有少數工人可以擁有數千個連接。 – ArtemGr 2014-04-13 15:09:42