Nginx-03-Nginx 專案架構

老马啸西风發表於2024-05-15

Nginx 現狀

nginx(發音為“engine x”)是一個免費的開源Web伺服器,由俄羅斯軟體工程師Igor Sysoev編寫。自2004年公開發布以來,nginx一直專注於高效能,高併發性和低記憶體使用。

Web伺服器功能之上的其他功能,如負載*衡,快取,訪問和頻寬控制,以及與各種應用程式高效整合的能力,有助於使nginx成為現代網站架構的不錯選擇。

目前,nginx是網際網路上第二大最受歡迎的開源Web伺服器。

14.1。為什麼高併發性很重要?

如今,網際網路如此廣泛和無處不在,很難想象它不是十年前我們所知道的那樣。從簡單的HTML生成可點選文字,基於NCSA,然後是Apache Web伺服器,到全球超過20億使用者使用的永遠線上的通訊媒體,它已經有了很大的發展。隨著永久連線的PC,移動裝置和最*的*板電腦的激增,網際網路領域正在迅速變化,整個經濟已經成為數字連線。線上服務變得更加精細,明顯偏向即時可用的實時資訊和娛樂。執行線上業務的安全方面也發生了重大變化。因此,網站現在比以前複雜得多,並且通常需要更多的工程努力才能具有健壯性和可擴充套件性。

網站架構師面臨的最大挑戰之一就是併發。自Web服務開始以來,併發水*一直在不斷增長。一個流行的網站服務數十萬甚至數百萬同時使用者並不罕見。十年前,併發的主要原因是緩慢的客戶端 - 具有ADSL或撥號連線的使用者。如今,併發性是由移動客戶端和較新的應用程式體系結構的組合引起的,這些體系結構通常基於維護持久連線,該連線允許客戶端使用新聞,推文,朋友訂閱源等進行更新。另一個有助於提高併發性的重要因素是現代瀏覽器的行為改變,它可以開啟四到六個同時連線到網站的連線,以提高頁面載入速度。

為了說明慢客戶端的問題,想象一個簡單的基於Apache的Web伺服器,它產生一個相對較短的100 KB響應 - 一個帶有文字或影像的網頁。生成或檢索此頁面只需幾分之一秒,但需要10秒才能將其傳輸到頻寬為80 kbps(10 KB / s)的客戶端。從本質上講,Web伺服器會相對快速地提取100 KB的內容,然後在釋放連線之前,它將忙於將內容緩慢地傳送到客戶端10秒鐘。現在假設您有1,000個同時連線的客戶,他們請求了類似的內容。如果每個客戶端僅分配1 MB的額外記憶體,則會產生1000 MB(約1 GB)的額外記憶體,專門用於為1000個客戶端提供100 KB的內容。實際上,基於Apache的典型Web伺服器通常為每個連線分配超過1 MB的額外記憶體,令人遺憾的是,幾十kbps仍然是行動通訊的有效速度。雖然在某種程度上透過增加作業系統核心套接字緩衝區的大小來改善向慢速客戶端傳送內容的情況,但這不是解決該問題的一般方法,並且可能具有不良副作用。

對於持久連線,處理併發性的問題更加明顯,因為為了避免與建立新HTTP連線相關聯的延遲,客戶端將保持連線,並且對於每個連線的客戶端,Web伺服器分配了一定量的記憶體。

因此,為了處理與增長的受眾相關的增加的工作量以及因此更高的併發水* - 並且能夠持續這樣做 - 網站應該基於許多非常有效的構建塊。雖然硬體(CPU,記憶體,磁碟),網路容量,應用程式和資料儲存架構等方程式的其他部分顯然很重要,但是在Web伺服器軟體中,客戶端連線被接受和處理。因此,Web伺服器應該能夠隨著每秒同時連線和請求數量的增加而非線性地擴充套件。

Apache不合適嗎?

