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