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.mzph.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为内部熵…