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 的配置文件内容缓存到内存中,并记录文件信息,避免重复加载相同的配置文件。
具体步骤
- 检查是否已缓存:通过哈希值快速判断当前配置文件是否已经被缓存过。
- 缓存新文件:如果未缓存,则将文件内容读取到内存缓冲区,并记录文件名和哈希值。
- 避免重复:通过红黑树(一种高效的数据结构)管理已缓存的文件信息,确保同一个文件不会被多次加载。
意义
- 提升性能:减少重复读取磁盘文件的开销,加快配置加载速度。
- 节省资源:避免多次解析相同配置文件,降低内存和 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),则直接标记当前配置文件的dump为NULL,表示不需要重复缓存。
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:保存文件名的字符串(data和len)。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;
}
返回成功状态
- 作用:告知调用者文件已成功缓存。
相关文章:
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;has…...
MySQL快速搭建主从复制
一、基于位点的主从复制部署流程 确定主库Binlog是否开启修改主从server_id主库导出数据从库导入数据确定主库备份时的位点在从库配置主库信息查看复制状态并测试数据是否同步 二、准备阶段(主库和从库配置都需要修改) 1、确定主库Binlog是否开启 2、修改主从se…...
Linux注册进程终止处理函数
atexit() 是一个标准库函数,用于注册在进程正常终止时要调用的函数。通过 atexit(),你可以确保在程序结束时自动执行一些清理工作,比如释放资源、保存状态等。 函数原型如下: #include <stdlib.h> int atexit(void (*func…...
pytorch 模型测试
在使用 PyTorch 进行模型测试时,一般包含加载测试数据、加载训练好的模型、进行推理以及评估模型性能等步骤。以下为你详细介绍每个步骤及对应的代码示例。 1. 导入必要的库 import torch import torch.nn as nn import torchvision import torchvision.transforms as trans…...
水仙花数(华为OD)
题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 13 53 33。 输入描述 第一行输入一个整数n,表示一个n位的正整数。n在3到7之间&#x…...
(十二)基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例
下面是一个基于 Vue 3 和 Mapbox GL 实现的坐标拾取器组件示例: <template><div class="map-container"><div ref="mapContainer" class="map"></div><div class="coordinates-box"><div v-if=&qu…...
【华为OD机试真题29.9¥】(E卷,100分) - IPv4地址转换成整数(Java Python JS C++ C )
题目描述 存在一种虚拟IPv4地址,由4小节组成,每节的范围为0~255,以#号间隔,虚拟IPv4地址可以转换为一个32位的整数,例如: 128#0#255#255,转换为32位整数的结果为2147549183(0x8000FFFF) 1#0#0#0,转换为32位整数的结果为16777216(0x01000000) 现以字符串形式给出一…...
《白帽子讲 Web 安全》之深入同源策略(万字详解)
目录 引言 一、同源策略基础认知 (一)定义 (二)作用 (三)作用机制详解 二、同源策略的分类 (一)域名同源策略 (二)协议同源策略 (三&…...
USRP4120-通用软件无线电平台
1、产品描述 USRP4120平台是彬鸿科技公司推出的以XILINX XC7Z020 SOC处理器为核心,搭配ADI AD9361射频集成芯片,针对无线通信系统科研与教学实验场景的一款通用软件无线电平台。产品频率范围70MHz~6GHz,模拟带宽200KHz~56MHz,支持…...
计算机毕业设计SpringBoot+Vue.js社区智慧养老监护管理平台(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
yoloV5的学习-pycharm版本
真的很让人气愤的一点,老师把我的pycharm给卸载了,我那个上面不仅有gpu-torch,还有gpu-torch,他给俺删了,删了很久,我心都碎了,过几天我就去找他负责,让他给我装回来我的环境&#x…...
蓝桥杯 之 图形规律
文章目录 分析组成,找到规律数正方形 在蓝桥杯中,常常会有一些图形的规律的题目需要我们去解决,所以我们需要学会其中的一些方法,我们这样才能解决对应的问题 方法1:直接对n进行拆分方法2:使用递归的思路&a…...
JavaScript 变量语法扩展
随着ECMAScript 6(ES6)及后续版本的发布,JavaScript引入了许多新的特性,极大地丰富了变量声明和使用的语法。这些改进不仅提升了代码的可读性和简洁性,还增强了开发效率。本文将介绍一些重要的变量语法扩展,…...
SslConnection::SslConnection()详解
一、🔍 SslConnection::SslConnection() 详解 这个构造函数的主要作用是: 创建 SSL 对象创建 BIO(I/O 缓冲区)初始化 SSL 服务器模式绑定回调函数(onRead() 处理接收数据) 📌 1. 初始化 SSL 相…...
【计算机网络入门】初学计算机网络(八)
目录 1. S-W协议的信道利用率 2. GBN、SR协议的信道利用率 3.术语补充 3.1 滑动窗口协议 3.2 ARQ协议、连续ARQ协议 4. 信道划分介质访问控制 4.1 时分复用(TDM) 4.2 统计时分复用(STDM) 4.3 频分复用(FDM&a…...
迷你世界脚本生物接口:Creature
生物接口:Creature 彼得兔 更新时间: 2024-05-22 17:51:22 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getAttr(...) 生物属性获取 2 setAttr(...) 生物属性设置 3 isAdult(...) 判断该生物是否成年 4 setOxygenNeed(…...
vue 和 react 底层采用的 diff 算法的区别
Vue 3 和 React 在底层 Diff 算法上的实现确实有一些区别,主要体现在设计理念、性能优化策略以及具体实现方式上。以下是对两者 Diff 算法差异的详细分析: 1. 总体设计理念 Vue 3 的 Diff 算法 Vue 3 的虚拟 DOM Diff 算法基于“双端比较”思想ÿ…...
VUE集成Live2d
VUE集成Live2d 目前基于大模型,可以实现一个桌面的3D动画小人,个人猜测可以简介这个项目进行实现 1-参考网址 试了很多项目,只有这个项目直观的把问题说清楚了 Live2D Vue3技术应用:https://blog.csdn.net/hh1233321/article/details/1406947…...
C++蓝桥杯基础篇(七)
片头 嗨~小伙伴们,大家好!今天我们来一起学习蓝桥杯基础篇(七),学习相关字符串的知识,准备好了吗?咱们开始咯! 一、字符与整数的联系——ASCII码 每个常用字符都对应一个-128~127的…...
常见的非关系性数据库
非关系型数据库(NoSQL)有多种类型,每种类型针对不同的应用场景提供了不同的存储和查询方式。以下是一些常见的非关系型数据库及其特点: 1. 键值数据库(Key-Value Stores) 特点:数据以键值对的…...
【Java反序列化测试】
Java反序列化测试 1. 识别反序列化入口点2. 构造探测Payload3. 发送Payload并观察结果4. 绕过可能的防护5. 自动化工具注意事项总结 Java反序列化测试: 1. 识别反序列化入口点 常见入口: HTTP请求参数(如POST数据、Cookie、Headersÿ…...
代码规范和简化标准
代码规范和简化标准是编写高质量、可维护、可扩展和可读代码的基本原则。遵循这些标准不仅能提高团队协作效率,还能减少出错的概率和后期维护的成本。以下是一些常见的代码规范和简化标准: 1. 命名规范 变量命名: 使用具有描述性的名称&…...
RabbitMQ怎么实现延时支付?
一、使用“死信队列”消息过期时间 1、原理: 设置消息”存活时间“,如果没有被及时消费,就会被丢弃到一个”死信队列“,然后消费者监听这个死信队列处理消息 2、步骤: 2.1、创建两个队列: 2.1.1、普通队…...
node项目前后端密码加密传输及存储方案
前端:使用crypto-js库的SHA256算法,包含用户注册时使用的邮箱加上自定义的secret key生成盐值,接着使用PBKDF2算法进行加密。最后将加密后的密码传给后端。 import CryptoJS from "crypto-js";export const encryptPassword (ema…...
迷你世界脚本方块接口:Block
方块接口:Block 彼得兔 更新时间: 2024-08-27 11:04:56 具体函数名及描述如下: 序号 函数名 函数描述 1 isSolidBlock(...) 是否是固体方块 2 isLiquidBlock(...) 是否是液体方块 3 isAirBlock(...) 是否是气体方块 4 getBl…...
el-input实现金额输入
需求:想要实现一个输入金额的el-input,限制只能输入数字和一个小数点。失焦数字转千分位,聚焦转为数字,超过最大值,红字提示 效果图 失焦 聚焦 报错效果 // 组件limitDialog <template><el-dialog:visible.s…...
双碳战略下的智慧能源实践:安科瑞储能管理系统助力企业绿色转型
在全球碳中和目标加速推进的背景下,中国“十四五”规划明确提出构建以新能源为主体的新型电力系统,储能技术成为支撑能源结构转型的核心要素。安科瑞储能能量管理系统作为企业级智慧能源解决方案的核心载体,凭借其技术创新与场景适配能力&…...
《鸢尾花数学大系:从加减乘除到机器学习》开源资源
《鸢尾花数学大系:从加减乘除到机器学习》开源资源 Gitee:https://gitee.com/higkoo/ bilibili:https://space.bilibili.com/513194466 GitHub:https://github.com/Visualize-ML...
本地部署HDFS集群
首先完成本地部署大数据集群前置准备,可参考: 本地部署大数据集群前置准备https://blog.csdn.net/m0_73641796/article/details/145994787?spm1001.2014.3001.5501 1.下载hadoop 下载Hadoop安装包,本文用的是hadoop-3.3.4.tar.gz 2. 集群…...
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建
Windows 环境下 Nginx、PHP 与 ThinkPHP 开发环境搭建 目录 安装 Nginx 和 PHP配置 Nginx配置 PHP启动服务ThinkPHP 配置常见问题排查 1. 安装 Nginx 和 PHP 安装 Nginx 访问 Nginx 官网 下载 Windows 版本解压到指定目录,如 C:\nginx 安装 PHP 访问 PHP 官网…...
