Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cycle_modules

news2025/3/10 4:46:53

声明在 src/core/ngx_module.h

ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);

实现在 src/core/ngx_module.c

ngx_int_t
ngx_cycle_modules(ngx_cycle_t *cycle)
{
    /*
     * create a list of modules to be used for this cycle,
     * copy static modules to it
     */

    cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1)
                                              * sizeof(ngx_module_t *));
    if (cycle->modules == NULL) {
        return NGX_ERROR;
    }

    ngx_memcpy(cycle->modules, ngx_modules,
               ngx_modules_n * sizeof(ngx_module_t *));

    cycle->modules_n = ngx_modules_n;

    return NGX_OK;
}

这个函数ngx_cycle_modules的作用是为当前Nginx服务器周期(cycle)初始化并设置模块列表。具体来说:

  1. 函数为当前周期分配内存,用于存储模块指针数组

  2. 将静态定义的模块列表(ngx_modules)复制到当前周期的模块列表中

  3. 设置当前周期的模块数量


ngx_cycle_modules 函数的签名如下:

ngx_int_t ngx_cycle_modules(ngx_cycle_t *cycle);

以下是对函数签名的详细解析:


1. 返回值类型 ngx_int_t
类型定义:ngx_int_t 是 Nginx 自定义的整数类型,用于统一跨平台的整数表示。
语义:
NGX_OK(值为 0):表示函数执行成功。
NGX_ERROR(值为 -1):表示函数执行失败(如内存分配失败)。
作用:通过返回状态码,通知调用者函数执行结果。



2. 参数 ngx_cycle_t *cycle
参数类型:ngx_cycle_t 是 Nginx 的核心结构体,表示一个运行周期(如启动、重载配置时的实例)。



详解


注释部分
/*
 * create a list of modules to be used for this cycle,
 * copy static modules to it
 */

作用:说明函数的核心目标。


背景:
Nginx 的模块在编译时静态注册到全局数组 ngx_modules。
每个运行周期(cycle)需要独立的模块列表,以支持配置重载时的多实例隔离。


设计思想:
隔离性:通过复制全局模块到 cycle,避免不同周期(如旧配置与新配置)的模块相互干扰。


分配模块数组内存

cycle->modules = ngx_pcalloc(cycle->pool, (ngx_max_module + 1) * sizeof(ngx_module_t *));

作用:在 cycle 的内存池中分配内存,存储模块指针数组。


关键参数:
cycle->pool:Nginx 内存池,确保高效内存管理(避免频繁 malloc/free)。
ngx_max_module + 1ngx_max_module 是编译时定义的最大模块数,+1 用于预留终止标记(如 NULL)


检查内存分配

if (cycle->modules == NULL) {
    return NGX_ERROR;
}
  • 作用:验证内存分配是否成功。

  • 逻辑:若 ngx_pcalloc 返回 NULL,直接返回错误码 NGX_ERROR


复制全局模块到周期模块列表

ngx_memcpy(cycle->modules, ngx_modules, ngx_modules_n * sizeof(ngx_module_t *));

作用:将全局模块数组 ngx_modules 拷贝到 cycle->modules


关键变量:
ngx_modules:全局静态模块数组,编译时生成。

ngx_modules_n:全局模块数量,编译时确定。

仅复制实际存在的模块(ngx_modules_n 个),而非整个预分配空间。


记录模块数量

cycle->modules_n = ngx_modules_n;
  • 作用:将全局模块数量 ngx_modules_n 赋值给 cycle->modules_n

  • 逻辑

    • cycle->modules_n 后续用于遍历模块(如初始化模块时)


返回成功状态

return NGX_OK;
  • 作用:通知调用者函数执行成功。

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_modules-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312481.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32】江科大STM32学习笔记汇总(已完结)

00. 目录 文章目录 00. 目录01. STM32学习笔记汇总02. 相关资料下载03. 打赏04. 附录 01. STM32学习笔记汇总 【STM32】STM32学习笔记-课程简介(01) 【STM32】STM32学习笔记-STM32简介(02) 【STM32】STM32学习笔记-软件安装(03) 【STM32】STM32学习笔记-新建工程(04) 【ST…

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境:Uvicorn 直接驱动 作用:Uvicorn 作为 ASGI 服务器,原生支持 FastAPI 的异步特性,提供热重载(--reload)和高效异步请求处理。 启动命令: u…

OSPF的各种LSA类型,多区域及特殊区域

一、OSPF的LSA类型 OSPF(开放最短路径优先)协议使用多种LSA(链路状态通告)类型来交换网络拓扑信息。以下是主要LSA类型的详细分类及其作用: 1. Type 1 LSA(路由器LSA) 生成者:每个…

pyqt联合designer的运用和设置

PyQt Designer 简介 PyQt Designer 是一个用于创建和设计 PyQt 应用程序用户界面的可视化工具。它允许用户通过拖放方式添加和排列各种控件,如按钮、文本框、滑块等,并设置它们的属性和样式,从而快速构建出美观且功能完整的 UI 界面。 Windows版本:【免费】安装包别管啊啊…

vulnhub靶场之【digitalworld.local系列】的snakeoil靶机

前言 靶机:digitalworld.local-snakeoil,IP地址为192.168.10.11 攻击:kali,IP地址为192.168.10.6 kali采用VMware虚拟机,靶机选择使用VMware打开文件,都选择桥接网络 这里官方给的有两种方式&#xff0…

