Nginx 的請求處理流程,你瞭解嗎?

来源:https://www.cnblogs.com/wupeixuan/archive/2019/11/10/11832016.html
-Advertisement-
Play Games

之前我們已經講解了 Nginx 的基礎內容,接下來我們開始介紹 Nginx 的架構基礎。 為什麼我們要討論 Nginx 的架構基礎? 因為 Nginx 運行在企業內網的最外層也就是邊緣節點,那麼他處理的的流量是其他應用伺服器處理流量的數倍,甚至幾個數量級,我們知道任何一種問題在不同的數量級下,他的解 ...


之前我們已經講解了 Nginx 的基礎內容,接下來我們開始介紹 Nginx 的架構基礎。

為什麼我們要討論 Nginx 的架構基礎?

因為 Nginx 運行在企業內網的最外層也就是邊緣節點,那麼他處理的的流量是其他應用伺服器處理流量的數倍,甚至幾個數量級,我們知道任何一種問題在不同的數量級下,他的解決方案是完全不同的,所以在 Nginx 它所處理的應用場景中,所有的問題都會被放大,所以我們必須要去理解,為什麼 Nginx 採用 master-worker 這樣的一種架構模型,為什麼 worker 進程的數量要和 CPU 的核數相匹配?當我們需要在多個 worker 進程之間共用數據的時候,為什麼在 TLS 或者說限流、限速這樣的場景,他們的共用方式是有所不同的,那麼這些都需要我們對 Nginx 的架構有一個清晰的瞭解。

下麵我們先來看一下 Nginx 的請求處理流程。

為什麼要去看 Nginx 中的請求處理流程呢?因為其實在之前中我們瞭解到 Nginx 會記錄 access 日誌和 error 日誌,也可以處理靜態的資源,那麼也可以做反向代理,那麼這些東西我們從 Nginx 內部去看他究竟是怎樣處理這些請求,它包含一些什麼樣的組成部分呢?

Nginx 的請求處理流程

Nginx的請求處理流程

我們從這張圖的最左邊來看,最左邊在 WEB、EMAIL 和 TCP,也就是說大致有三種流量從這裡進入 Nginx 以後,我們 Nginx 中有三個大的狀態機,一個是處理 TCP/UDP 的 4 層的傳輸層狀態機和處理應用層的 HTTP 狀態以及處理郵件的 MAIL 狀態機。

那麼為什麼我們叫它狀態機呢?是因為 Nginx 核心的這個大綠色的框他是用非阻塞的事件驅動處理引擎就是用我們所熟知的 epoll,那麼一旦我們使用這種非同步處理引擎以後,通常都是需要用狀態機來把這個請求正確的識別和處理。

基於這樣的一種事件狀態處理機,我們在解析出請求需要訪問靜態資源的時候,我們看到走左下方的這個箭頭,那麼它就找到了靜態資源,如果我們去做反向代理的時候呢,那麼對反向代理的內容,我可以做磁碟緩存,緩存到磁碟上,也在下麵左下方這條線,但是我們在處理靜態資源的時候,會有一個問題就是當整個記憶體已經不足以完全的緩存所有的文件和信息的時候,那麼像 send File 這樣的調用或者 AIO 會退化成阻塞的磁碟調用,所以在這裡我們需要有一個線程池來處理,對於每一個處理完成的請求呢,我們會進入 access 日誌或 error 日誌。

那麼這裡也是進入了磁碟中的,當然我們可以通過 syslog 協議把它進入到遠程的機器上,那麼更多的時候我們的 Nginx 是作為負載均衡或者反向代理來使用的,就是我們可以把請求通過協議級(HTTP,Mail 及 stream(TCP))傳輸到後面的伺服器,也可以通過例如應用層的一些協議(FastCGI、uWSGI、SCGI、memcached)代理到相應的應用伺服器。以上就是 Nginx 的請求處理流程。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (手機橫屏看源碼更方便) 簡介 線程系列我們基本就學完了,這一個系列我們基本都是圍繞著線程池在講,其實關於線程還有很多東西可以講,後面有機會我們再補充進來。當然,如果你有什麼好的想法,也可以公從號右下角聯繫我。 重要知識點 直接上圖,看著這張圖我相信你能夠回憶起很多東西,也可以看著這張圖來自己提問自 ...
  • 一、常量 1.常量的定義:final修飾的實例變數是不可變的,這種變數一般和static聯合使用,被稱為“常量” 2.常量的語法格式: public static final 類型 常量名 = 值; java規範中要求所有常量的名字全部大寫,每個單詞之間使用下劃線連接 package com.bjp ...
  • 新聞 "邀請博客主們:2019年的F Advent日曆" "宣告ML.NET 1.4" ".NET Core與Jupyter筆記本" "在Jupyter筆記本中使用ML.NET" "用於Windows桌面的.NET Core 3" "宣告.NET Core 3.1預覽版2" "在.NET Core ...
  • PSR是PHP Standards Recommendation的簡稱,意為PHP推薦標準。要想瞭解PSR,首先得知道制定這一標準的人/組織是誰————PHP-FIG。 PHP-FIG PHP-FIG全稱為PHP Framework Interop Group,是一個組織,這個組織的成員由一些PHP ...
  • echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! Redis在我們平時的開發或者練習的時候,往往很容易忽略一個問題,那就是我們的Redis記憶體占滿的問題。但 ...
  • echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! Redis的實際被應用都是因為它的性能,在眾多緩存中Redis也是一個比較快的中間件,而且它是單線程操作, ...
  • echo編輯整理,歡迎轉載,轉載請聲明文章來源。歡迎添加echo微信(微信號:t2421499075)交流學習。 百戰不敗,依不自稱常勝,百敗不頹,依能奮力前行。——這才是真正的堪稱強大!!! 該文章是對應前面Redis的使用,基本數據類型在SpringBoot項目的實現和使用。網上有很多的文章來描 ...
  • Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程式和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...