|
|
|
|
|
大多數(shù)人在開始要用到Web服務(wù)時(shí),首先遇到的就是選擇哪個(gè) Web 服務(wù)器問題。而 Apache 和 Nginx 是世界上最常見的兩種開源 Web 服務(wù)器。他們共同負(fù)責(zé)為互聯(lián)網(wǎng)上超過(guò) 50% 的流量提供服務(wù)。因此,大多數(shù)人會(huì)最終選擇 Apache 或 Nginx。
在二選一的情況下,你不得不對(duì)這兩服務(wù)器進(jìn)行一番比較。而速度的快與慢則又是大家確定選擇的重中之重。這正是書寫本文的初衷,本文將給大家介紹的是,Apache 和 Nginx 服務(wù)器處理靜態(tài)和動(dòng)態(tài)內(nèi)容請(qǐng)求的方式區(qū)別,這是它們之間最常見的比較之一。
Apache 服務(wù)器可以使用其傳統(tǒng)的基于文件的方法來(lái)處理靜態(tài)內(nèi)容。這些操作的性能主要是 MPM 方法的函數(shù)。
Apache 提供了多種多處理模塊,Apache 將這些 MPM 稱為 MPM,這些模塊決定了如何處理客戶端請(qǐng)求。這些是:
- mpm_prefork:這個(gè)處理模塊產(chǎn)生進(jìn)程,每個(gè)進(jìn)程都有一個(gè)線程來(lái)處理請(qǐng)求。
- mpm_worker:這個(gè)模塊產(chǎn)生可以管理多個(gè)線程的進(jìn)程。
- mpm_event:該模塊在大多數(shù)情況下類似于工作模塊,但經(jīng)過(guò)優(yōu)化以處理保持活動(dòng)連接。
Apache 還可以通過(guò)將相關(guān)語(yǔ)言的處理器嵌入到其每個(gè)工作實(shí)例中來(lái)處理動(dòng)態(tài)內(nèi)容。這允許它在 Web 服務(wù)器本身內(nèi)執(zhí)行動(dòng)態(tài)內(nèi)容,而無(wú)需依賴外部組件。這些動(dòng)態(tài)處理器可以通過(guò)使用可動(dòng)態(tài)加載的模塊來(lái)啟用。
Apache 在內(nèi)部處理動(dòng)態(tài)內(nèi)容的能力直接促成了 LAMP(L inux- A pache- M ySQL- P HP)架構(gòu)的流行,因?yàn)?PHP 代碼可以由 Web 服務(wù)器本身本地執(zhí)行。
Nginx 沒有任何原生處理動(dòng)態(tài)內(nèi)容的能力。為了處理 PHP 和其他對(duì)動(dòng)態(tài)內(nèi)容的請(qǐng)求,Nginx 必須將請(qǐng)求交給外部庫(kù)執(zhí)行并等待輸出返回。然后可以將結(jié)果轉(zhuǎn)發(fā)給客戶端。
這些請(qǐng)求必須由 Nginx 和外部庫(kù)使用 Nginx 知道如何說(shuō)話的協(xié)議之一(http、FastCGI、SCGI、uWSGI、memcache)交換。在實(shí)踐中,PHP-FPM是一種 FastCGI 實(shí)現(xiàn),通常是一種插入式解決方案,但 Nginx 與任何單一架構(gòu)的耦合不如 Apache 與 PHP 的緊密耦合。
但是,這種方法也有一些優(yōu)點(diǎn)。由于動(dòng)態(tài)解釋器沒有嵌入在工作進(jìn)程中,它的開銷只會(huì)出現(xiàn)在動(dòng)態(tài)內(nèi)容中。靜態(tài)內(nèi)容可以直接提供,只有在需要時(shí)才會(huì)聯(lián)系翻譯程序。
Apache 和 Nginx 之間最大的區(qū)別在于它們處理請(qǐng)求方式的底層架構(gòu)。
Apache 使用 MPM-s 或Multi-Processing-Modules處理請(qǐng)求,它“負(fù)責(zé)綁定到機(jī)器上的網(wǎng)絡(luò)端口、接受請(qǐng)求并調(diào)度子進(jìn)程來(lái)處理請(qǐng)求”。
在后來(lái)的幾年里,Apache 開發(fā)了多線程工作者 mpm,之后又開發(fā)了事件 mpm。它們都減輕了 Apache 的許多性能問題。切換到 php-fpm 使得 Apache 有可能在今天仍然是一個(gè)競(jìng)爭(zhēng)解決方案,同時(shí)消除了 .htaccess
的使用,但這違背了它的目的。
簡(jiǎn)而言之,Apache 對(duì)每個(gè)連接都使用進(jìn)程(對(duì)于 worker mpm,它使用線程)。隨著流量的增加,它很快就會(huì)變得過(guò)于昂貴。
我們可以想象新進(jìn)程或線程的創(chuàng)建,例如啟動(dòng)計(jì)算機(jī)或啟動(dòng)程序。即使在最快的計(jì)算機(jī)上,它仍然需要一些時(shí)間。如今的網(wǎng)站在單個(gè)頁(yè)面加載時(shí)會(huì)發(fā)出數(shù)百個(gè)請(qǐng)求,這很快就會(huì)增加。
Event mpm 在優(yōu)化方面走得更遠(yuǎn)一些,但一些測(cè)試表明它無(wú)法超越 Nginx。尤其是當(dāng)我們談?wù)撿o態(tài)文件時(shí),Nginx 提供的請(qǐng)求是 Apache 的兩倍。
Nginx 理想情況下每個(gè) CPU/核心有一個(gè)工作進(jìn)程。Nginx 工作進(jìn)程的不同之處在于每個(gè)工作進(jìn)程可以處理數(shù)十萬(wàn)個(gè)傳入網(wǎng)絡(luò)連接。無(wú)需為每個(gè)連接創(chuàng)建新線程或進(jìn)程。
在了解了 Apache 和 Nginx 的優(yōu)點(diǎn)和限制之后,你可能會(huì)更好地了解哪種服務(wù)器更適合你的需求。在某些情況下,可以通過(guò)一起使用每個(gè)服務(wù)器的優(yōu)勢(shì)來(lái)利用它們。
這種合作關(guān)系的常規(guī)配置是將 Nginx 作為反向代理放在 Apache 前面。這將允許 Nginx 處理所有客戶端請(qǐng)求。這利用了 Nginx 的快速處理速度和同時(shí)處理大量連接的能力。
對(duì)于 Nginx 擅長(zhǎng)的靜態(tài)內(nèi)容,文件或其他指令將快速直接地提供給客戶端。對(duì)于動(dòng)態(tài)內(nèi)容,例如 PHP 文件,Nginx 會(huì)將請(qǐng)求代理到 Apache,然后 Apache 可以處理結(jié)果并返回呈現(xiàn)的頁(yè)面。Nginx 然后可以將內(nèi)容傳遞回客戶端。
這種設(shè)置適用于許多人,因?yàn)樗试S Nginx 充當(dāng)分揀機(jī)。它將處理它可以處理的所有請(qǐng)求,并傳遞它沒有本機(jī)服務(wù)能力的請(qǐng)求。通過(guò)減少要求 Apache 服務(wù)器處理的請(qǐng)求,我們可以減輕在 Apache 進(jìn)程或線程被占用時(shí)發(fā)生的一些阻塞。
此配置還通過(guò)根據(jù)需要添加額外的后端服務(wù)器來(lái)促進(jìn)水平擴(kuò)展。Nginx 可以配置為將請(qǐng)求傳遞給多個(gè)服務(wù)器,從而提高此配置的性能。
Apache 和 Nginx 都強(qiáng)大、靈活且有能力。確定最適合你的服務(wù)器很大程度上取決于評(píng)估你的特定需求并使用你期望看到的模式進(jìn)行測(cè)試。
這些項(xiàng)目之間的差異會(huì)對(duì)原始性能、功能和在生產(chǎn)中使用任一解決方案所需的實(shí)施時(shí)間產(chǎn)生非常實(shí)際的影響。使用最符合你的目標(biāo)的解決方案。