Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_conf_add_dump

ngx_conf_add_dump


定義src\core\ngx_conf_file.c

static ngx_int_t
ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename)
{off_t             size;u_char           *p;uint32_t          hash;ngx_buf_t        *buf;ngx_str_node_t   *sn;ngx_conf_dump_t  *cd;hash = ngx_crc32_long(filename->data, filename->len);sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash);if (sn) {cf->conf_file->dump = NULL;return NGX_OK;}p = ngx_pstrdup(cf->cycle->pool, filename);if (p == NULL) {return NGX_ERROR;}cd = ngx_array_push(&cf->cycle->config_dump);if (cd == NULL) {return NGX_ERROR;}size = ngx_file_size(&cf->conf_file->file.info);buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);if (buf == NULL) {return NGX_ERROR;}cd->name.data = p;cd->name.len = filename->len;cd->buffer = buf;cf->conf_file->dump = buf;sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t));if (sn == NULL) {return NGX_ERROR;}sn->node.key = hash;sn->str = cd->name;ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node);return NGX_OK;
}

函數 ngx_conf_add_dump 的作用和意義可以通俗理解為:

作用
這個函數負責將 Nginx 的配置文件內容緩存到內存中,并記錄文件信息,避免重復加載相同的配置文件。

具體步驟

  1. 檢查是否已緩存:通過哈希值快速判斷當前配置文件是否已經被緩存過。
  2. 緩存新文件:如果未緩存,則將文件內容讀取到內存緩沖區,并記錄文件名和哈希值。
  3. 避免重復:通過紅黑樹(一種高效的數據結構)管理已緩存的文件信息,確保同一個文件不會被多次加載。

意義

  • 提升性能:減少重復讀取磁盤文件的開銷,加快配置加載速度。
  • 節省資源:避免多次解析相同配置文件,降低內存和 CPU 的消耗。
  • 支持動態重載:在 Nginx 重載配置時,能快速復用已緩存的配置數據,提高服務穩定性。

簡單來說,這個函數就像是給配置文件做了一個“快照”,需要時直接從內存讀取,而不是每次都從磁盤重新加載,從而讓 Nginx 更高效地管理配置。


函數簽名

static ngx_int_t ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename);

1. static 關鍵字

  • 作用:表示該函數是文件作用域的,只能在當前源文件(ngx_conf_file.c)中被調用,其他文件無法直接訪問。
  • 意義:限制函數的可見性,避免外部誤用,增強代碼的封裝性。

2. 返回值類型 ngx_int_t

  • 類型定義ngx_int_t 是 Nginx 自定義的整數類型(通常為 typedef int ngx_int_t),用于統一表示函數執行結果。
  • 返回值含義
    • NGX_OK:表示函數執行成功(通常返回值為 0)。
    • NGX_ERROR:表示函數執行失敗(通常返回值為 -1)。
  • 設計目的:通過統一的返回值類型,簡化錯誤處理邏輯。

3. 參數 ngx_conf_t *cf

  • 類型ngx_conf_t 是 Nginx 的配置解析上下文結構體,包含解析配置時所需的所有狀態信息。
  • 作用
    • 提供內存池(cf->pool)用于動態內存分配。
    • 傳遞當前配置文件的句柄(cf->conf_file)。
    • 關聯 Nginx 的全局運行時數據(通過 cf->cycle,即 ngx_cycle_t 結構體)。
  • 關鍵字段
    • cf->cycle->config_dump_rbtree:紅黑樹,用于記錄已緩存的配置文件信息。
    • cf->cycle->config_dump:數組,存儲實際緩存的配置文件內容。
    • cf->temp_pool:臨時內存池,用于分配短期使用的數據結構。

4. 參數 ngx_str_t *filename

  • 類型ngx_str_t 是 Nginx 自定義的字符串類型,定義為:
    typedef struct {size_t      len;   // 字符串長度u_char     *data;  // 字符串內容(指向二進制數據)
    } ngx_str_t;
    
  • 作用:指定需要緩存的配置文件路徑(如 nginx.conf)。
  • 特點
    • 支持二進制安全(通過 len 明確長度,而非依賴 \0 結尾)。
    • 允許文件名中包含特殊字符(如空格、中文等)。

詳解

