本文分別介紹了Apache-HTTP
和Nginx
這兩個(gè)引擎,然后對(duì)比一下他們的差別。有什么不足之處歡迎大家補(bǔ)充。
HTTP中間件
當(dāng)我們?cè)跒g覽器中輸入一個(gè)網(wǎng)頁(yè)鏈接后,瀏覽器基于HTTP(s)
傳輸協(xié)議向相應(yīng)的服務(wù)器發(fā)送一個(gè)請(qǐng)求,服務(wù)器收到相應(yīng)的請(qǐng)求后經(jīng)過(guò)處理,返回相應(yīng)的信息給瀏覽器,然后由瀏覽器解析http
中的內(nèi)容,以網(wǎng)頁(yè)的形式表現(xiàn)出來(lái)。
服務(wù)器負(fù)責(zé)接收請(qǐng)求,并在處理之后返回相應(yīng)的數(shù)據(jù),而其中又可以細(xì)分為處理http
連接的服務(wù)部分和執(zhí)行服務(wù)內(nèi)容的應(yīng)用部分(WordPress
使用PHP
生成需要的頁(yè)面,就屬于應(yīng)用部分)
而不論應(yīng)用部分執(zhí)行的是何種應(yīng)用,處理http
連接的部分幾乎是相同的,所以出現(xiàn)了專門處理http
連接的中間件,目前最常見的是Apache
和Nginx
。
Apache
正式名稱是“Apache HTTP Server
”,是一款開源的HTTP
服務(wù)器中間件,誕生于1995年,曾經(jīng)是HTTP
服務(wù)領(lǐng)域的龍頭老大,擁有大量的用戶和豐富的社區(qū)資源。Apache
的一大優(yōu)點(diǎn)就是方便與Wordpress
等CMS軟件進(jìn)行集成,只需要簡(jiǎn)單的設(shè)定就能搭建一個(gè)基于CMS的網(wǎng)站。
Apache的內(nèi)部處理模型
內(nèi)部構(gòu)造方面,Apache
采用多進(jìn)程的方式,每有一個(gè)連接就會(huì)為這個(gè)連接開辟一個(gè)進(jìn)程,專門用于處理這個(gè)連接上的請(qǐng)求,直到連接結(jié)束。這樣做的好處是:
- 來(lái)自不同客戶端的連接會(huì)立刻得到相應(yīng)且互不干擾,而且不會(huì)因?yàn)槟骋粋€(gè)服務(wù)占用了較長(zhǎng)的時(shí)間而使其它的連接得不到響應(yīng)。
但是缺點(diǎn)也是顯而易見的:
- 當(dāng)同時(shí)訪問(wèn)數(shù)比較多的時(shí)候,
Apache
會(huì)建立大量的進(jìn)程,占用過(guò)多的內(nèi)存資源。 - 大量線程間的調(diào)度也會(huì)造成CPU處理能力的大量浪費(fèi)。
由此產(chǎn)生了被稱為C10K
的難題,C即客戶端(Client),10K是指1萬(wàn),即不論服務(wù)器的性能和網(wǎng)絡(luò)帶寬有多高,Apache
都難以同時(shí)處理1萬(wàn)個(gè)以上的連接。
Nginx
讀作Engine-X
,和Apache
一樣也是用于HTTP
服務(wù)的開源中間件,誕生于2004年。Nginx
比Apache
的歷史要短,但是正因?yàn)槭呛髞?lái)者,Nginx
吸取了Apache
的教訓(xùn),在設(shè)計(jì)初期就考慮到了處理大量連接時(shí)的效率問(wèn)題,解決了諸如C10K
等隨著互聯(lián)網(wǎng)規(guī)模壯大而產(chǎn)生的難題。
Nginx的內(nèi)部處理模型
Nginx
采用了非阻塞IO
和異步消息驅(qū)動(dòng)的方式,即在稱作worker
的線程中使用循環(huán)來(lái)處理隊(duì)列中的連接請(qǐng)求。而根據(jù)硬件的情況,可以設(shè)定多個(gè)worker
線程,充分利用CPU
的核心資源。
- 解決了處理大量連接時(shí)消耗內(nèi)存過(guò)多,調(diào)度效率低下的問(wèn)題,同時(shí)還能充分的利用所有的CPU核心。在相同硬件下處理并發(fā)連接的能力是
Apache
的10到100倍。
但是Nginx
這種方式也不是沒(méi)有缺點(diǎn)。
- 當(dāng)服務(wù)器單核性能較差時(shí),基于CMS的動(dòng)態(tài)網(wǎng)站可能需要較長(zhǎng)的時(shí)間來(lái)執(zhí)行一個(gè)請(qǐng)求,此時(shí)來(lái)自其他客戶端的請(qǐng)求將無(wú)法立即被執(zhí)行。當(dāng)
CPU
核心數(shù)較少,worker
線程不足時(shí)會(huì)更加明顯。
好在現(xiàn)在服務(wù)器的性能越來(lái)越強(qiáng),在AMD
的帶領(lǐng)下CPU
核心數(shù)也越來(lái)越多,Nginx
的缺點(diǎn)足以被彌補(bǔ),而高效的優(yōu)勢(shì)也愈發(fā)顯現(xiàn)出來(lái)。
綜合對(duì)比
Apache Nginx
處理能力有限10-100倍是否會(huì)被復(fù)雜任務(wù)阻塞否有可能會(huì)設(shè)定難度比較簡(jiǎn)單相對(duì)復(fù)雜社區(qū)資源豐富相對(duì)較少
近年來(lái),Nginx
的市場(chǎng)占有率不斷提高,2019年已經(jīng)達(dá)到了和Apache
持平的水平。而對(duì)于有極大訪問(wèn)量的大型網(wǎng)站,可以看到訪問(wèn)量越大,Nginx
的占比也就越高。這也從側(cè)面印證了Nginx
在處理大量訪問(wèn)時(shí)的優(yōu)越性能。
負(fù)載均衡
Nginx
除了可以作為HTTP服務(wù)器使用,其強(qiáng)大的反向代理功能還被廣泛地用作負(fù)載均衡前端服務(wù)器,逐漸取代了基于硬件的負(fù)載均衡器。
在Nginx
中可以配置若干個(gè)后端服務(wù)器,Nginx
在收到HTTP
請(qǐng)求之后按照一定規(guī)則(輪詢,IP哈希,優(yōu)先隨機(jī))等將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器,實(shí)現(xiàn)負(fù)載在多臺(tái)服務(wù)器上的平均或加權(quán)分配。
同時(shí)作為負(fù)載均衡的前端還能緩存后端返回的數(shù)據(jù),緩解后端服務(wù)器的壓力。前端采用Nginx
做負(fù)載均衡限制每個(gè)服務(wù)器的連接數(shù),后端服務(wù)器運(yùn)行Apache
的模式也并不少見。
硬件負(fù)載均衡器的業(yè)界大佬F5 networks
在2019年收購(gòu)了Nginx
,推出了包含收費(fèi)服務(wù)的負(fù)載均衡解決方案Nginx+
。
以上是關(guān)于apache
與nginx
的對(duì)比,希望對(duì)于剛接觸apahce
和nginx
的人有一定的幫助。使用一個(gè)產(chǎn)品不能糊里糊涂的使用,我們需要了解其優(yōu)點(diǎn)和缺點(diǎn),這樣才能更好的使用它們。你也可以了解更多相關(guān)知識(shí)
Nginx 入門指南:http://m.hgci.cn/nginx/