Web伺服器攤牌:Nginx與Apache

正如我們今天所知,互聯網在90年代開始了全球「征服」。整個「Web」協議可以概括為訪問者從給定的Web地址請求文檔,DNS和IP系統將該請求轉發給正確的計算機。該計算機託管所請求的網頁,將「將」網頁「提供」給訪問者。

網頁本質上是HTML文檔。為了能夠向訪問者提供不同的網頁,「服務」機器需要伺服器程序。像Nginx vs Apache這樣的軟體處理請求,分析它們,然後將相應的文檔交回訪問者的瀏覽器中查看。

  • 阿帕奇
  • Nginx的
  • 緩存的問題
  • 處理請求
  • 在現實生活中檢查它

你厭倦了緩慢的WordPress主機和可怕的支持嗎?我們在Kinsta做不同的事情。

查看我們的託管計劃Apache vs Nginx:哪一個為您的WordPress網站提供更快的解決方案? ?查看我們的網路伺服器攤牌!點擊發推文Apache

自從它首先發布以來,我們將首先進入Apache。

在Tim Berners-Lee的CERN httpd和NCSA HTTPd在互聯網的最初幾年之後,Apache – 在1995年首次發布 – 迅速征服了市場並成為世界上最受歡迎的網路伺服器。如今,它仍處於市場地位,但主要是出於傳統原因。 Apache正在Apache許可下開發和維護Apache。

有關Apache如何得名的兩個不同故事。一個版本說這個名字源於著名的美洲原住民遺產,而另一個版本說這個名字是「一個不完整的伺服器」的雙關語,它遵循一系列軟體補丁。

Linux的

Apache的巨大市場份額部分歸功於它預裝了所有主要的Linux發行版,如Red Hat / Centos和Ubuntu。

Ubuntu默認頁面

Ubuntu默認頁面

Apache在Linux世界中的重要作用的一個例子是其伺服器進程名稱是HTTPd,使Apache成為Web伺服器軟體的同義詞。

除了成為Web伺服器市場上第一個重要的參與者之外,Apache的部分擴散是由於其配置系統和.httaccess文件。

的.htaccess

Apache使用.htaccess進行配置。有很多關於如何配置,編輯和使用此文件的教程,因為它在配置Apache處理傳入請求的方式方面提供了很大的靈活性。一些示例包括:不同的重定向規則,最大上載文件大小,URL重寫,內存限制,目錄保護(htpasswd),過期標頭,緩存控制標頭,編碼標頭,cookie,查詢字元串操作。

另一方面,Kinsta使用不支持.htaccess文件的Nginx。但是,.htaccess文件中的設置和規則可以輕鬆地「翻譯」為Nginx自己的重寫規則語法。

Apache的主要「優點」之一是在伺服器根目錄 – 主網站目錄中 – 目錄樹中的每個級別或目錄都可以擁有自己的.httaccess文件及其自己的配置。

對於共享託管服務提供商而言,這是一個夢想,因為他們可以在同一台計算機上為數百名用戶提供配置網站服務方式的方式,而不會影響其他網站。客戶可以在受限制的共享託管環境中配置許多詳細信息,而從不接觸全局伺服器配置。

正如官方文件所說:

「通常,當您無權訪問主伺服器配置文件時,只應使用.htaccess文件。」

然而,這種靈活性是以犧牲性能為代價的「許可.htaccess文件會導致性能下降,無論您是否實際使用它們!」

每次啟用.htaccess文件時,Apache都必須從所請求的URL或文件遍歷整個目錄樹,直到伺服器的根目錄,然後為每個請求載入它們。然後,它需要處理這些文件,並為以這種方式配置的每個目錄重新配置自身。

使用WordPress網站,事情可能變得非常複雜。典型的WordPress網站可以有來自不同目錄的數百個請求。

從/ wp-content / uploads / yyyy / mm類型的目錄,它通常會在單個頁面載入上有多個請求,通常形成不同的月目錄。然後會有/ wp-content / themes / parent-theme靜態資源,/ wp-content / themes / child-theme資源:這些將包括javascript,css文件,圖像。

然後還會有/ wp-content / plugins,其中包含經常從幾十個插件子目錄中載入的靜態文件。對於這些資源中的每一個,Apache必須遍歷其整個樹以查找配置。

一項分析表明,典型的WordPress設置(對於共享主機上的網站而言很常見)將包括42個單獨的.htaccess執行和249個單獨的.htaccess文件查找。

這只是在Web伺服器級別。訪問者仍然需要等待PHP進程執行整個WordPress調用堆棧以創建資料庫查詢並將其提供給MySQL以組裝網頁並將其發送給訪問者。