static ngx_int_t
ngx_conf_add_dump(ngx_conf_t *cf, ngx_str_t *filename)
{off_t             size;u_char           *p;uint32_t          hash;ngx_buf_t        *buf;ngx_str_node_t   *sn;ngx_conf_dump_t  *cd;
變量聲明
  • off_t size:用于存儲配置文件的大小(字節數)。
  • u_char *p:指向動態分配的內存,用于復制文件名。
  • uint32_t hash:存儲文件名的哈希值,用于快速查找。
  • ngx_buf_t *buf:指向緩沖區,用于存儲配置文件內容。
  • ngx_str_node_t *sn:紅黑樹節點,記錄文件名和哈希值。
  • ngx_conf_dump_t *cd:配置轉儲結構體,包含文件名和緩沖區。

    hash = ngx_crc32_long(filename->data, filename->len);
計算文件名的哈希值
  • 作用:通過 ngx_crc32_long 函數計算文件名的 CRC32 哈希值。
  • 設計意圖:哈希值用于快速判斷文件是否已被緩存(紅黑樹的鍵)。

    sn = ngx_str_rbtree_lookup(&cf->cycle->config_dump_rbtree, filename, hash);
查詢紅黑樹
  • 作用:在紅黑樹(config_dump_rbtree)中查找是否已存在相同文件名的節點。
  • 參數
    • &cf->cycle->config_dump_rbtree:全局紅黑樹,存儲所有已緩存的文件信息。
    • filename:當前要緩存的文件名。
    • hash:文件名的哈希值。
  • 返回值:如果找到節點,返回對應的 ngx_str_node_t;否則返回 NULL
  • 設計意圖:避免重復緩存同一文件,節省內存和 I/O 開銷。

    if (sn) {cf->conf_file->dump = NULL;return NGX_OK;}
處理已緩存的文件
  • 邏輯:如果文件已存在(sn != NULL),則直接標記當前配置文件的 dumpNULL,表示不需要重復緩存。

    p = ngx_pstrdup(cf->cycle->pool, filename);if (p == NULL) {return NGX_ERROR;}
復制文件名
  • 作用:通過 ngx_pstrdup 在內存池中復制文件名。
  • 參數
    • cf->cycle->pool:全局內存池,生命周期與 Nginx 進程一致。
    • filename:需要復制的文件名。
  • 錯誤處理:如果內存分配失敗,返回 NGX_ERROR

    cd = ngx_array_push(&cf->cycle->config_dump);if (cd == NULL) {return NGX_ERROR;}
向配置轉儲數組添加新條目
  • 作用:將新的 ngx_conf_dump_t 結構體添加到 config_dump 數組中。
  • 參數&cf->cycle->config_dump 是存儲所有緩存文件信息的數組。
  • 錯誤處理:如果內存分配失敗,返回 NGX_ERROR
  • 設計意圖:數組用于后續快速遍歷所有緩存的配置文件。

    size = ngx_file_size(&cf->conf_file->file.info);
獲取文件大小
  • 作用:通過 ngx_file_size 宏獲取當前配置文件的大小。
  • 參數cf->conf_file->file.info 是文件的元信息結構體。
  • 設計意圖:為緩沖區分配足夠的內存以存儲文件內容。

    buf = ngx_create_temp_buf(cf->cycle->pool, (size_t) size);if (buf == NULL) {return NGX_ERROR;}
創建臨時緩沖區
  • 作用:在內存池中分配一個臨時緩沖區 buf,大小為文件內容長度。
  • 參數
    • cf->cycle->pool:全局內存池。
    • (size_t) size:緩沖區大小。
  • 錯誤處理:分配失敗時返回 NGX_ERROR
  • 設計意圖:將文件內容一次性讀入內存,避免重復磁盤 I/O。

    cd->name.data = p;cd->name.len = filename->len;cd->buffer = buf;
填充配置轉儲結構體
  • 作用:將文件名和緩沖區關聯到 cd 結構體。
  • 字段說明
    • cd->name:保存文件名的字符串(datalen)。
    • cd->buffer:指向存儲文件內容的緩沖區。
  • 設計意圖:統一管理文件名和內容,便于后續快速訪問。

    cf->conf_file->dump = buf;
標記當前文件的緩存狀態
  • 作用:將當前配置文件的 dump 指針指向緩沖區 buf
  • 設計意圖:在解析配置時,通過 dump 判斷是否需要從內存中讀取內容。

    sn = ngx_palloc(cf->temp_pool, sizeof(ngx_str_node_t));if (sn == NULL) {return NGX_ERROR;}
分配紅黑樹節點
  • 作用:在臨時內存池中分配一個紅黑樹節點 sn
  • 參數
    • cf->temp_pool:臨時內存池,生命周期可能短于全局內存池。
    • sizeof(ngx_str_node_t):節點大小。
  • 錯誤處理:分配失敗時返回 NGX_ERROR
  • 設計意圖:臨時內存池用于短期數據,避免全局內存池膨脹。

    sn->node.key = hash;sn->str = cd->name;
初始化紅黑樹節點
  • 作用:將哈希值和文件名字符串關聯到紅黑樹節點。
  • 字段說明
    • sn->node.key:哈希值作為紅黑樹的鍵。
    • sn->str:文件名字符串,用于后續比較(解決哈希沖突)。

    ngx_rbtree_insert(&cf->cycle->config_dump_rbtree, &sn->node);
插入紅黑樹
  • 作用:將新節點插入到全局紅黑樹 config_dump_rbtree 中。
  • 設計意圖:通過紅黑樹的高效查找特性(O(log n)),快速判斷文件是否已被緩存。

    return NGX_OK;
}
返回成功狀態
  • 作用:告知調用者文件已成功緩存。

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

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

