關於Nginx處理HTTP請求的11個階段流程

来源:https://www.cnblogs.com/ashjo009/archive/2020/05/07/12844341.html
-Advertisement-
Play Games

nginx實際把http請求處理流程劃分為了11個階段,這樣劃分的原因是將請求的執行邏輯細分,以模塊為單位進行處理,各個階段可以包含任意多個http模塊並以流水線的方式處理請求。這樣做的好處是使處理過程更加靈活、降低耦合度。可以讓每個HTTP模塊可以僅僅專註於完成一個獨立,簡單的功能。而一個請求的完 ...


nginx實際把http請求處理流程劃分為了11個階段,這樣劃分的原因是將請求的執行邏輯細分,以模塊為單位進行處理,各個階段可以包含任意多個http模塊並以流水線的方式處理請求。這樣做的好處是使處理過程更加靈活、降低耦合度。可以讓每個HTTP模塊可以僅僅專註於完成一個獨立,簡單的功能。而一個請求的完整處理過程可以由多個HTTP模塊共同合作完成。可以極大的提高多個模塊合作的協同性,可測試性,可擴展性。換言之,nginx在處理每一個http請求,和配置文件上的順序沒有關係。這11個http階段如下所示:

1)ngx_http_post_read_phase:

接收到完整的http頭部後處理的階段,它位於uri重寫之前,實際上很少有模塊會註冊在該階段,預設的情況下,該階段被跳過。

最先執行的 post-read 階段在 Nginx 讀取並解析完請求頭(request headers)之後就立即開始運行。例如:使用了 ngx_realip 模塊提供的 set_real_ip_from 和 real_ip_header 這兩條配置指令

2)ngx_http_server_rewrite_phase:

uri與location匹配前,修改uri的階段,用於重定向,也就是該階段執行處於server塊內,location塊外的重寫指令,在讀取請求頭的過程中nginx會根據host及埠找到對應的虛擬主機配置。

由於 server-rewrite 階段位於 post-read 階段之後,所以 server 配置塊中的 set 指令也就總是運行在 ngx_realip 模塊改寫請求的來源地址之後。

3)ngx_http_find_config_phase:

根據uri尋找匹配的location塊配置項階段,該階段使用重寫之後的uri來查找對應的location,值得註意的是該階段可能會被執行多次,因為也可能有location級別的重寫指令。

這個階段並不支持 Nginx 模塊註冊處理程式,而是由 Nginx 核心來完成當前請求與 location 配置塊之間的配對工作。換句話說,在此階段之前,請求並沒有與任何 location 配置塊相關聯。因此,對於運行在 find-config 階段之前的 post-read 和 server-rewrite 階段來說,只有 server 配置塊以及更外層作用域中的配置指令才會起作用。這就是為什麼只有寫在 server 配置塊中的 ngx_rewrite 模塊的指令才會運行在 server-rewrite 階段,這也是為什麼前面所有例子中的 ngx_realip 模塊的指令也都特意寫在了 server 配置塊中,以確保其註冊在 post-read 階段的處理程式能夠生效。

4)ngx_http_rewrite_phase:

上一階段找到location塊後再修改uri,location級別的uri重寫階段,該階段執行location基本的重寫指令,也可能會被執行多次。

由於 Nginx 已經在 find-config 階段完成了當前請求與 location 的配對,所以從 rewrite 階段開始,location 配置塊中的指令便可以產生作用。當 ngx_rewrite 模塊的指令用於 location 塊中時,便是運行在這個 rewrite 階段。

5)ngx_http_post_rewrite_phase:

防止重寫url後導致的死迴圈,location級別重寫的後一階段,用來檢查上階段是否有uri重寫,並根據結果跳轉到合適的階段。

