淺析Nginx技術:開源高性能Web服務器與反向代理

什么是Nginx?

????????Nginx是一款輕量級、高性能的HTTP和反向代理服務器,也可以用作郵件代理服務器。它最初由俄羅斯的程序員Igor Sysoev在2004年開發,并于2004年首次公開發布。Nginx的主要優勢在于其非阻塞的事件驅動架構,能夠處理大量并發連接,適用于高流量的網站和服務。

Nginx的發展歷史

????????2002年,Igor Sysoev開始開發Nginx。

????????2004年,Nginx 0.1.0版本發布。

????????2006年,Nginx 0.5.0版本發布,支持SSL和負載均衡。

????????2009年,Nginx 0.7.52版本發布,性能進一步提升。

????????2011年,Nginx 1.0.0版本發布,標志著正式進入成熟階段。

????????2013年,Nginx 1.5.0版本發布,支持HTTP/2協議。

????????2019年,Nginx 1.17.0版本發布,持續優化性能和功能。

Nginx的應用場景

Nginx在各種場景中廣泛應用:

  • 高流量網站和應用服務:Nginx能夠高效處理大量并發請求,是處理高流量網站的理想選擇。
  • 反向代理:作為反向代理服務器,Nginx能夠在客戶端和后端服務器之間分發流量,提升網站的性能和可靠性。
  • 負載均衡:通過負載均衡模塊,Nginx能夠將請求分發到多個后端服務器,實現請求的平衡分配。
  • 靜態文件服務:Nginx優化了對靜態文件的處理,能夠快速響應并提供高可用性的靜態文件服務。
  • Web服務器:作為靜態網頁服務器,提供HTML頁面服務。
  • 緩存服務器:緩存靜態資源,減少后端服務器的負載。
  • HTTP/2支持:Nginx支持HTTP/2協議,提高頁面加載速度。
  • 安全性:Nginx支持SSL/TLS協議,實現數據加密傳輸。
  • 高并發處理:Nginx采用事件驅動模型,處理并發能力較強。

Nginx的技術架構

Nginx的核心技術架構包括:

  • 事件驅動模型:Nginx采用高效的事件驅動架構,通過異步非阻塞的方式處理大量并發連接,減少資源占用。
  • 多進程/線程管理:主進程管理多個工作進程,每個工作進程獨立處理連接和請求,提高了系統的穩定性和可擴展性。
  • 模塊化設計:Nginx支持豐富的模塊化擴展,包括HTTP核心模塊、負載均衡模塊、緩存模塊等,可以根據需求靈活配置和擴展功能。
  • 核心模塊:處理客戶端請求、響應數據、事件處理等核心功能。
  • 事件模塊:采用epoll或kqueue等機制,實現高并發處理。
  • HTTP模塊:處理HTTP請求,支持多種HTTP方法、頭部處理、內容壓縮等。
  • 郵件代理模塊:支持IMAP/POP3/SMTP協議,實現郵件代理功能。
  • Stream模塊:處理TCP和UDP協議,實現四層負載均衡。

Nginx的先進性

????????Nginx最初設計用于解決C10k問題(同時處理一萬個并發連接),并且很快在Web服務器領域獲得了廣泛的認可和使用。隨著互聯網應用的復雜化和需求的增加,Nginx逐步演變為一個功能強大的多用途服務器,支持HTTP、HTTPS、SMTP、POP3、IMAP等協議。Nginx的核心部分主要是用C語言編寫的,能夠提供較高的性能和可靠性。

Nginx的先進性體現在多個方面:

  • 性能優化:Nginx通過精煉的代碼和高效的事件處理機制,實現了出色的性能表現,特別是在高并發場景下。
  • 低資源消耗:相比傳統的Web服務器,Nginx具有更低的內存和CPU消耗,能夠更有效地利用服務器資源。
  • 高可靠性:Nginx經過多年的發展和實戰檢驗,在穩定性和可靠性上表現優異,被廣泛應用于大型企業和互聯網公司的關鍵服務中。
  • 高并發處理能力:Nginx采用事件驅動模型,能夠處理數百萬級別的并發連接。
  • 高度可定制:Nginx支持模塊化設計,可以根據需求添加或刪除模塊。
  • 穩定性:Nginx在實際應用中表現穩定,能夠長時間運行不死機。
  • 社區支持:Nginx擁有活躍的社區,提供豐富的文檔和教程。