相關文章

Oracle 導出所有表索引的創建語句

在Oracle數據庫中,導出所有表的索引創建語句通常涉及到使用數據字典視圖來查詢索引的定義,然后生成對應的SQL語句。你可以通過查詢DBA_INDEXES或USER_INDEXES視圖(取決于你的權限和需求)來獲取這些信息。 使用DBA_INDEXES視圖 如…

快速搭建多語言網站的 FastAdmin 實踐

快速搭建多語言網站的 FastAdmin 實踐 引言 在全球化的背景下,越來越多的網站需要支持多種語言,以便滿足不同用戶的需求。FastAdmin 是一個基于 ThinkPHP 的快速后臺開發框架,提供了豐富的功能和靈活的擴展性,非常適合用于快速搭…

Python 實戰:構建分布式文件存儲系統全解析

Python 實戰:構建分布式文件存儲系統全解析 在當今數據爆炸的時代,分布式文件存儲系統憑借其高可擴展性、高可靠性等優勢,成為了數據存儲領域的熱門選擇。本文將詳細介紹如何使用 Python 構建一個簡單的分布式文件存儲系統。從系統架構設計&…

【綜合項目】api系統——基于Node.js、express、mysql等技術

目錄 0 前言 1 初始化 2 注冊登錄 2.1 注冊 2.1.1 功能:密碼加密(2.3.3) 2.1.1.1 操作 2.1.1.2 bcryptjs詳解 2.1.2 插入新用戶(2.3.4) 2.1.3 優化:表單數據驗證(2.5) …

tableau之標靶圖、甘特圖和瀑布圖

一、標靶圖 概念 標靶圖(Bullet Chart)是一種用于顯示數據與目標之間關系的可視化圖表,常用于業務和管理報告中。其設計旨在用來比較實際值與目標值,同時展示額外的上下文信息(如趨勢)。 作用 可視化目標…

Linux下的網絡通信編程

在不同主機之間,進行進程間的通信。 1解決主機之間硬件的互通 2.解決主機之間軟件的互通. 3.IP地址:來區分不同的主機(軟件地址) 4.MAC地址:硬件地址 5.端口號:區分同一主機上的不同應用進程 網絡協議…

網絡七層模型—OSI參考模型詳解

網絡七層模型:OSI參考模型詳解 引言 在網絡通信的世界中,OSI(Open Systems Interconnection)參考模型是一個基礎且核心的概念。它由國際標準化組織(ISO)于1984年提出,旨在為不同廠商的設備和應…

530 Login fail. A secure connection is requiered(such as ssl)-java發送QQ郵箱(簡單配置)

由于cs的csdN許多文章關于這方面的都是vip文章,而本文是免費的,希望廣大網友覺得有幫助的可以多點贊和關注! QQ郵箱授權碼到這里去開啟 授權碼是16位的字母,填入下面的mail.setting里面的pass里面 # 郵件服務器的SMTP地址 host…

Sqlserver安全篇之_TLS的證書概念

證書的理解 參考Sqlserver的官方文檔https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)傳輸層安全和SSL(Secure Sockets Layer)安全套接字層協議位于應用程序協議層和TCP/…