這個階段也像 find-config 階段那樣不接受 Nginx 模塊註冊處理程式,而是由 Nginx 核心完成 rewrite 階段所要求的“內部跳轉”操作(如果 rewrite 階段有此要求的話)。例如:通過 rewrite 指令把當前請求的 URI 無條件地改寫為 /bar,同時發起一個“內部跳轉”,最終跳進了 location /bar 中。這裡比較有趣的地方是“內部跳轉”的工作原理。“內部跳轉”本質上其實就是把當前的請求處理階段強行倒退到 find-config 階段,以便重新進行請求 URI 與 location 配置塊的配對。

6)ngx_http_preaccess_phase:

下一階段之前的準備,訪問許可權控制的前一階段,該階段在許可權控制階段之前,一般也用於訪問控制,比如限制訪問頻率,鏈接數等。

該階段在 access 階段之前執行,故名 preaccess.標準模塊 ngx_limit_req 和 ngx_limit_zone 就運行在此階段,前者可以控制請求的訪問頻度,而後者可以限制訪問的併發度。

7)ngx_http_access_phase:

讓http模塊判斷是否允許這個請求進入nginx伺服器,訪問許可權控制階段,比如基於ip黑白名單的許可權控制,基於用戶名密碼的許可權控制等。

標準模塊 ngx_access、第三方模塊 ngx_auth_request 以及第三方模塊 ngx_lua 的 access_by_lua 指令就運行在這個階段。

8)ngx_http_post_access_phase:

訪問許可權控制的後一階段,該階段根據許可權控制階段的執行結果進行相應處理,向用戶發送拒絕服務的錯誤碼,用來響應上一階段的拒絕。

這個階段也和 post-rewrite 階段類似,並不支持 Nginx 模塊註冊處理程式,而是由 Nginx 核心自己完成一些處理工作。post-access 階段主要用於配合 access 階段實現標準 ngx_http_core 模塊提供的配置指令 satisfy 的功能。對於多個 Nginx 模塊註冊在 access 階段的處理程式, satisfy 配置指令可以用於控制它們彼此之間的協作方式。比如模塊 A 和 B 都在 access 階段註冊了與訪問控制相關的處理程式,那就有兩種協作方式,一是模塊 A 和模塊 B 都得通過驗證才算通過,二是模塊 A 和模塊 B 只要其中任一個通過驗證就算通過。第一種協作方式稱為 all 方式(或者說“與關係”),第二種方式則被稱為 any 方式(或者說“或關係”)。預設情況下,Nginx 使用的是 all 方式。

9)ngx_http_try_files_phase:

為訪問靜態文件資源而設置,try_files指令的處理階段,如果沒有配置try_files指令,則該階段被跳過。

這個階段專門用於實現標準配置指令 try_files 的功能,並不支持 Nginx 模塊註冊處理程式。try_files 指令接受兩個以上任意數量的參數,每個參數都指定了一個 URI. 這裡假設配置了 N 個參數,則 Nginx 會在 try-files 階段,依次把前 N-1 個參數映射為文件系統上的對象(文件或者目錄),然後檢查這些對象是否存在。一旦 Nginx 發現某個文件系統對象存在,就會在 try-files 階段把當前請求的 URI 改寫為該對象所對應的參數 URI(但不會包含末尾的斜杠字元,也不會發生 “內部跳轉”)。如果前 N-1 個參數所對應的文件系統對象都不存在,try-files 階段就會立即發起“內部跳轉”到最後一個參數(即第 N 個參數)所指定的 URI.通過 root 配置指令所指定的“文檔根目錄”進行映射。例如,當“文檔根目錄”是 /var/www/ 的時候,請求 URI /foo/bar 會被映射為文件 /var/www/foo/bar,而請求 URI /foo/baz/ 則會被映射為目錄 /var/www/foo/baz/. 註意這裡是如何通過 URI 末尾的斜杠字元是否存在來區分“目錄”和“文件”的。

10)ngx_http_content_phase:

處理http請求內容的階段,大部分http模塊介入這個階段,內容生成階段,該階段產生響應,併發送到客戶端。

