引言
一個網頁伺服器的主要角色是為網站提供網頁。網頁可以從單個HTML文件渲染,也可以是眾多資源複雜組合而成。如果您想將您的網絡應用程序托管在互聯網上,在許多情況下,您將需要一個網頁伺服器。
網頁伺服器最常見的用例之一是提供在瀏覽器中渲染網站所需的文件。當您訪問http://www.digitalocean.com
時,您從輸入一個URL開始,該URL會通過互聯網發起請求。這個請求經過多個層次,其中一個或多個將是網頁伺服器。這個網頁伺服器會對您的請求生成回應,在這種情況下,回應就是DigitalOcean網站,特別是首頁。理想情況下,這應該迅速發生,並且具有24/7的可用性。
雖然任何訪問DigitalOcean首頁的訪客都會體驗到它作為單個網頁,但實際上,現在大多數現代網頁是許多資源的組合。網頁伺服器作為後端和前端之間的中介,提供如HTML和CSS文件至JSON數據等資源,這些資源都是動態生成或靜態服務的。如果您打算以任何方式與網站或在线應用程序合作,熟悉網頁伺服器的基本知識及其工作原理是非常有用的。
則「網頁伺服器」一詞可指軟體本身,或其所在的硬體,但本文特別指的是網頁伺服器軟體。有關這一差異的更多細節,請查看我們的雲伺服器介紹。
常見使用案例
網頁伺服器透過HTTP和HTTPS協定在互聯网上處理請求,也被稱為HTTP伺服器。網頁伺服器與其他類型的伺服器不同之處在於,它專門負責處理這些HTTP和HTTPS請求,與應用伺服器(例如Gunicorn)和其他協定伺服器(即WSGI)有所區別。這些其他伺服器作為後端編程語言的外部函式庫的中介,這是與網頁伺服器不同的抽象層次。
以下是一些常見的網頁伺服器處理的任務:
- 伺服HTML、CSS和JavaScript檔案。
- 伺服圖像和視頻。
- 處理HTTP錯誤消息。
- 處理用戶請求,通常是並發進行的。
- 指導URL匹配和重寫。
- 處理並伺服動態內容。
- 壓縮內容以優化數據使用和速度。
- 啟用瀏覽器緩存您的靜態內容。
實際上,以下是一些涉及網頁服務器的個人項目:
- 您想要建立一個網站。
- 您想要製作一個連接到互聯網的應用程式。
這個列表絕對不是全面的,而且網頁服務器在服務終端用戶的數據類型上並没有嚴格的限制。例如,服務網頁API請求的網頁服務器通常以JSON等格式回應數據。
網頁服務器的目標
網頁服務器需要滿足用戶對速度、可用性、可靠性等方面的期望。它們在互聯網上提供內容具有共同的目的,要成為一個可行的網頁服務器解決方案,必須考慮以下方面:
- 運行時間:這是指網頁服務器在線運行和操作的时间。網站需要全天候在線以服務用戶,因此高運行時間是目標。這也轉化為穩定性和可預見性。當用戶輸入URL或點擊鏈接進入您的網站時,應在任何時候都能夠加載期望的頁面。唯一的例外應該是計劃中的停機時間,用於更新或維護。一個充滿錯誤或隨機崩潰的網頁服務器會對用戶的體驗產生不利影響。
- 速度:您的網頁應該盡可能地快速加載。用戶希望他們的請求能夠立即得到滿足,否則您可能會失去他們。在加載緩慢的網頁上,即使用戶耐心等待第一次加載,每次後續的長時間加載都會指數級地降低他們願意留下或再次訪問的意願。
- 並發:這是指同時處理多個請求。有太多人試圖同時訪問您的網站似乎是一件好事,但當加載時間變得非常慢,甚至您的整個服務器崩潰時,這就成了一個真正的問題。您的物理或虛擬服務器只有有限的資源,如RAM和CPU計算能力,網絡服務器必須有效地使用這些資源。
- 可擴展性:可擴展性指的是通過垂直擴展讓您現有的服務器更強大,或者通過水平擴展添加更多服務器。隨著您觀眾的增加,您可能會達到需要超過一兩個小型網絡服務器的點。
- 設置容易度:快速將項目上線並運行是您項目迭代的关键。簡單明瞭且可重複的安裝過程對於您設置第一個網絡服務器以及後來擴展時的多個網絡服務器都至關重要。
- 文檔:網絡服務器複雜。最常見的設置能讓您快速上手,但您的需求隨著時間會增長。經常會有時候您需要不那麼常見的功能。當那時到來時,良好的文檔對於為您的需求創建定制解決方案至關重要。
- 開發人員支持:如果核心開發人員不致力於他們自己的專案,那麼您也不應該將您的專案投入他們的。這包括了他們對其軟體的長期支援計劃,以及他們以錯誤修正和補丁的形式提供的即時短期支援。
- 社區支持:核心開發團隊將處理大部分繁重的工作,但一個興旺的社區有助於填補這些空缺。在開源專案中,這可能意味著對實際代碼基底的貢獻,但一個強大的社區也將回答您的問題並幫助解決您的特定問題。
雖然網頁伺服器可以提供不同的解決方案,但它們提供的解決方案是為了解決這些相同的問題。這些問題本身隨著時間的推移以及終端用戶的需求和期望而不斷演變,使這份列表成為一個活生生的、不斷進化的清單。
選擇網頁伺服器解決方案
目前最流行的開源網頁伺服器是Apache和Nginx。
Apache是最早的,它是在多個網站具有自己的個別配置文件並存放在單一網頁伺服器上時常見的情況下構建的。Nginx是在Apache之後出現的,當時的需求從在一台伺服器上服務多個網站轉變為在一台伺服器上以極其高效的方式服務一個網站。
網頁伺服器雖然有著相同的目標和問題,但每個解決方案的解讀和實施都會有所不同。這些問題的精確答案塑造了任何給定網頁伺服器解決方案的身份。在這裡特別提到 Nginx 和 Apache 是因為它們的普遍性,但任何網頁伺服器解決方案都會有所主見。選擇網頁伺服器時,重要的是要根據您的具體項目考慮您自己的需求。這樣一來,即使網頁伺服器提供的風景變化,您的評估方法也會根據您自己的要求保持穩定。
以下是網頁伺服器如何嘗試實現網頁伺服器目標的一些關鍵區別:
配置文件結構
網頁伺服器將其設置存儲在配置文件中。您可以通過編輯這些文件來自定義您的網頁伺服器。配置文件的存儲和組織是一個主觀的、結構性問題,這使得網頁伺服器產品有所分歧。
主要分為集中式和分佈式。分佈式配置文件允許在檔案系統層面上進行細粒度的控制,這源於在一台伺服器上托管多個網站的需求。集中式配置並不著重於在一台伺服器上托管多個網站,而是專注於高效地服務單一網站。這些配置依賴於URI模式匹配,即將URL與檔案名和其他獨特識別符進行匹配,而不是依賴於與網伺服器目錄結構的匹配。
Apache的.htaccess
文件實現了分佈式配置作為一項功能,並且每個設計決策都是從這種對檔案系統的細粒度控制重點出發。Nginx並未對檔案系統進行同樣的專注,而是專注於URI模式匹配和集中式配置。
處理並發
您在物理和虛擬伺服器上運行的網伺服器具有有限的資源,如RAM和CPU處理能力。您的網伺服器如何根本性地管理其請求將對高效使用資源產生最大的影響。單一請求可以產生每個請求的整個進程,或者可以基於事件驅動的方式進行處理。您的網伺服器有效處理多個同時請求的能力與根本的設計決策有關。
Apache透過產生進程來處理請求,這會在負載下消耗資源,速率可能會成為問題。Nginx的事件驅動系統處理系統使用的資源較少,並且在負載下可能具有更高的性能。
服務靜態內容
除了網頁外,網絡伺服器還會收到對其他資源(如圖像、視頻、CSS文件和JavaScript文件)的請求。由於這些項目始終不變,無論誰請求,這種類型的內容被稱為靜態內容。有時網頁本身只是一個HTML文件,並未根據請求的人進行定制,也被視為靜態內容。網絡伺服器還可以壓縮這些靜態內容,以獲得更好的加載時間。
Nginx在服務靜態內容方面表現出色,這要歸功於其事件驅動的請求處理。Apache也可以服務靜態內容,但在大多數設置中,其在負載下的速度和效率並不比Nginx同樣快速和高效。
服務動態內容
當內容根據請求者不同而變更、處理及自訂時,這些內容被稱為動態內容。例如,當您登入一個網站後,網站通常會動態地在頂部導航欄中填入您的用戶名。動態內容增加了額外的複雜性,因為它迫使網頁伺服器在接收請求時獨立處理許多請求。根據每個請求定制的內容無法為所有人提供服務,且無法被普遍緩存。
在內部處理動態內容時,移除了通常需要將請求轉移到外部庫的額外一層抽象。Apache 原生實現動態內容處理,流行的解決方案堆棧如 LAMP (Linux, Apache, MySQL, PHP)。Nginx 更為語言中立,但需要外部庫如 PHP-FPM 來作為類似於 LAMP 堆棧使用的解決方案。
反向代理功能
反向代理位於傳統網頁伺服器前方,成為一個中介伺服器,將HTTP請求流量路由到其後方的網頁伺服器。反向代理成為指導流量在網頁伺服器和廣泛互聯網之間的閘道,且常常是直接與防火牆交雜的層次。
Nginx的重要性在實際使用中很大程度上依賴於其反向代理功能和效率。許多伺服器設置將多個傳統網頁伺服器放在Nginx反向代理後方,使用Nginx根據負載或規則配置來決定將請求發送到哪個網頁伺服器。這一中介角色使其甚至能在某些設置中與Apache結合,作為傳統Apache網頁伺服器前方的反向代理。
支援生態系統
Nginx和Apache都從各自的開發團隊和社區中獲得強大的支援。作為最流行的開源網頁伺服器,學習資源非常豐富。Apache由Apache這個非營利組織支援,將永遠免費使用。Nginx的核心是開源的,但令人渴望的功能則被鎖定在他們的Nginx Plus產品提供中,功能包括上游健康檢查、會話持久性以及先進的監控。
傅統網頁伺服器的替代方案
如果您希望伺服器能夠隨時準備好回應進來的HTTP請求,那麼網頁伺服器最能夠完成這項任務。當您的注意力越來越不專注於服務HTTP請求時,網頁伺服器將變得不再是理想的解決方案。這對於網頁伺服器提供的輔助功能尤其真實。例如,根據設置,像是快取之類的功能可能會在反向代理或CDN層級上更有效地處理。
此外,隨著開發人員將開發資源專注於管理網頁伺服器的優先順序發生變化,出現了如無伺服器、無頭CMS和Jamstack等解決方案。這些解決方案不需要自托管網頁伺服器,而是將網頁伺服器層抽象化到外部服務。對於不需要對網頁伺服器層進行細粒度或高級控制的開發人員,可以將開發時間專注於其他方面。更多內容,請查看關於Jamstack與無頭CMS或使用DigitalOcean的App Platform實施全棧Jamstack的這篇文章。
結論
在本文中,您已經經歷了關於網頁伺服器的基礎介紹,包括它們是什麼、如何使用以及它們試圖解決的問題。憑藉這些知識,您深入研究了當前網頁伺服器解決方案的形勢,並將您的知識應用於尋找符合您特定需求的解決方案。要了解有關如何設置和使用網頁伺服器的更多信息,請查看我們的雲端課程系列中關於網頁伺服器的其餘部分。
額外資源
教學課程:
- 如何安裝Apache:設置您的第一個Apache伺服器的逐步指示。此解決方案在去中心化配置以實現細粒度控制以及內部處理動態網頁(與PHP之類的流行編程語言的鉤子)方面表現出色。
- 如何安裝Nginx:設置您的第一個Nginx伺服器的逐步指示。此解決方案在集中化配置、提供靜態資源、充當反向代理以及處理高並發流量方面表現出色。
- Apache 與 Nginx:實用考量:深入探討網頁伺服器解決方案領域中的兩大主要選擇。
DigitalOcean 產品:
- DigitalOcean Droplets:用於測試和部署網頁伺服器的虛擬私有伺服器。
- DigitalOcean Functions:無伺服器解決方案,可用作虛擬私有伺服器的替代方案。無需維護伺服器,專注於您的應用程式代碼。
Source:
https://www.digitalocean.com/community/conceptual_articles/web-servers-introduction