Apache 與 Nginx 簡介
網頁伺服器和協定旨在讓使用者能夠查看網頁。他們發送查看文件的請求,該請求會被伺服器接受。接著,主機基本上會向檢視者提供該文件或資訊。網頁伺服器在讓您於瀏覽器上查看和存取網頁方面扮演著核心角色。

促進用戶端與應用程式伺服器之間溝通的網頁伺服器
您可以使用許多網頁伺服器來達到此目的。其中最受歡迎的是 Nginx 與 Apache。事實上,這些伺服器託管了目前網際網路上可用的大多數網站。
Apache 和 Nginx 在許多方面都非常相似。首先,這兩款網頁伺服器都是開源的。這意味著世界上任何人都可以完全免費地使用它們。但每款伺服器都有許多獨特的特點。這些特殊特性使它們最適合各種應用和目的。
為了協助您 決定哪款網頁伺服器對您而言更優越或更理想,我們將對比 Nginx 和 Apache。我們將針對網頁伺服器使用者至關重要的多個基本參數進行比較。讓我們開始吧!
基本概述
我們將先對這兩款網頁伺服器進行一般性概述。Apache 和 Nginx 在社群中都建立了極佳的聲譽。它們因其效能而備受讚譽,並被全球多家知名機構所採用。
Apache
Apache 於 1995 年問世。Robert McCool 在 Apache 軟體基金會 旗下開發了這款 HTTP 伺服器,因而得名。自發布以來,全球已有成千上萬的人在使用 Apache。
它的極高普及率意味著許多第三方軟體和來源經常與其協作。因此,如果您正在尋找一個擁有大量整合的良好支援網路,Apache 就是您的不二之選。Apache 也是許多人的首選,因為它更具動態性和彈性。它還提供了更廣泛的支援語言供其解析。
Nginx
Nginx 是一款相對較新的網頁伺服器,於 2004 年問世。這是 Igor Syosev 為了應對如今被稱為 C10K 問題而努力的成果。當伺服器開始難以處理大量流量時,這個問題就出現了。隨著越來越多的人開始使用網際網路,網站伺服器開始不堪重負。這些伺服器無法同時處理數千個連線,導致網站崩潰和失效。
Nginx 的發布就是為了解決這個問題。這就是為什麼它的架構採用了極其輕量級的設計,能夠在有限的資源和硬體下運作。雖然它最適合處理靜態內容,但它也可以與能夠適當處理動態內容的軟體進行整合。
流量處理能力
現在我們對每款伺服器都有了基本的了解,我們可以深入探討更多細節。我們首先要介紹的第一個特性是各個伺服器的流量和處理能力。這是區分這兩個平台的主要特點之一。在同時處理多個連線時,它們的架構基於不同的原理運作。
Apache
Apache 使用了一種稱為 MPM- Multi-Processing Modules 的技術。管理員使用各種 MPM 來操作和修改連線處理架構。Apache 網頁伺服器的部分吸引力在於其架構所提供的彈性。這種將處理程序劃分為單個和多個執行緒群組的模組化基礎架構,使其更容易擴充並適應不同類型的連線。
讓我們來看看 Apache 中使用的一些個別模組:
- mpm_prefork
第一個是 mpm_prefork。這是一個負責處理來自訪客的傳入請求的處理模組。它在任何給定時間建立一個執行緒(或子行程)來處理一個連線。這意味著如果請求數量少於行程數量,mpm_prefork 的運作效率會非常高。
由於每個請求都由獨立的子行程單獨處理,因此請求處理速度很快。但這也意味著如果請求數量超過行程數量,速度可能會顯著變慢。因此,請求處理步驟會消耗大量的 RAM。
- mpm_worker
正如我們所知,一個執行緒負責一個連線。此模組更進一步,讓您能夠同時管理多個執行緒。與在超過特定臨界值後就會顯得吃力的 mpm_prefork 相比,這是一個更具擴充性的模組。新的連線可以立即連接到執行緒,而無需等待。
- mpm_event
Mpm_event 負責維護 keep-alive(保持連線)連線。此模組的主要目的是防止系統因 keep-alive 請求而陷入泥淖。它的做法是,即使在沒有活動請求的情況下,也將執行緒分配給連線。只要連線處於活動狀態,該執行緒就會保持專用。任何傳入的請求都會被轉移到空閒的執行緒。
Nginx
與 Apache 相反,Nginx 的建構有著非常明確的目的。我們已經知道在這個層面上連線和擴充性會出現的問題。這就是為什麼它使用非同步且非阻塞的演算法。它不會為每個連線分配單獨的執行緒。相反地,Nginx 會產生大量的工作行程(worker processes),能夠同時處理數千個連線。
Nginx 架構背後的運作原理是快速循環機制。此演算法不斷處理事件並對其進行監控。這意味著這些行程是事件驅動的,且每個工作行程僅專注於自己的連線。工作行程的所有連線都位於一個事件循環中。在這裡,它們與該特定工作行程下的其他連線共存並進行非同步處理。
這種架構的主要好處是它提供了極佳的擴充能力。如果您資源有限或希望在最低限度的硬體下運作,這將特別適用。即使您面臨大量的流量,對 RAM 使用率的影響也微乎其微。這是因為您沒有為每個連線產生單獨的執行緒。
處理靜態與動態內容
我們可以用來比較這兩個網頁伺服器的另一個參數是它們如何處理 靜態 與 動態內容.
Apache
Apache 使用基於檔案的方法來處理靜態內容。其 MPM 處理系統使其能夠使用這種傳統方法。
在處理動態內容時,Apache 不需要任何外部元件的協助即可完成。您可以透過載入模組來啟用動態處理器。該模組將透過分析語言來處理內容,然後將相關的處理器嵌入到工作行程中。
在設定和協調過程中,無需使用外部元件來處理動態內容的主要好處顯而易見。僅協調內部元件之間的運作要容易得多。
Nginx
Apache 和 Nginx 處理內容方式的最大區別在於,Nginx 根本無法在內部處理動態內容。它必須與外部元件搭配使用才能處理動態內容的請求。這意味著您需要將 Nginx 伺服器與外部處理器結合使用。該元件將接收對 PHP/動態內容的請求,進行處理,然後將其傳送回伺服器。
由於資訊必須在兩個組件之間進行傳遞,您需要協調它們之間的通訊。您必須確定要允許多少個連線並配置協定。您必須使用 Nginx 可以讀取和理解的協定,例如 HTTP、FastCGI、SCGI、uWSGI 或 memcache 等。
另一方面,Nginx 在處理靜態內容方面表現非常出色。它確實需要來自任何外部來源的協助才能做到這一點。它也只會在需要時才啟用直譯器。這是使用 Nginx 的好處之一。直譯器並未嵌入在程序中。這意味著它只會在處理動態內容時存在。
內容目錄:分散式與集中式配置
每個網頁伺服器都有自己的內容目錄。評估 Apache 和 Nginx 最關鍵的參數之一,在於它們是否允許目錄級別的配置。
Apache
內容目錄中存在某些包含指令的隱藏檔案。這些就是 .htaccess 檔案。使用 Apache,您可以按目錄解析這些指令。因此,當您傳送請求時,Apache 會檢查檔案路徑以尋找 .htaccess 檔案。當找到時,它會立即解析並套用其中的指令。Apache 不需要重新載入伺服器即可執行這些指令。
上述定義的過程允許對網頁伺服器中的目錄進行分散式配置。分散式配置對於 URL 重寫、實施存取限制、確認授權以及設定快取策略非常有用。
.htaccess 檔案的好處之一是,沒有驗證權限的使用者可以控制並修改他們在瀏覽器中查看的內容的至少某些方面。這就是為什麼 Apache 經常被共享主機提供商使用的原因。服務提供商擁有對中央配置的授權存取權限。客戶能夠在無法存取主配置的情況下,對特定目錄進行控制。
如果您願意,您可以在 Apache 中關閉 .htaccess 的解析。
Nginx
與 Apache 不同,Nginx 不支援任何 .htaccess 檔案。這使得它相對不那麼靈活。然而,Nginx 反而在其配置風格上帶來了許多改進。首先,它處理請求的速度比 Apache 快得多。這是原因它不需要在其路徑中搜尋、讀取、解析並執行所找到的每個 .htaccess 檔案。Nginx 不需要搜尋每個父目錄,而是針對一個請求僅進行一次目錄查找。
此外,與 Apache 相比,Nginx 具有重大的安全性優勢。與 Apache 不同,Nginx 不會將內容目錄的任何配置部分交給個別使用者。雖然您可能會維持嚴格的安全措施,但誰能保證個別使用者也能做到同樣的事?使用 Nginx,您可以保留對整個目錄網路的安全狀態和配置的控制權。
請求解析
區分這兩種伺服器的另一種方法是它們解析請求的方式。
Apache
當伺服器收到請求時,它會對其進行解析,然後將其連接到相關的系統資源。它會將請求解析為檔案系統上的實體資源,或者解析為 URI 位置。
當解析為實體資源時,它會使用 <Directory> 或 <Files> 區塊。這是伺服器的預設解析方法。它會獲取文件的根目錄。然後,它會根據請求中的主機和連接埠號,在文件樹中尋找相關檔案。
另一方面,URI 位置需要進行抽象評估。因此,Apache 使用 <Location> 區塊來處理抽象資源,而不是與檔案系統進行互動。
除了 URI 之外,還有許多其他替代方案可以取代預設的檔案型系統。例如,您可以使用 Alias 指令來尋找要對應的替代位置。您也可以利用運算式變體來使檔案系統設定更具彈性。
Nginx
Apache 天生就是為了作為網頁伺服器而設計,而 Nginx 則兼具網頁伺服器與代理伺服器的雙重角色。這就是為什麼 Nginx 傾向於處理 URI,而不是偏向檔案系統。您可以從一個事實中看出這種偏好:在 Nginx 中,您無法為檔案系統目錄指定設定。然而,如果需要,它仍然可以轉換為檔案系統。
Server 和 location 是 Nginx 中主要使用的設定區塊。前者解析被請求的主機(host),後者則比對主機和連接埠(port)之後的 URI 部分。因此,伺服器會將請求解析為 URI 位置,而不是系統上的實際檔案。
由於其基於 URI 的解析系統,Nginx 能夠勝任網頁伺服器、代理伺服器和郵件伺服器的角色。既然它在解析請求時不參考檔案系統,那麼它不支援 .htaccess 檔案也就合情合理了。
模組系統
雖然 Apache 和 Nginx 都支援用於擴充功能的模組系統,但它們的內部運作方式存在一些重大差異。
Apache
使用 Apache,您可以在執行伺服器時動態載入和卸載模組。核心仍處於處理程序的中心,而模組則用於擴充功能。您可以使用這些可附加的模組來完成許多任務。憑藉 Apache 龐大的程式庫,選擇實際上是無窮無盡的。
事實上,您甚至可以透過使用像 mod_php 這樣的模組來修改伺服器核心的功能。正如我們之前提到的,此模組允許您將 PHP 解譯器嵌入到各個工作處理程序(worker processes)中。當您需要處理動態內容時,這非常有用。
但故事並未就此結束。您還可以新增模組來啟用諸如用戶端驗證、伺服器強化、快取、URL 重寫、代理、速率限制、壓縮以及加密等功能。
Nginx
Nginx 的模組系統有所不同,因為您無法將模組動態載入到主伺服器中。相反地,它們必須在核心軟體上進行收集和編譯。這在彈性和易用性方面留下了許多遺憾。雖然發行套件包含一些常用模組,但對於其他模組,您必須自行建置伺服器。因此,您需要了解如何在傳統套件管理系統之外維護您編譯的軟體。
無論如何,這種非標準模組系統的優勢在於它為您提供了高度的針對性。您可以透過僅納入所需的功用來自訂模組。這讓您可以捨棄不需要的元件,並在此過程中免受安全風險的威脅。同時,您可以使用 Nginx 模組完成與 Apache 相同的任務。這些任務包括 URL 重寫、記錄、驗證等等。
生態系統與支援
對於網頁伺服器而言,整合和軟體支援非常重要。接下來,我們將探討 Apache 和 Nginx 所提供的相容性與支援。
Apache
Apache 是一個歷史更悠久且更受歡迎的平台。因此,與 Nginx 相比,它擁有更多支援工具和軟體是合情合理的。有大量的第三方文件可供您使用以支援核心伺服器。不僅如此,您還可以將其與其他軟體搭配使用以完成特定任務。您可以將這些工具新增到您的專案或套件中。它們能夠在 Apache 生態系統中輕鬆引導(bootstrap)運作。
Nginx
雖然 Nginx 在這方面落後於 Apache,但它無疑正在盡最大努力追趕。隨著越來越多的人意識到 Nginx 的巨大潛力,他們開始採用它。隨著其作為一個實用、快速處理的網頁伺服器的自然增長,對該平台的支援也持續上升。
Nginx 必須克服的主要支援障礙之一是尋找英文文件。這是因為 Nginx 的大部分內容最初是用俄文編寫的,包括其大部分文件。然而,隨著該伺服器的普及和名聲大噪,現在這種通用語言中已有大量的第三方資源。
協作解決方案?
現在,您對 Apache 和 Nginx 的核心組件和內部運作機制有了更好的了解。雖然它們彼此截然不同,但一些使用者利用這一點來兼顧兩者的優勢。沒錯’—您可以同時使用 Apache 和 Nginx。
按照傳統,使用者傾向於將 Nginx 用作反向代理,並將其置於 Apache 之前。這使您能夠彌補 Apache 在請求處理和加工速度上的不足。Nginx 在其速度最快時接收並處理所有請求。它還使您能夠快速並行處理大量請求,而無需投入大量資源。
使用者利用的另一個 Nginx 特性是其高效處理靜態內容的能力。為了彌補 Nginx 需要外部組件來處理動態內容的不足,我們可以透過代理將 PHP 和其他相關請求轉發給 Apache。Apache 將把請求渲染成網頁並將其發送回 Nginx,以便其為用戶端提供服務。
以下是您可以在我們的部落格上找到的一些資源,可以幫助您開始使用這兩個網頁伺服器:
Apache
- 在 Ubuntu 18.04 上安裝 Apache 伺服器:指南
- 在 Ubuntu 20.04 上設定 Apache 虛擬主機
- 如何在 CentOS 7 上安裝 Linux, Apache, MySQL, PHP (LAMP) 堆疊
- 在 Ubuntu 18.04 上使用 Let’s Encrypt 保護 Apache 安全
Nginx
- 在 Ubuntu 18.04 上安裝 Nginx
- 為 Nginx 自動執行 LetsEncrypt SSL 憑證續期
- 如何在 Ubuntu 20.04 上使用 Let’s Encrypt 保護 Nginx 安全
- 如何在 Ubuntu 20.04 上安裝 LEMP 堆疊 (Linux, Nginx, MySQL PHP)
結論
歸根結底,Apache 和 Nginx 各有優缺點。對於您的專案應該使用哪種伺服器,並沒有硬性規定或建議。您是根據自己獨特的需求,判斷最適合您應用程式的最佳人選。
您需要找出自己無法妥協的方面和功能,並據此做出選擇。如果很難做出決定,您隨時可以轉而在自訂解決方案中同時使用這兩種伺服器。
祝您運算愉快!
留言
目前尚無留言。成為第一個留言的人吧。