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…...
QEMU源码全解析 —— 内存虚拟化(23)
接前一篇文章:QEMU源码全解析 —— 内存虚拟化(22) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 QEMU内存管理模型...

【北京迅为】itop-3568 开发板openharmony鸿蒙烧写及测试-第1章 体验OpenHarmony—烧写镜像
瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…...
TypeScript 类型声明
在 TypeScript 开发中简化类型声明,可以通过以下 7 种实用技巧 显著提升效率: 一、善用类型推断(30% 场景免声明) // ❌ 冗余写法 const user: { name: string; age: number } { name: Jack, age: 25 };// ✅ 自动推断ÿ…...

从0搭建Tomcat第二天:深入理解Servlet容器与反射机制
在上一篇博客中,我们从0开始搭建了一个简易的Tomcat服务器,并实现了基本的HTTP请求处理。今天,我们将继续深入探讨Tomcat的核心组件之一——Servlet容器,并介绍如何使用反射机制动态加载和管理Servlet。 1. Servlet容器的作用 S…...
【Python】yield函数
【Python】yield函数 1. yield介绍2.yield基本用法3.yield高级用法3.1 yield send() 方法3.2 yield from方法3.3 yield 和yield from叠加处理复杂情况下的叠加 4.yield主要应用场景5.总结 python官方api地址 1. yield介绍 在Python中,yield关键字主要用于生成器函…...
Android13修改多媒体默认音量
干就完了! 设置音量为最大音量,修改如下: /framework/base/media/java/android/media/AudioSystem.java/** hide */public static int[] DEFAULT_STREAM_VOLUME new int[] {4, // STREAM_VOICE_CALL7, // STREAM_SYSTEM5, // STREAM_RING-5, // STREAM_MUSIC15, // STREAM…...
nginx+keepalived负载均衡及高可用
一、环境准备 主机名ip地址备注openEuler-1 192.168.121.11(本机) 192.168.131.11(心跳连接) nginx主负载均衡调度器openEuler-2 192.168.121.12(本机) 192.168.131.12(心跳连接) n…...

SP导入智能材质球
智能材质球路径 ...\Adobe Substance 3D Painter\resources\starter_assets\smart-materials 放入之后就会自动刷新...
Kotlin语言特性(一):空安全、扩展函数与协程
Kotlin语言特性(一):空安全、扩展函数与协程 一、引言 Kotlin作为Android官方推荐的开发语言,相比Java具有诸多现代化特性。本文将重点介绍Kotlin三个最具特色的语言特性:空安全、扩展函数和协程,并结合A…...

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接
官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…...

Python 爬虫 – BeautifulSoup
Python 爬虫(Web Scraping)是指通过编写 Python 程序从互联网上自动提取信息的过程。 爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据,然后存储数据。 Python 的丰富生态使其成为开发爬虫的热门语言,特…...

【星云 Orbit-STM32F4】07. 用判断数据尾来接收据的串口通用程序框架
【星云 Orbit-STM32F4】用判断数据尾来接收一串数据的串口通用程序框架 摘要 本文介绍了一种基于STM32F407微控制器的串口数据接收通用程序框架。该框架通过判断数据尾来实现一串数据的完整接收,适用于需要可靠数据传输的应用场景。本文从零开始,详细讲…...
授权与认证之jwt(一)创建Jwt工具类
JWT的Token要经过加密才能返回给客户端,包括客户端上传的Tokn,后端项目需要验证核 实。于是我们需要一个WT工具类,用来加密Token和验证Token的有效性。 一、导入依赖 <dependency><groupId>com.auth0</groupId><artifactId>jav…...
Kubernetes Service服务发现dns之CoreDNS
文章目录 背景什么是Service、服务发现、Endpoint什么是CoreDNSCoreDNS 的工作原理 常用命令coredns 运行状态根据服务名,判断某个服务dns解析是否正常 背景 Kubernetes 集群内部的服务发现是微服务架构的核心基础,而 DNS 服务则是实现这一机制的关键组…...

Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …...

用友NC系列漏洞检测利用工具
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 目录标题 YongYouNcTool启动及适配环境核心功能界面预览一键检测命令执…...
PostgreSQL 创建表格
PostgreSQL 创建表格 在数据库管理中,表格(Table)是数据存储的基础。PostgreSQL作为一款强大的开源对象关系型数据库管理系统(ORDBMS),创建表格是其最基本的功能之一。本文将详细讲解如何在PostgreSQL中创…...

一周一个Unity小游戏2D反弹球游戏 - 球的死区及球重生
前言 本文将实现当球弹到球板下方的死亡区域后,球会被重置到球板上发射点,并且重置物理状态的逻辑。 创建球的死亡区 之前创建的在屏幕下方的空气墙碰撞体可以将其Is Trigger勾选上,让其成为一个触发器,用来检测球是否进入该区域,如下。 创建一个脚本名为Deadzone…...

本地部署 DeepSeek:从 Ollama 配置到 Spring Boot 集成
前言 随着人工智能技术的迅猛发展,越来越多的开发者希望在本地环境中部署和调用 AI 模型,以满足特定的业务需求。本文将详细介绍如何在本地环境中使用 Ollama 配置 DeepSeek 模型,并在 IntelliJ IDEA 中创建一个 Spring Boot 项目来调用该模型…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...