同類產品對比

????????與Nginx類似的產品包括Apache HTTP Server、Microsoft IIS等。相比之下,Nginx的優勢主要體現在性能和處理大量并發連接時的效率。Apache雖然功能豐富,但在高并發場景下性能不如Nginx。

????????Apache:Apache是一款老牌的Web服務器,性能穩定,但相較于Nginx在高并發處理能力方面較弱。

????????Tomcat:Tomcat是一款Java Servlet容器,主要用于Java Web應用,與Nginx相比,Tomcat在處理靜態資源方面較弱。

????????IIS:IIS是微軟推出的Web服務器,主要用于Windows平臺,與Nginx相比,IIS在跨平臺方面較弱。

基于Nginx的開源項目

許多開源項目基于Nginx構建,擴展其功能和應用場景:

  • OpenResty:基于Nginx的高性能Web平臺,集成了大量的Lua模塊,用于構建動態內容、負載均衡和高并發應用。
  • Certbot:Let's Encrypt提供的自動化SSL證書管理工具,可以與Nginx無縫集成,實現網站的HTTPS化。
  • ModSecurity:一個開源的Web應用防火墻模塊,可以與Nginx結合使用,提供Web應用的安全防護功能。
  • Tengine:淘寶的Tengine是基于Nginx開發的一個高性能的Web服務器,由淘寶網發起的Nginx分支,增加了一些高級功能,如動態模塊加載、故障轉移等。由阿里巴巴集團自主開發和維護的,旨在滿足其大規模電商平臺的高并發和高可用性需求。Tengine在Nginx的基礎上進行了定制和優化,增加了一些阿里巴巴自身的特定功能和改進,以適應阿里巴巴的特定業務場景和需求。
  • Kong:基于OpenResty的一個API網關,可以實現API的管理和監控。
  • Nginx?Unit:Nginx官方推出的一個動態Web應用服務器,支持多種編程語言。

核心代碼解讀

簡化的Nginx模塊,它展示了如何注冊一個處理函數來處理HTTP請求:

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>static char *ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r);static ngx_command_t ngx_http_mytest_commands[] = {{ ngx_string("mytest"),NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LMT_CONF|NGX_CONF_NOARGS,ngx_http_mytest,NGX_HTTP_LOC_CONF_OFFSET,0,NULL },ngx_null_command
};static ngx_http_module_t ngx_http_mytest_module_ctx = {NULL,                       /* preconfiguration */NULL,                       /* postconfiguration */NULL,                       /* create main configuration */NULL,                       /* init main configuration */NULL,                       /* create server configuration */NULL,                       /* merge server configuration */NULL,                       /* create location configuration */NULL                        /* merge location configuration */
};ngx_module_t ngx_http_mytest_module = {NGX_MODULE_V1,&ngx_http_mytest_module_ctx, /* module context */ngx_http_mytest_commands,    /* module directives */NGX_HTTP_MODULE,             /* module type */NULL,                        /* init master */NULL,                        /* init module */NULL,                        /* init process */NULL,                        /* init thread */NULL,                        /* exit thread */NULL,                        /* exit process */NULL,                        /* exit master */NGX_MODULE_V1_PADDING
};static char *ngx_http_mytest(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) {ngx_http_core_loc_conf_t *clcf;clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);clcf->handler = ngx_http_mytest_handler;return NGX_CONF_OK;
}static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t *r) {if (!r->valid_methods) {return NGX_HTTP_NOT_ALLOWED;}ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0, "mytest handler called!");ngx_str_t type = ngx_string("text/plain");ngx_str_t response = ngx_string("Hello, World!");r->headers_out.status = NGX_HTTP_OK;r->headers_out.content_type = type;ngx_http_send_header(r);r->connection->send(r->connection, response.data, response.len);return NGX_OK;
}

主模塊和工作進程管理

????????Nginx的運行方式由一個主進程和多個工作進程組成。主進程負責啟動和管理工作進程,以及監聽控制信號。
????????在初始化過程中,主進程會創建并初始化工作進程,每個工作進程獨立處理客戶端的連接和請求。
事件驅動的網絡模型:

????????Nginx采用事件驅動和非阻塞I/O模型來處理連接和請求,這使得它能夠高效地處理大量并發連接。
????????核心的事件處理模塊會監聽多個網絡事件,如新連接、數據可讀、數據可寫等,并分發這些事件到相應的處理函數。
HTTP模塊:

????????HTTP模塊是Nginx的核心功能之一,負責解析HTTP請求、構建HTTP響應,以及處理HTTP頭部、狀態碼等。
????????HTTP請求和響應的處理經過多級處理流程,包括解析請求行、頭部、請求體,執行各種配置的處理指令等。
配置文件解析和管理:

????????Nginx的配置文件是基于文本的,并由一個解析器負責解析和處理配置指令。
解析器會讀取配置文件,將配置指令轉換為內部數據結構,供Nginx運行時使用。配置文件的語法和指令定義了Nginx的行為和功能。
負載均衡和反向代理:

????????Nginx支持負載均衡和反向代理,這是其被廣泛使用的重要原因之一。
負載均衡模塊可以根據配置的策略將請求分發到多個后端服務器,以實現請求的均衡和高可用性。
反向代理模塊能夠代理客戶端與真實的服務器之間的通信,并根據需求進行請求的修改和處理。
高性能和優化:

????????Nginx的代碼經過多年的優化和調整,旨在提供高性能和低資源消耗的解決方案。
優化方面包括對內存的高效利用、對CPU的優化、針對多核處理器的并發優化等。

Nginx配置舉例

????????Nginx的配置文件通常位于/etc/nginx/nginx.conf,或者在編譯安裝時指定的其他路徑。配置文件由指令和塊組成,指令可以是簡單的鍵值對,也可以是塊形式的,塊可以包含其他指令。以下是一個基本的Nginx配置示例,它展示了如何設置一個簡單的Web服務器,包括處理HTTP請求和靜態資源服務。

# 定義全局配置
worker_processes  1;  # 設置工作進程數量# 定義事件模塊配置
events {worker_connections  1024;  # 每個工作進程的最大連接數
}# HTTP服務配置
http {include       mime.types;  # 包含 MIME 類型配置文件default_type  application/octet-stream;  # 默認 MIME 類型# 設置日志格式log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;  # 訪問日志路徑和格式error_log   /var/log/nginx/error.log;  # 錯誤日志路徑# 配置服務端口和域名server {listen       80;  # 監聽端口 80server_name  example.com;  # 配置域名# 根據請求路徑匹配location / {root   /usr/share/nginx/html;  # 靜態資源根目錄index  index.html index.htm;  # 默認索引文件}# 反向代理配置location /api/ {proxy_pass http://backend_server;  # 后端服務器地址proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}# 配置自定義錯誤頁面error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}}
}

解釋說明:

  • worker_processes 1;: 設置Nginx使用的工作進程數量,這里是單進程模式。
  • events { ... }: 配置事件模塊,包括每個工作進程的最大連接數等。
  • http { ... }: HTTP服務的主要配置塊。
    • include mime.types;: 包含MIME類型配置文件,定義了文件擴展名與MIME類型之間的映射關系。
    • default_type application/octet-stream;: 默認的MIME類型。
    • log_format main ...;: 配置日志格式和日志文件路徑。
    • access_log /var/log/nginx/access.log main;: 訪問日志的存儲路徑和格式。
    • error_log /var/log/nginx/error.log;: 錯誤日志的存儲路徑。
    • server { ... }: 針對特定域名或IP的服務器配置。
      • listen 80;: 監聽80端口,即HTTP請求的入口。
      • server_name example.com;: 定義服務器名稱,即匹配的域名。
      • location / { ... }: 針對根路徑的配置,指定靜態資源的根目錄和默認索引文件。
      • location /api/ { ... }: 配置反向代理,將以/api/開頭的請求轉發到后端服務器。
        • proxy_pass http://backend_server;: 指定后端服務器的地址。
        • proxy_set_header ...;: 設置代理請求頭,確保傳遞客戶端真實IP等信息。
      • error_page ...: 配置自定義的錯誤頁面,并指定錯誤頁面的存放路徑。
        • location = /50x.html { ... }: 指定500錯誤頁面的具體配置。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/42376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/42376.shtml
英文地址,請注明出處:http://en.pswp.cn/web/42376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue3使用ref綁定組件獲取valueRef.value為null的解決