模塊

讓Apache流行的另一件事是它的動態模塊系統。

模塊 – 作為一種允許用戶擴展Web伺服器功能的功能 – 存在於Nginx和Apache中。 Apache允許用戶在安裝和部署Web伺服器後安裝模塊,然後根據需要啟用/禁用它們。基於Debian的發行版具有允許啟用和禁用這些模塊的命令,而無需編輯任何配置文件:a2enmod和a2dismod。

作為Apache標準分發的一部分的官方模塊列表在這裡,其中包括從壓縮,加密,日誌記錄,重定向到更高級的東西,如編輯請求和使用高級語法的響應。

Nginx的

Nginx(也寫作nginx或NGINX)於2004年問世,當時俄羅斯開發商Igor Sysoev首次公開發布。正如Nginx的項目經理Owen Garrett所說:

「Nginx專門用於解決Apache Web伺服器的性能限制。」

該伺服器最初是作為2002年網站rambler.ru的縮放工具創建的。它有兩個版本:開源,具有BSD類型許可證和Nginx Plus,具有支持和其他企業功能。

在它發布之後,Nginx主要用於提供靜態文件,並在Apache安裝之前用作負載平衡器或反向代理。隨著網路的發展,以及隨著時間的推移擠壓速度和硬體使用效率的最後一步,更多的網站開始完全用Nginx取代Apache,這也要歸功於更成熟的軟體。

NGINX Inc被F5 Networks收購

NGINX Inc被F5 Networks收購

2019年3月,Nginx Inc以6.7億美元被F5 Networks收購。在那一刻,正如Techcrunch報道的那樣,Nginx伺服器正在為「3.75億個網站和大約1,500個付費用戶」提供支持。

根據w3techs的數據,Nginx的市場份額一直在穩步增長,從而將Apache推出並從一開始就廢除它:

Web伺服器用法

Web伺服器用法

這些數據與全球整體網路伺服器有關,但如果我們採用前100萬個網站的樣本,Nginx已經存在了一段時間:

使用Nginx的網站百分比

使用Nginx的網站百分比

Google搜索趨勢似乎也反映了這一事實:

谷歌搜索趨勢:Nginx與Apache

谷歌搜索趨勢:Nginx與Apache

Netcraft調查顯示,Apache已於2019年4月被Nginx取代。

Nginx配置

Nginx沒有像Apache那樣的配置系統,所以儘管它的效率和速度都要高得多,但它並沒有廣泛應用於零售託管服務提供商。它不像Apache那樣在共享環境中閃耀。

另一方面,正如我們所說,通過不允許目錄級配置,Nginx比Apache更具優勢。有一篇關於Nginx維基的文章比較了性能影響:

性能影響Nginx vs Apache.png

性能影響Nginx vs Apache.png

Nginx模塊

Nginx模塊系統是另一個將其定位為更高級選擇的東西。 Nginx模塊通常需要在構建時啟用,這意味著涉及更多的技術實力,並且安裝後添加模塊有點複雜。

在2016年,隨著版本1.9.11,事情發生了變化,官方/驗證的動態模塊存儲庫保留給付費用戶。截至2019年5月,他們宣布開始支持QUIC和HTTP / 3。

緩存問題:Nginx與Apache

緩存 – 如果我們想過度簡化它 – 可以被描繪為在訪問之前為網站訪問者準備內容,這樣當他們「敲門」時,你不需要去尋找他們正在尋找的內容。你已經準備好了,並且無需等待就可以將它交給他們。

與Apache一樣,Nginx的典型設置過去常常位於伺服器和最終用戶之間,以減輕其他基礎架構的性能損失。在這些情況下,它可以緩存靜態內容,而無需每次都從受保護的源伺服器獲取靜態內容。

如果我們將Nginx用作獨立的Web伺服器 – 就像Kinsta LXC容器一樣 – 沒有這樣的需求。 Nginx非常有效地提供靜態內容。

然後是動態緩存或頁面緩存的問題。在WordPress網站的場景中,這意味著將為每個URL生成的所有WordPress頁面存儲在內存或磁碟上。

FastCGI緩存本身可在標準Nginx安裝中使用。它簡單,功能強大,是不太常用的Nginx功能之一。

為了將它與Apache等價物進行比較,你應該知道Apache有mod_cache模塊,據說這個模塊很容易出錯,與其他模塊衝突。因此,使用Apache部署的標準緩存解決方案是Varnish HTTP加速器。雖然Varnish是專門的行業解決方案,但最近的一些測試使得Nginx緩存優於Varnish。

