網頁伺服器介紹

介紹

A web server’s primary role is to serve web pages for a website. A web page can be rendered from a single HTML file, or a complex assortment of resources fitted together. If you want to host your web application on the internet, in many cases you will need a web server.

網絡伺服器最常見的用途之一是在瀏覽器中提供呈現網站所需的文件。當您訪問 http://www.digitalocean.com 時,您首先輸入一個 URL,啟動了一個在互聯網上的請求。這個請求通過多個層,其中一個或多個將是一個網絡伺服器。這個網絡伺服器生成對您的請求的響應,在這種情況下是 DigitalOcean 網站,具體是首頁。理想情況下,這樣的過程會快速進行,並且具有全天候的可用性。

雖然任何訪問 DigitalOcean 首頁的訪客都會將其視為單個網頁,但實際上,今天大多數現代網頁是許多資源的組合。網絡伺服器充當後端和前端之間的中介,提供資源,如 HTML 和 CSS 文件,以及 JSON 數據,這些資源都是動態生成或靜態提供的。如果您打算以任何形式與網站或在線應用程序一起工作,熟悉網絡伺服器的基礎知識以及它是如何工作的是非常有用的。

雖然“網絡伺服器”這個術語既可以指的是 軟體 本身,也可以指的是其存在的 硬體,但本文專門指的是網絡伺服器軟體。有關此差異的更多詳細信息,請參閱我們的 介紹雲伺服器

常見用途

A web server handles requests on the internet through HTTP and HTTPS protocol, and is also called an HTTP server. A web server is distinct from other types of servers in that it specializes in handling these HTTP and HTTPS requests, differentiating itself from application servers (e.g. Gunicorn) and servers for other protocols (i.e. WSGI). These other servers work as intermediaries for backend programming languages through external libraries, which is a different level of abstraction than web servers.

以下是 Web 伺服器處理的一些常見任務:

  • 提供 HTML、CSS 和 JavaScript 檔案。
  • 提供圖片和影片。
  • 處理 HTTP 錯誤訊息。
  • 處理使用者請求,通常是同時進行的。
  • 導向 URL 匹配和重寫。
  • 處理並提供動態內容。
  • 壓縮內容以優化數據使用和速度。
  • 為靜態內容啟用瀏覽器緩存。

在實際應用中,以下是一些可能涉及到 Web 伺服器的個人專案:

  • 您想要製作一個網站。
  • 您想要製作一個連接到互聯網的應用程式。

這份清單並不全面,而且 Web 伺服器在向最終使用者提供的數據類型方面並不嚴格限制。例如,一個提供 Web API 請求的 Web 伺服器通常會以 JSON 格式回應數據。

Web 伺服器的目標

網絡伺服器滿足用戶對速度、可用性、可靠性等方面的期望。它們有一個共同的目的,即在互聯網上提供內容,要被認為是一個可行的網絡伺服器解決方案,必須考慮以下方面:

  • 正常運行時間:這指的是網絡伺服器在線並運行的時間。網站需要一直在線以服務用戶,因此高正常運行時間是目標。這也意味著穩定性和可預測性。當用戶輸入 URL 或點擊訪問您的網站的鏈接時,預期的頁面應每次都能加載,並且在任何給定的時間都應該如此。唯一的例外應該是計劃中的更新或維護停機時間。一個存在錯誤或隨機崩潰的網絡伺服器會對用戶的體驗產生不利影響。
  • 速度:您的網頁應該盡可能快地加載。用戶希望立即得到他們的請求,否則您面臨失去他們的風險。在加載緩慢的網頁上,即使用戶在第一次加載時耐心等待,但每次後續的長時間加載都會指數級地減少他們的願意留下或再次訪問的意願。
  • 並發性:這指的是同時處理多個請求的能力。許多人同時訪問您的網站似乎是一件好事,但當加載時間變得非常緩慢並且整個伺服器崩潰時,這就成為一個真正的問題。您的實體或虛擬伺服器僅具有有限的資源,例如 RAM 和 CPU 運算能力,而網絡伺服器必須高效地使用這些資源。
  • 可擴展性: 可擴展性指的是通過垂直擴展使現有服務器更強大,或通過水平擴展為您的配置添加更多服務器。隨著受眾的增長,您可能會達到需要多於一兩個小型 Web 服務器的時候。
  • 設置的簡易性: 快速啟動和運行項目對於項目的迭代至關重要。對於您設置的第一個 Web 服務器以及後來擴展的多個 Web 服務器,一個簡單且可重復的安裝過程非常重要。
  • 文檔: Web 服務器復雜多變。最常見的配置可以讓您迅速上手,但隨著時間的推移,您的需求將會增長。在那個時候,良好的文檔對於為您的需求創建定制解決方案至關重要。
  • 開發者支持: 如果核心開發人員對自己的項目不負責任,您就不應該把自己的項目托付給他們。這包括對他們軟件的長期支持計劃,以及他們提供的即時短期支持,包括錯誤修復和補丁。
  • 社區支持: 核心開發團隊將處理大部分工作,但是一個蓬勃發展的社區有助於填補空白。對於開源項目,這可能意味著對實際代碼庫的貢獻,但強大的社區也將回答您的問題,並幫助您解決特定的問題。