Apache,這種網路伺服器軟體在很大程度上仍然主宰著網際網路,它的根源在於20世紀90年代初。最初,它的架構與當時存在的作業系統和硬體相匹配,但也與網際網路狀態相匹配,其中網站通常是執行單個Apache例項的獨立物理伺服器。到了2000年代初,很明顯,無法輕鬆複製獨立的Web伺服器模型以滿足不斷增長的Web服務的需求。儘管Apache為未來的開發提供了堅實的基礎,但它的架構是為每個新連線生成自己的副本,這不適合網站的非線性可伸縮性。最終,Apache成為了一個通用的Web伺服器,專注於擁有許多不同的功能,各種第三方擴充套件,以及幾乎任何型別的Web應用程式開發的普遍適用性。然而,沒有任何代價,在單個軟體中擁有如此豐富和通用的工具組合的缺點是可擴充套件性較差,因為每個連線的CPU和記憶體使用量增加。

因此,當伺服器硬體,作業系統和網路資源不再成為網站增長的主要限制時,全球的Web開發人員開始尋找更有效的執行Web伺服器的方法。大約十年前,著名軟體工程師Daniel Kegel宣稱“現在是網路伺服器同時處理一萬個客戶端的時候了”,並預測了我們現在稱之為網際網路雲服務的東西。凱格爾的C10K清單激發了許多嘗試來解決網路伺服器最佳化問題,同時處理大量客戶端,而nginx成為最成功的客戶之一。

旨在解決10,000個同時連線的C10K問題,nginx在編寫時考慮了不同的體系結構 - 一個更適合同時連線數和每秒請求數的非線性可伸縮性。 nginx是基於事件的,因此它不遵循Apache為每個網頁請求生成新程序或執行緒的風格。最終結果是,即使負載增加,記憶體和CPU使用仍然可以管理。 nginx現在可以在具有典型硬體的伺服器上提供數萬個併發連線。

當nginx的第一個版本釋出時,它意味著與Apache一起部署,使得靜態內容(如HTML,CSS,JavaScript和影像)由nginx處理,以解除安裝基於Apache的應用程式伺服器的併發和延遲處理。在開發過程中,nginx透過使用FastCGI,uswgi或SCGI協議以及分散式記憶體物件快取系統(如memcached)增加了與應用程式的整合。還新增了其他有用的功能,例如具有負載*衡和快取的反向代理。這些附加功能使nginx成為有效的工具組合,可構建可擴充套件的Web基礎架構。

2012年2月,Apache 2.4.x分支向公眾釋出。雖然最新版本的Apache增加了新的多處理核心模組和新的代理模組,旨在增強可擴充套件性和效能,但現在判斷它的效能,併發性和資源利用率是否與純事件相當或更好還為時尚早。驅動的Web伺服器。不過,看看Apache應用程式伺服器在新版本中的擴充套件效能會更好,因為它可能會緩解後端方面的瓶頸,這在典型的nginx-plus-Apache Web配置中仍然沒有得到解決。

使用nginx有更多優勢嗎?

以高效能和高效率處理高併發性始終是部署nginx的關鍵優勢。但是,現在有更多有趣的好處。