問題&#xff1a; onMounted(() > {nextTick(()>{console.log(treeselectRef, treeselectRef.value);console.log(treeselectRef.value, treeselectRef.value);}); });輸出&#xff1a; 查看綁定和定義都沒有問題&#xff0c;還是獲取不到 解決&#xff1a;使用getCur…

數據結構第17節 最小堆

最小堆&#xff08;Min Heap&#xff09;是一種特殊的完全二叉樹數據結構&#xff0c;在這種結構中&#xff0c;對于任意節點&#xff0c;其值都小于或等于它的子節點的值。根節點是堆中的最小元素。最小堆常用于實現優先隊列&#xff0c;以及堆排序算法。 在Java中&#xff0…

14-55 劍和詩人29 - RoSA:一種新的 PEFT 方法

介紹 參數高效微調 (PEFT) 方法已成為 NLP 領域研究的熱門領域。隨著語言模型不斷擴展到前所未有的規模&#xff0c;在下游任務中微調所有參數的成本變得非常高昂。PEFT 方法通過將微調限制在一小部分參數上來提供解決方案&#xff0c;從而以極低的計算成本在自然語言理解任務上…

深度學習(筆記內容)

1.國內鏡像網站 pip使用清華源鏡像源 pip install <庫> -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip使用豆瓣的鏡像源 pip install <庫> -i https://pypi.douban.com/simple/ pip使用中國科技大學的鏡像源 pip install <庫> -i https://pypi.mirro…

vite工程化開發配置---持續更新

vite支持tsx開發 根據之前寫的文章vue3vitetseslintprettierstylelinthuskylint-stagedcommitlintcommitizencz-git里面tsconfig配置了jsx相關選項&#xff0c;但是想要vite能夠識別我們還需要配置一下 安裝vitejs/plugin-vue-jsx pnpm i -D vitejs/plugin-vue-jsxvite.confi…

Scapy庫實現SYN洪水攻擊的Python腳本

Scapy庫實現SYN洪水攻擊的Python腳本 代碼用于學習熟悉Scapy庫及其在網絡安全研究和測試中提供的各種選項和功能 腳本旨在執行SYN洪水攻擊,這是一種分布式拒絕服務(DDoS)攻擊的類型。未經授權參與此類攻擊通常是違法的,可能會產生嚴重后果 代碼 SynFlood.py from scapy.all…

Google 搜索引擎:便捷高效、精準查詢,帶來無與倫比的搜索體驗

Google搜索引擎不僅具備檢索功能&#xff0c;實則是引領探索萬千世界的神秘鑰匙。試想&#xff0c;無論何時何地&#xff0c;只需輕觸屏幕&#xff0c;所需信息即可唾手可得。便捷與高效&#xff0c;令人嘆為觀止。其界面設計簡約直觀&#xff0c;操控體驗猶如與未來對話&#…

如何壓縮pdf文件大小,怎么壓縮pdf文件大小

在數字化時代&#xff0c;pdf文件因其穩定的格式和跨平臺兼容性&#xff0c;成為了工作與學習中不可或缺的一部分。然而&#xff0c;隨著pdf文件內容的豐富&#xff0c;pdf文件的體積也隨之增大&#xff0c;給傳輸和存儲帶來了不少挑戰。本文將深入探討如何高效壓縮pdf文件大小…

小米手機短信怎么恢復?不用求人,3個技巧一網打盡

當你突然發現安卓手機里的重要短信不見了&#xff0c;是不是感到一陣心慌意亂&#xff1f;別急&#xff0c;不用求人&#xff0c;更不用焦慮。作為基本的社交功能&#xff0c;短信是我們與外界溝通的重要橋梁&#xff0c;當刪除后&#xff0c;短信怎么恢復呢&#xff1f;今天&a…

重生奇跡MU 有向導不迷路

歡迎來到重生奇跡MU冒險世界&#xff01;為了讓您更好地享受游戲樂趣&#xff0c;我們特別為您準備了一位貼心的導游&#xff0c;讓您在游戲中不再迷路。跟隨我們的導游&#xff0c;您將更快地了解游戲規則&#xff0c;更快地升級&#xff0c;更快地獲得勝利&#xff01;快來加…