雖然 Web 伺服器可以提供不同的解決方案,但它們所提供的解決方案源於試圖解決相同問題。這些問題本身隨著終端用戶的需求和期望而不斷演變,使得這是一個生動且不斷發展的清單。

選擇 Web 伺服器解決方案

目前最流行的開源 Web 伺服器是 Apache 和 Nginx。

Apache 是第一個出現的,在當時,將多個具有各自配置文件的網站全部存在於一台 Web 伺服器上是很常見的。Nginx 出現在 Apache 之後,當時的需求從一台伺服器上為多個網站提供服務轉向為在負載下以極其高效的方式為一個網站提供服務。

雖然 Web 伺服器共享相同的目標和問題,但每個解決方案的解釋和實現方式都會有所不同。對這些問題的確切回答塑造了任何給定 Web 伺服器解決方案的特性。這裡突出了 Nginx 和 Apache,因為它們的普及,但任何 Web 伺服器解決方案都是主觀的。在選擇 Web 伺服器時,重要的是要牢記您對您的特定項目的需求。這樣,即使 Web 伺服器的選擇變化,您的評估方法也會受到您自己需求的制約。

以下是 Web 伺服器試圖實現 Web 伺服器目標的一些主要區別:

配置文件的结构

Web服务器将它们的设置存储在配置文件中。您可以通过编辑这些文件来自定义您的Web服务器。配置文件的存储和组织是一个见解明确的结构性问题,它将Web服务器产品分为不同派别。

主要的区别在于集中式和分散式。分散式配置文件允许在文件系统级别上进行精细级别的控制,这源于在一个服务器上托管多个网站的需求。集中式配置不关注在一个服务器上托管多个网站,而是专注于有效地为单个网站提供服务。这些配置依赖于URI模式匹配,即将URL与文件名和其他唯一标识符进行匹配,而不是依赖于与Web服务器目录结构进行匹配。

Apache的.htaccess文件作为一个特性促进了分散式配置,并且每个设计决策都是基于这种对文件系统的精细级别控制。Nginx没有同样的文件系统关注,而是专注于URI模式匹配和集中式配置。

处理并发

運行 Web 伺服器的物理和虛擬伺服器具有有限的資源,如 RAM 和 CPU 處理能力。您的 Web 伺服器如何基本管理其請求將對有效利用資源產生最大影響。單個請求可以為每個請求生成整個流程,或者可以基於事件驅動方式處理。您的 Web 伺服器處理多個同時請求的能力與基本設計決策密切相關。

Apache 通過生成進程來處理請求,這將以一種在負載下可能成為問題的速率消耗資源。Nginx 的事件驅動系統處理使用更少的資源,並且在負載下可能更高效。

提供靜態內容

除了網頁之外,Web 伺服器還會收到有關其他資源的請求,例如圖片、視頻、CSS 文件和 JavaScript 文件。由於這些項目無論是誰請求,始終是相同的,因此此類內容被稱為靜態。通常,網頁本身只是一個 HTML 文件,不會根據請求它的人進行自定義,也被視為靜態內容。Web 伺服器還可以壓縮此靜態內容以獲得更好的加載時間。

Nginx 擅長於提供靜態內容,因為它的事件驅動請求處理。Apache 也可以提供靜態內容,但在大多數設置中,與 Nginx 相比,在負載下的速度和效率通常不同。

