Nginx 與 Apache 對(duì)比
前面兩個(gè)小節(jié)我們講述了 Nginx 的一些優(yōu)點(diǎn),這一節(jié)我們來與 Web 服務(wù)器領(lǐng)域的另一個(gè)霸主 Apache 做一下比較。如果說 Nginx 是新生代霸主的話,那么 Apache 就是當(dāng)之無愧的老霸主。至少在前幾年 Nginx 在 Web 服務(wù)器領(lǐng)域只是占據(jù)老二的位置。
但是隨著互聯(lián)網(wǎng)的發(fā)展,越來越多的人和企業(yè)開始轉(zhuǎn)向 Nginx 的懷抱,從而使得 Nginx 的市場(chǎng)占有率逐年上升,直到牢牢占據(jù)第一的寶座。那么這一對(duì)新老技術(shù)的代表之間,究竟有著怎樣的差別呢?
1. 進(jìn)程模型
Nginx 的進(jìn)程模型前面已經(jīng)提到過,它是通過異步的、非阻塞的、事件驅(qū)動(dòng)的方式實(shí)現(xiàn)的。 Nginx 的工作進(jìn)程是多進(jìn)程的,每個(gè) Worker 進(jìn)程可以異步處理大量的用戶請(qǐng)求,因此在高并發(fā)下 Nginx 能保持低資源低消耗高性能。
Apache 有一共有三種穩(wěn)定的 MPM(Multi-Processing Module,多進(jìn)程處理模塊)模式,其中最常用和默認(rèn)的是 prefork 模式。prefork 是一個(gè)非線程型的、預(yù)派生的 MPM,使用多個(gè)進(jìn)程,每個(gè)進(jìn)程在某個(gè)確定的時(shí)間只單獨(dú)處理一個(gè)連接,效率高,但內(nèi)存使用比較大。一個(gè)進(jìn)程相對(duì)占用更多的系統(tǒng)資源,消耗更多的內(nèi)存。
因此,Apache 并不擅長處理高并發(fā)請(qǐng)求。 在這種場(chǎng)景下,它會(huì)將請(qǐng)求放進(jìn)隊(duì)列中,一直等到有可用進(jìn)程,請(qǐng)求才會(huì)被處理。因此 Apache 是阻塞型的。當(dāng)用戶請(qǐng)求過多時(shí),開啟的進(jìn)程較多,占用內(nèi)存大,每秒最多的并發(fā)連接請(qǐng)求最多不超過 3000 個(gè),而 Nginx 則可以每秒并發(fā)連接超過 10 萬請(qǐng)求。
2. 配置文件
Nginx 的配置簡潔,且支持正則表達(dá)式,使用起來非常方便。在啟動(dòng)或者熱加載時(shí)都會(huì)優(yōu)先檢查配置文件是否存在語法錯(cuò)誤。Apache 的配置則略顯復(fù)雜,而且只有啟動(dòng)時(shí)候才知道配置是否存在問題,如果是重啟出錯(cuò)則會(huì)導(dǎo)致服務(wù)中斷,進(jìn)而影響業(yè)務(wù)。
3. 性能對(duì)比
根據(jù)前面的進(jìn)程模型對(duì)比,我們可以看出:Nginx 是輕量級(jí)、支持高并發(fā)、海量請(qǐng)求的 web 服務(wù)器,而 Apache 是重量級(jí)、不支持高并發(fā)的 web 服務(wù)器。
Nginx 在處理靜態(tài)文件方面的性能要遠(yuǎn)超于Apache,而且支持壓縮、緩存等配置。 Nginx 最擅長的是靜態(tài)資源訪問和反向代理。其反向代理模塊也同時(shí)支持 4 層協(xié)議(主要是 TCP 協(xié)議/ UDP 協(xié)議)和七層協(xié)議(HTTP 協(xié)議、WebSocket 協(xié)議、WSGI 協(xié)議等)的反向代理。同時(shí)也可以作為負(fù)載均衡服務(wù)器,也支持 4 層和 7 層的負(fù)載均衡,這些優(yōu)勢(shì)是 Apache 無法比擬的。但是 Apache 在處理動(dòng)態(tài)請(qǐng)求方面有較大優(yōu)勢(shì),比如 rewrite(對(duì) url 重寫)功能。如果網(wǎng)站使用 rewrite 頻繁的情況下,建議用 Apache。
此外,根據(jù) Nginx 和 Apache 的進(jìn)程模型,可以看到,Apache 一個(gè)進(jìn)程對(duì)應(yīng)一個(gè)連接請(qǐng)求,而 Nginx 的一個(gè) worker 進(jìn)程可能對(duì)應(yīng)很多個(gè)連接請(qǐng)求,這樣如果 Nginx 的一個(gè)進(jìn)程死掉,會(huì)影響比較多的用戶請(qǐng)求,所以 Apache 相比 Nginx 會(huì)更穩(wěn)定一些。
4.部署方面
Nginx 安裝和啟動(dòng)都特別容易, 并且?guī)缀蹩梢宰龅?7*24 不間斷運(yùn)行,即使運(yùn)行數(shù)個(gè)月也不需要重新啟動(dòng),支持熱部署,實(shí)現(xiàn)不間斷服務(wù)的情況下進(jìn)行軟件版本的升級(jí)與版本的回退。而 Apache 在修改配置后,只能手工重啟服務(wù)或者使用第三方插件實(shí)現(xiàn)熱部署,期間服務(wù)會(huì)出現(xiàn)短暫的不可用。
5. 社區(qū)情況
Apache 出現(xiàn)時(shí)間比較早,仍然是主流的 Web 服務(wù)器,擁有豐富的特性,成熟的技術(shù)和開發(fā)社區(qū),還有數(shù)不甚數(shù)的第三方插件。而 Nginx 作為后起之秀,社區(qū)同樣非?;钴S,版本迭代更新快,各種高性能的第三方模塊層出不窮。使用 Apache 和 Nginx 中出現(xiàn)的大部分問題都能在社區(qū)和網(wǎng)上找到相應(yīng)的解決方案。