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