提供動態內容

當內容根據請求者的不同而更改、處理和定制時,該內容被稱為動態內容。例如,當您登錄到一個網站後,該網站通常會動態填充您的用戶名到頂部導航欄中。動態內容增加了額外的複雜性,因為它迫使 Web 伺服器在收到請求時獨特地處理許多請求。根據請求定制的內容無法提供給每個人,也無法通用緩存。

內部處理動態內容消除了一個額外的抽象層,該層通常需要將請求傳遞給外部庫。Apache 在本地實現了動態內容處理,使用流行的解決方案堆棧,如 LAMP(Linux、Apache、MySQL、PHP)。Nginx 更具語言無關性,但需要外部庫,如 PHP-FPM,以應對像 LAMP 堆棧這樣的用例。

反向代理功能

A reverse proxy sits in front of a traditional web server, becoming an intermediary server that routes HTTP request traffic to web servers behind it. A reverse proxy becomes the gateway that directs traffic between web servers and the internet at large, and often is the layer that directly interfaces with a firewall. While most web servers have reverse proxy capability, Nginx was built and optimized from the ground up to be a robust reverse proxy server.

Nginx在真實世界的使用中非常重要,其關鍵在於其反向代理功能和效率。許多伺服器配置在Nginx反向代理後面放置多個傳統的Web伺服器,使用Nginx根據負載或規則配置來確定將請求發送到哪個Web伺服器。這種中間人角色使其甚至可以在某些配置中與Apache配對,作為傳統Apache Web伺服器前面的反向代理。

支援生態系統

Nginx和Apache都得到了各自開發團隊和社區的大力支持。作為最受歡迎的開源Web伺服器,學習資源非常豐富。Apache由非營利組織Apache支持,並且始終可免費使用。Nginx的核心是開源的,但理想的功能被鎖定在其Nginx Plus產品提供的功能後面,包括上游健康檢查、會話持久性和高級監控。

傳統Web伺服器的替代方案

如果您想要一個隨時準備回應傳入 HTTP 請求的伺服器,那麼 Web 伺服器是最適合完成這項任務的。隨著您偏離專注於處理 HTTP 請求,Web 伺服器將變得不太理想。尤其是對於 Web 伺服器提供的輔助功能而言,這一點尤其明顯。例如,像是快取之類的功能可能在反向代理或 CDN 層級上更有效地處理,這取決於配置。

此外,隨著開發人員將開發資源專注於管理 Web 伺服器的優先事項發生轉變,出現了像是無伺服器、無頭 CMS 和 Jamstack 等解決方案。這些解決方案不需要自行託管 Web 伺服器,而是將 Web 伺服器層抽象到外部服務中。對於不需要對 Web 伺服器層進行細粒度或高級控制的開發人員來說,開發時間可以專注在其他方面。有關更多信息,請查看這篇關於 Jamstack with headless CMS實現 DigitalOcean 的 App 平台上的全棧 Jamstack 的文章。

結論

在本文中,您已经学习了 Web 服务器的基本入门知识,以及它们的用途和它们试图解决的问题。掌握了这些知识后,您深入了解了当前的 Web 服务器解决方案,并将您的知识应用于找到特别适合您需求的解决方案。要了解更多关于如何设置和使用 Web 服务器的信息,请查看我们的云课程系列中有关 Web 服务器的其余部分。

附加资源

教程:

  • 如何安装 Apache:逐步说明如何设置您的第一个 Apache 服务器。这个解决方案在分散配置方面表现出色,可以实现细粒度控制,并内部处理具有对流行编程语言如 PHP 的挂钩的动态网页。
  • 如何安装 Nginx:逐步说明如何设置您的第一个 Nginx 服务器。这个解决方案在集中配置、提供静态资产、充当反向代理以及处理高并发流量方面表现出色。
  • Apache vs Nginx:实际考虑因素:更深入地了解 Web 服务器解决方案领域的两个主要参与者。

數位海洋產品:

  • 數位海洋Droplets: 虛擬私有伺服器,供您測試和部署網頁伺服器。
  • 數位海洋函數: 無伺服器解決方案,可作為虛擬私有伺服器的替代方案。跳過伺服器維護,專注於應用程式代碼。

Source:
https://www.digitalocean.com/community/conceptual_articles/introduction-to-web-servers