Ubuntu切换lowlatency内核

文章目录 一. 前言二. 开发环境三. 具体操作 一. 前言 低延迟内核(Lowlatency Kernel) 旨在为需要低延迟响应的应用程序设计的内核版本。Linux-lowlatency特别适合音频处理、实时计算、游戏和其他需要及时响应的实时任务。其主要特点是优化了中断处理、调…

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …

微信小程序+SpringBoot的单词学习小程序平台(程序+论文+讲解+安装+修改+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统背景 &#xff08;一&#xff09;社会需求背景 在全球化的大背景下&#xff0c;英语作为国际…

VBA 数据库同一表的当前行与其他行的主键重复判断实现方案1

目的&#xff0c;判断是否主键重复&#xff0c;不重复则登录新数据&#xff0c;重复则不登录。 定义类型&#xff1a; DataRecord   tableName 表名   rowNumber 行号   columnName 列名   data 数据 想要实现的代码逻辑如下&#xff1a; 模拟数据库的登录过程。假设…

VUE的第二天

1. 指令修饰符 1.1什么是指令修饰符&#xff1f; ​ 所谓指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 1.2按键修饰符 keyup.enter —>当点击enter键的时候才触发 代码演示&#xff1a; <div id"app"><…

Element Plus中的树组件的具体用法(持续更新!)

const defaultProps {//子树为节点对象的childrenchildren: children,//节点标签为节点对象的name属性label: name, } 属性 以下是树组件中的常用属性以及作用&#xff1a; data&#xff1a;展示的数据&#xff08;数据源&#xff09; show-checkbox&#xff1a;节点是否可…

尚硅谷爬虫note14

一、scrapy scrapy&#xff1a;为爬取网站数据是&#xff0c;提取结构性数据而编写的应用框架 1. 安装 pip install scrapy 或者&#xff0c;国内源安装 pip install scrapy -i https&#xff1a;//pypi.douban.com/simple 2. 报错 报错1&#xff09;building ‘twisted.te…

永洪科技深度分析实战,零售企业的销量预测

随着人工智能技术的不断发展&#xff0c;智能预测已经成为各个领域的重要应用之一。现在&#xff0c;智能预测技术已经广泛应用于金融、零售、医疗、能源等领域&#xff0c;为企业和个人提供决策支持。 智能预测技术通过分析大量的数据&#xff0c;利用机器学习和深度学习算法…

2.数据结构-栈和队列

数据结构-栈和队列 2.1栈2.1.1栈的表示和实现2.1.2栈的应用举例数制转换括号匹配检验迷宫给求解表达式求值 2.1栈 栈是限定仅在表尾进行插入或删除操作的线性表&#xff0c;因此&#xff0c;对栈来说&#xff0c;表尾端有其特殊含义&#xff0c;称为栈顶&#xff08;top&#x…

android studio开发文档

android基本样式 1.文本 2.设置文本大小 3.字体颜色 背景 资源文件 xml’引用资源文件 4.视图宽高 5.间距 6.对齐方式 常用布局 1.linearLayout线性布局 2.相对布局 RelativeLayout 3.网格布局GridLayout 4.scrollview滚动视图 Button 点击事件与长按事件 长按 按钮禁用与…

Java 对象与类——从 C++ 到 Java

文章目录 面向对象程序设计概述使用预定义类用户自定义类静态字段与静态方法方法参数对象构造包JAR 文件文档注释类设计技巧 面向对象程序设计概述 面向对象程序设计&#xff08;OOP&#xff09;在 20 世纪 70 年代出现&#xff0c;是当今主流编程范型&#xff0c;Java 是面向…

一篇文章讲解清楚ARM9芯片启动流程

SAM9X60 ARM9 boot启动流程关键词介绍&#xff1a; 第一级bootloader - 也叫boot ROM&#xff0c;是集成在MPU内部的ROM里面 它的主要功能是执行对MPU的基本初始化和配置&#xff0c;查找并将第二级bootloader从外部NVM中读取出来并放到MPU内部的SRAM. 可以让MPU强制停留在第一…

【2025】Electron + React 架构筑基——从零到一的跨平台开发

引言 源代码仓库&#xff1a; Github仓库【electron_git】 你是否厌倦了在命令行中反复输入git status&#xff0c;却依然无法直观看到文件变化&#xff1f; 是否羡慕VS Code的丝滑Git集成&#xff0c;却苦恼于无法定制自己的专属工具&#xff1f; 本专栏将为你打开一扇新的…

Vue3实战学习(IDEA中打开、启动与搭建Vue3工程极简脚手架教程(2025超详细教程)、Windows系统命令行启动Vue3工程)(2)

目录 一、命令行中重新启动已搭建好的Vue3工程。(快速上手) &#xff08;0&#xff09;Windows环境下使用命令行从零到一手动搭建Vue3工程教程。 &#xff08;1&#xff09;首先找到已建Vue3工程的目录。 &#xff08;2&#xff09;无需再下载依赖包&#xff0c;直接执行npm ru…

【ArcGIS】地理坐标系

文章目录 一、坐标系理论体系深度解析1.1 地球形态的数学表达演进史1.1.1 地球曲率的认知变化1.1.2 参考椭球体参数对比表 1.2 地理坐标系的三维密码1.2.1 经纬度的本质1.2.2 大地基准面&#xff08;Datum&#xff09;的奥秘 1.3 投影坐标系&#xff1a;平面世界的诞生1.3.1 投…