【pytorch23】MNIST測試實戰

理解 訓練完之后也需要做測試 為什么要做test&#xff1f; 上圖藍色代表train的accuracy 下圖藍色代表train的loss 基本上符合預期&#xff0c;隨著epoch增大&#xff0c;train的accuracy也會上升&#xff0c;loss也會一直下降&#xff0c;下降到一個較小的程度 但是如果只看…

Java:使用synchronized和Redis實現并發控制的區別

在線程同步中&#xff0c;synchronized和Redis雖然都可以用來實現并發控制&#xff0c;但它們的作用范圍、機制以及性能特點存在顯著差異。 1. 作用范圍 synchronized: 是Java語言內置的關鍵字&#xff0c;用于實現線程間的同步。它作用于對象或代碼塊&#xff0c;可以確保同一…

你手上有offer嗎?

作者&#xff1a;猿java。 ?順便吆喝一聲&#xff0c;如果你計算機、軟件工程、電子等相關專業本科及以上學歷&#xff0c;歡迎來共事&#xff0c;有個offer注意查收。 前端/后端/測試等均可投→技術大廠機會。 都說面試是 7分靠技術&#xff0c;3分靠技巧&#xff0c;今天我…

9.2 柵格圖層符號化單波段灰度渲染

文章目錄 前言單波段灰度QGis設置為單波段灰度二次開發代碼實現單波段灰度 總結 前言 介紹柵格圖層數據渲染之單波段灰度顯示說明&#xff1a;文章中的示例代碼均來自開源項目qgis_cpp_api_apps 單波段灰度 以“3420C_2010_327_RGB_LATLNG.tif”數據為例&#xff0c;在QGis中…

easy-poi實現動態列(標題)、多sheet導出excel

一個sheet動態導出、偽代碼&#xff0c;創建填充后的workbook對象 List<Map<String, Object>>list new ArrayList<Map<String, Object>>(); HashMap<String, Object> map new HashMap<>(); map.put("name", "小明")…

啟動完 kubelet 日志顯示 failed to get azure cloud in GetVolumeLimits, plugin.host: 1

查看 kubelet 日志組件命令 journalctl -xefu kubelet 文字描述問題 Jul 09 07:45:17 node01 kubelet[1344]: I0709 07:45:17.410786 1344 operation_generator.go:568] MountVolume.SetUp succeeded for volume "default-token-mfzqf" (UniqueName: "ku…

全光譜燈和普通led燈的區別?忠告行業三大隱患弊端!

隨著社會的迅猛發展和生活步伐的加速&#xff0c;科技產品層出不窮&#xff0c;其中全光譜燈作為書房的新寵&#xff0c;備受矚目。它是否真如其宣傳的那樣具有多重優勢&#xff0c;尤其是對那些格外注重視力健康的人群而言&#xff0c;全光譜燈是否會帶來潛在的健康風險&#…

【北京迅為】《i.MX8MM嵌入式Linux開發指南》-第一篇 嵌入式Linux入門篇-第十二章 Linux 權限管理

i.MX8MM處理器采用了先進的14LPCFinFET工藝&#xff0c;提供更快的速度和更高的電源效率;四核Cortex-A53&#xff0c;單核Cortex-M4&#xff0c;多達五個內核 &#xff0c;主頻高達1.8GHz&#xff0c;2G DDR4內存、8G EMMC存儲。千兆工業級以太網、MIPI-DSI、USB HOST、WIFI/BT…

Java基礎(十六):String的常用API

目錄 一、構造器方法二、String與字節數組的轉換&#xff08;編碼與解碼&#xff09;1、字符串 --> 字節數組&#xff1a;&#xff08;編碼&#xff09;2、字節數組 --> 字符串&#xff1a;&#xff08;解碼&#xff09;3、iso-8859-1的特殊用法4、byte數組的數字表示 三…

Java版Flink使用指南——從RabbitMQ中隊列中接入消息流

大綱 創建RabbitMQ隊列新建工程新增依賴編碼設置數據源配置讀取、處理數據完整代碼 打包、上傳和運行任務測試 工程代碼 在《Java版Flink使用指南——安裝Flink和使用IntelliJ制作任務包》一文中&#xff0c;我們完成了第一個小型Demo的編寫。例子中的數據是代碼預先指定的。而…