在過去幾年中,Web架構師已經接受了將其應用程式基礎結構與Web伺服器分離和分離的想法。然而,以前以LAMP(Linux,Apache,MySQL,PHP,Python或Perl)為基礎的網站形式,現在可能不僅僅是一個基於LEMP的(E'代表'引擎x')但是,越來越多的做法是將Web伺服器推向基礎設施的邊緣,並以不同的方式圍繞它整合相同或經過改進的應用程式和資料庫工具集。

nginx非常適合這一點,因為它提供了方便解除安裝併發,延遲處理,SSL(安全套接字層),靜態內容,壓縮和快取,連線和請求限制,甚至來自應用程式的HTTP媒體流所需的關鍵功能層到更有效的邊緣Web伺服器層。它還允許直接與memcached / Redis或其他“NoSQL”解決方案整合,以在為大量併發使用者提供服務時提高效能。

隨著最*開發套件和程式語言的廣泛使用,越來越多的公司正在改變他們的應用程式開發和部署習慣。 nginx已成為這些不斷變化的範例中最重要的組成部分之一,它已經幫助許多公司在預算範圍內快速啟動和開發其Web服務。

nginx的第一行是在2002年編寫的。2004年,它根據雙條款BSD許可證向公眾釋出。從那時起,nginx使用者的數量一直在增長,提供想法,並提交對整個社群非常有幫助和有益的錯誤報告,建議和觀察。

nginx程式碼庫是原創的,完全是用C程式語言從頭開始編寫的。 nginx已經移植到許多架構和作業系統,包括Linux,FreeBSD,Solaris,Mac OS X,AIX和Microsoft Windows。 nginx有自己的庫,其標準模組除了zlib,PCRE和OpenSSL之外不會超出系統的C庫,除非zlib,PCRE和OpenSSL可以選擇從構建中排除,如果不需要或者由於潛在的許可證衝突。

關於Windows版nginx的幾句話。雖然nginx適用於Windows環境,但nginx的Windows版本更像是概念驗證而不是功能齊全的埠。 nginx和Windows核心架構存在某些限制,目前這些架構不能很好地互動。 Windows的nginx版本的已知問題包括併發連線數量少得多,效能下降,沒有快取以及沒有頻寬監管。面向Windows的nginx的未來版本將更緊密地匹配主流功能。

nginx 系列

Nginx-01-聊一聊 nginx

Nginx-01-Nginx 是什麼

Nginx-02-為什麼使用 Nginx

Nginx-02-Nginx Ubuntu 安裝 + windows10 + WSL ubuntu 安裝 nginx 實戰筆記

Nginx-02-基本使用

Nginx-03-Nginx 專案架構

Nginx-04-Docker Nginx

Nginx-05-nginx 反向代理是什麼?windows 下如何配置使用 nginx

Nginx-06-nginx 彙總入門介紹

Nginx R31 doc 官方文件-01-nginx 如何安裝

Nginx R31 doc-02-nginx 基本功能

Nginx R31 doc-03-HTTP Load Balancing HTTP 負載均衡

Nginx R31 doc-04-HTTP Health Checks

Nginx R31 doc-05-Dynamic Configuration of Upstreams with the NGINX Plus API 使用 NGINX Plus API 動態配置上游伺服器

Nginx R31 doc-06-Accepting the PROXY Protocol

Nginx R31 doc-07-內容快取

Nginx R31 doc-08-Configuring NGINX and NGINX Plus as a Web Server 配置 NGINX 和 NGINX Plus 作為 Web 伺服器

Nginx R31 doc-09-Serving Static Content 靜態內容

Nginx R31 doc-10-NGINX Reverse Proxy 反向代理

Nginx R31 doc-11-Compression and Decompression 壓縮與解壓縮

Nginx R31 doc-12-NGINX SSL Termination 安全加密

Nginx R31 doc-13-Limiting Access to Proxied HTTP Resources 訪問限流

Nginx R31 doc-14-Dynamic Denylisting of IP Addresses 動態拒絕IP地址

Nginx R31 doc-15-Live Activity Monitoring 實時活動監控

Nginx R31 doc-16-logging 配置日誌

Nginx R31 doc-17-debugging 除錯

Nginx R31 doc-18-High Availability Support for NGINX Plus in On-Premises Deployments

Nginx 實戰-01-nginx ubuntu 安裝筆記

Nginx 實戰-01-nginx windows 安裝筆記

Nginx 實戰-02-nginx proxy_pass 服務代理訪問 使用筆記 ubuntu nodejs

Nginx 實戰-03-nginx 負載均衡

Nginx 實戰-04-nginx 不同的地址訪問不同的服務

Nginx 實戰-05-nginx 反向代理實現域名到指定的 ip

相關文章