Nginx 的 content 階段是所有請求處理階段中最為重要的一個,因為運行在這個階段的配置指令一般都肩負著生成“內容”(content)並輸出 HTTP 響應的使命。正因為其重要性,這個階段的配置指令也異常豐富。如echo、 echo_exec 指令, proxy_pass 指令, echo_location 指令,content_by_lua

11)ngx_http_log_phase:

log階段處理,比如記錄訪問量/統計平均響應時間。log_by_lua

處理完請求後的日誌記錄階段,該階段記錄訪問日誌。

以上11個階段中,http無法介入的階段有4個:

3)ngx_http_find_config_phase

5)ngx_http_post_rewrite_phase

8)ngx_http_post_access_phase

9)ngx_http_try_files_phase

剩餘的7個階段,http模塊均能介入,每個階段可介入模塊的個數也是沒有限制的,多個http模塊可同時介入同一階段並作用於同一請求。

 

 

參考博客:https://www.cnblogs.com/zhenyuyaodidiao/p/9288430.html

https://www.cnblogs.com/vinsent/p/12259287.html

 


 


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

-Advertisement-
Play Games
更多相關文章
  • EFCore數據操作 ...
  • 0. 前言 這是C 基礎知識系列的最後一個內容講解篇,下一篇是基礎知識 實戰篇。這一篇主要講解一下C 程式的結構和主要編程工具。 1. 工具 工欲善其事必先利其器,在實際動手之前我們先來看看想要編寫一套C 程式需要做哪些準備吧。 1.1 選擇 C 的sdk在之前的某個時間點分為了三個方向: 1. . ...
  • 關於數據類型 c#的類型一般分為值類型和引用類型兩種, 值類型的變數包含類型的實例,值類型存放棧中 引用類型的變數包含對類型實例的引用,引用類型放在堆中,在棧中設置一個指針指向堆 值類型: 1.整數型數值:所有的整型數值類型均為值類型,可以用文本進行初始化,每個整型類型的預設值都是0,c#支持以下預 ...
  • 今年年初進了一家新公司,進入之後一邊維護老項目一邊瞭解項目流程,為了接下來的項目重做積累點經驗。 先說下老項目吧,.net fx 3.5+oracle...... 在實際維護中逐漸發現,老項目有標準版、定製版兩種,標準版就是一套代碼,粗略計算了下,全部版本加起來有20+個版本,如果項目重做後還是依照 ...
  • 環境和工具 服務端電腦IP:192.168.1.130 客戶端電腦IP:192.168.1.120 1、在服務端電腦運行 "IoTClientTool" 2、運行 "Wireshark" 3、在客戶端電腦運行 "IoTClientTool" 4、Wireshark得到如下報文 報文分析,plc的連接 ...
  • 一次HTTP請求,就是一次標準IO操作。請求是I,是輸入;響應式O,是輸出。任何web開發框架,其實都是在乾這兩件事: + 接受請求併進行解析獲取參數 + 根據參數進行渲染並輸出響應內容 所以我們學習一個框架,我認為最首要的是知道如何從請求中獲取參數。http請求攜帶參數的地方主要有下麵幾個地方: ...
  • Ansible Tests 詳解與使用案例 主機規劃 添加用戶賬號 說明: 1、 運維人員使用的登錄賬號; 2、 所有的業務都放在 /app/ 下「yun用戶的家目錄」,避免業務數據亂放; 3、 該用戶也被 ansible 使用,因為幾乎所有的生產環境都是禁止 root 遠程登錄的(因此該 yun ...
  • 應用系統分散式構建運維 1+x初級,項目四 部署主從資料庫 基礎環境安裝 準備兩台主機 修改主機名 # hostnamectl set-hostname mysql1 # hostnamectl set-hostname mysql2 關閉防火牆及SELinux服務(兩個節點) # setenfor ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...