【SQL】掌握SQL查詢技巧:數據分組與排序

目錄 1. GROUP BY 1.1 定義與用途1.2 示例說明1.3 注意事項1.4 可視化示例 2. ORDER BY 2.1 定義與用途2.2 升序說明(默認)2.3 降序排序2.4 多列排序2.5 可視化示例 3. GROUP BY 與 ORDER BY 的結合使用4. 可視化示例總結 在數據庫管理中,S…

SOME/IP-SD -- 協議英文原文講解6

前言 SOME/IP協議越來越多的用于汽車電子行業中,關于協議詳細完全的中文資料卻沒有,所以我將結合工作經驗并對照英文原版協議做一系列的文章。基本分三大塊: 1. SOME/IP協議講解 2. SOME/IP-SD協議講解 3. python/C舉例調試講解 5.1.3.1 E…

NameError: name ‘libpaddle‘ is not defined

問題場景: Error: Can not import paddle core while this file exists: C:\Users\Admin\AppData\Roaming\Python\Python38\site-packages\paddle\fluid\libpaddle.pyd Traceback (most recent call last): File "C:\Users\Admin\AppData\Roaming\Python\Pyth…

青少年編程與數學 02-010 C++程序設計基礎 11課題、程序結構

青少年編程與數學 02-010 C程序設計基礎 11課題、程序結構 一、C程序結構二、main函數1. main 函數的基本形式1.1 無參數形式1.2 帶參數形式 2. 參數解釋3. 示例3.1 無參數形式3.2 帶參數形式 4. 編譯和運行4.1 編譯4.2 運行 5. main 函數的返回值6. 總結 三、預處理指令1. #in…

【Linux】learning notes(3)make、copy、move、remove

文章目錄 1、mkdir (make directory)2、rmdir (remove directory)3、rm(remove)4、>5、touch 新建文件6、mv(move)7、cp(copy) 1、mkdir (make…

智能AI替代專家系統(ES)、決策支持系統(DSS)?

文章目錄 前言一、專家系統(ES)是什么?二、決策支持系統(DSS)是什么?1.決策支持系統定義2.決策系統的功能與特點3.決策支持系統的組成 三、專家系統(ES)與決策支持系統(D…

實現Python+Django+Transformers庫中的BertTokenizer和BertModel來進行BERT預訓練,并將其應用于商品推薦功能

一、環境安裝準備 #git拉取 bert-base-chinese 文件#創建 虛擬運行環境python -m venv myicrplatenv#刷新source myicrplatenv/bin/activate#python Django 集成nacospip install nacos-sdk-python#安裝 Djangopip3 install Django5.1#安裝 pymysql settings.py 里面需要 # 強制…

Qt Creator + CMake 構建教程

此教程基于: Qt 6.7.4Qt Creator 15.0.1CMake 3.26.4 Qt 6 以下的版本使用 CMake 構建可能會存在一些問題. 目錄 新建窗體工程更新翻譯添加資源軟件部署(Deploy) 此教程描述了如何一步步在 Qt Creator 中使用 CMake 構建應用程序工程. 涉及 新建窗體工程, 更新翻譯, 添加資源, …

5個GitHub熱點開源項目!!

1.自托管 Moonlight 游戲串流服務:Sunshine 主語言:C,Star:14.4k,周增長:500 這是一個自托管的 Moonlight 游戲串流服務器端項目,支持所有 Moonlight 客戶端。用戶可以在自己電腦上搭建一個游戲…

【Mark】記錄用寶塔+Nginx+worldpress+域名遇到的跨域,301,127.0.0.1,CSS加載失敗問題

背景 想要用寶塔搭建worldpress,然后用域名直接轉https,隱藏掉ipport。 結果被折磨了1天,一直在死活在301,127.0.0.1打轉 還有css加載不了的情況 因為worldpress很多是301重定向的,所以改到最后我都不知道改了什么&am…

認知動力學視角下的生命優化系統:多模態機器學習框架的哲學重構

認知動力學視角下的生命優化系統:多模態機器學習框架的哲學重構 一、信息熵與生命系統的耗散結構 在熱力學第二定律框架下,生命系統可視為負熵流的耗散結構: d S d i S d e S dS d_iS d_eS dSdi?Sde?S 其中 d i S d_iS di?S為內部熵…