在Kinsta,我們使用Nginx進行動態WordPress緩存,以及專有的緩存插件,允許對緩存的頁面進行精細控制,以及由Kinsta CDN緩存的靜態資源。

你厭倦了緩慢的WordPress主機嗎?我們在伺服器級使用整頁緩存,幾乎可以立即向訪問者提供內容。查看我們的託管計劃

處理請求:Nginx與Apache

Apache和Nginx之間的最大區別在於它們處理請求的方式的底層架構。

Apache使用MPM-s或多處理模塊處理請求,這些模塊「負責綁定到機器上的網路埠,接受請求,並派遣子級來處理請求」。

最早的MPM,可以追溯到Apache的開端,是prefork模塊。僅憑這個模塊就可以歸功於Apache的糟糕表現。在這種模式下,Apache會在每個請求上生成一個帶有一個線程的新進程。

這個模塊與mod_php一起使用,意味著Apache伺服器在每個進程中都嵌入了一個PHP解釋器,即使它必須提供CSS文件或圖像。

這效率很低。 Prefork模塊附帶Apache作為默認模塊。它還限制與HTTP / 1的連接。

在後來的幾年裡,Apache開發了多線程工作者mpm,之後,事件mpm。它們都可以緩解Apache的許多性能問題。切換到php-fpm使得Apache今天仍然可以成為一個競爭解決方案,同時消除了.htaccess的使用,但這種做法無法實現其目的。

Nginx使用非同步,非阻塞事件驅動架構。

解釋不同之處:在Linux / Unix世界中,進程正在運行程序。

線程是進程的子集,並且在一個進程執行中可以有多個線程。可以將其視為瀏覽器窗口中的多個選項卡。這樣,程序可以利用多個CPU和多核,多線程CPU來更快地執行。你可以閱讀Linus Torvalds詳細說明差異。

簡而言之,Apache為每個連接使用進程(並且使用worker mpm它使用線程)。隨著流量的增加,它很快變得太昂貴了。

我們可以想像新的進程或線程創建,如啟動計算機或啟動程序。即使是最快的計算機,它仍然需要一些時間。如今網站在單個頁面載入時會產生數百個請求,這很快就會增加。

事件mpm在優化方面更進一步,但一些測試顯示它無法超越Nginx。特別是當我們談論靜態文件時,Nginx的服務量是Apache的兩倍。

理想情況下,Nginx每個CPU /核心有一個工作進程。 Nginx工作進程的不同之處在於每個工作進程可以處理數十萬個傳入網路連接。無需為每個連接創建新線程或進程。

這就是為什麼主要的內容交付網路,如Cloudflare,MaxCDN和我們的合作夥伴KeyCDN – 或Netflix等網站 – 發現Nginx對其內容交付至關重要的原因。

利用Nginx的公司名單太長,無法全部列出,因此我們將以WordPress.com背後的私人公司Automattic結束。

Automattic在2008年將所有負載均衡器轉換為Nginx for WordPress.com(您可以在此處閱讀)並將其伺服器堆棧完全遷移到Nginx。

在現實生活中檢查它

如果我們想要檢查生產中的網站使用什麼,我們通常可以在HTTP響應標頭中找到它。這意味著我們需要右鍵單擊一個網站> Inspect,在開發人員工具中,我們將選擇網路面板,然後重新載入網站。我們將看到該網站正在載入的所有資源。如果我們選擇任何特定資源及其Headers選項卡,我們通常會看到伺服器信息。如果網站使用CDN,我們可能會在伺服器行中看到類似Cloudflare的內容,或者如果網站使用HTTP加速器,則會看到類似Varnish的內容。

這是一個使用CPanel,Apache和PHP的典型共享主機設置的WordPress網站示例:

Apache http標頭

Apache HTTP標頭

這是一個關於Nginx的網站:

Nginx http標頭

Nginx HTTP標頭

在左側,如果我們擴展它,我們還將能夠分析每個資源的時間並查看其對整個頁面載入時間的影響。

摘要

在本文中,我專註於Nginx與Apache,並解釋了幫助Nginx在Web伺服器領域獲得更多牽引力和關注的主要架構差異。這些是使其在資源匱乏的行業中具有性能優勢的關鍵特徵。

當然,並非每個用例都具有相同的優先順序,而Apache或其他工具如Lighttpd,IIS,LiteSpeed,Caddy可能是很好的解決方案。

在Kinsta,我們使用Nginx作為WordPress和WooCommerce性能優化託管解決方案的一部分。每個WordPress站點都位於自己的獨立容器中,該容器具有運行它所需的所有軟體資源(Nginx,Linux,PHP,MySQL)。資源是100%私有的,不在任何其他站點之間共享。

相關文章