nginx配置数据结构及合并过程

nginx源码分析(2)——http模块的初始化过程 前一篇文章介绍了nginx的启动初始化过程,包括了所有模块的初始化过程,比如http模块、事件模块等。这里再详细介绍一下http模块的启动过程,还记得在前一篇文章中提到过ngx_conf_parse函数背后隐藏了大量的细节吗?这里就揭开这层神秘的面纱,去看看几个重要的http模块是如何初始化的。这里依然沿用上一篇文章的结构,首先来看几个重要的数据结构。 1. 重要的数据结构         1 阅读详情

配置数据结构的创建过程

初始化cycle->conf_ctx

ngx_init_cycle()函数中根据nginx模块的数量ngx_max_module创建一个指针数组,如下。每个指针成员,对应nginx模块的配置数据结构。

cycle->conf_ctx = ngx_pcalloc(pool, ngx_max_module * sizeof(void *));

NGX_CORE_MODULE模块的配置数据结构创建

    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_CORE_MODULE) {
            continue;
        }

        module = ngx_modules[i]->ctx;

        if (module->create_conf) {
            rv = module->create_conf(cycle);
            if (rv == NULL) {
                ngx_destroy_pool(pool);
                return NULL;
            }
            cycle->conf_ctx[ngx_modules[i]->index] = rv;
        }
    }

其中,包括ngx_core_module和ngx_http_module。
static ngx_core_module_t  ngx_core_module_ctx = {
    ngx_string("core"),
    ngx_core_module_create_conf,
    ngx_core_module_init_conf
};
ngx_module_t  ngx_core_module = {
    NGX_MODULE_V1,
    &ngx_core_module_ctx,                  /* module context */
    ngx_core_commands,                     /* module directives */
    NGX_CORE_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
ngx_core_module调用ngx_core_module_create_conf返回一个ngx_core_conf_t结构指针,成员包括daemon,master,worker_processes等。

static ngx_core_module_t  ngx_http_module_ctx = {
    ngx_string("http"),
    NULL,
    NULL
};
ngx_module_t  ngx_http_module = {
    NGX_MODULE_V1,
    &ngx_http_module_ctx,                  /* module context */
    ngx_http_commands,                     /* module directives */
    NGX_CORE_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};
ngx_http_module模块没有create_conf回调函数。

解析http指令产生HTTP_MODULE模块配置数据

  ngx_http_conf_ctx_t         *ctx;
		ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));
  *(ngx_http_conf_ctx_t **) conf = ctx;  /* conf指向ngx_http_module模块对应的配置数据结构 */
    ctx->main_conf = ngx_pcalloc(cf->pool,  sizeof(void *) * ngx_http_max_module);
    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);
    for (m = 0; ngx_modules[m]; m++) {
        if (ngx_modules[m]->type != NGX_HTTP_MODULE) {
            continue;
        }
        module = ngx_modules[m]->ctx;
        mi = ngx_modules[m]->ctx_index;
        /* 调用create_xxx_conf()生成配置数据结构,并放于对应的指针数组中。 */
        if (module->create_main_conf) {  
            ctx->main_conf[mi] = module->create_main_conf(cf);
            if (ctx->main_conf[mi] == NULL) {
                return NGX_CONF_ERROR;
            }
        }
        if (module->create_srv_conf) {
            ctx->srv_conf[mi] = module->create_srv_conf(cf);
            if (ctx->srv_conf[mi] == NULL) {
                return NGX_CONF_ERROR;
            }
        }
        if (module->create_loc_conf) {
            ctx->loc_conf[mi] = module->create_loc_conf(cf);
            if (ctx->loc_conf[mi] == NULL) {
                return NGX_CONF_ERROR;
            }
        }
    }

ngx_http_core_module模块

static ngx_http_module_t  ngx_http_core_module_ctx = {
    ngx_http_core_preconfiguration,        /* preconfiguration */
    NULL,                                  /* postconfiguration */

    ngx_http_core_create_main_conf,        /* create main configuration */
    ngx_http_core_init_main_conf,          /* init main configuration */

    ngx_http_core_create_srv_conf,         /* create server configuration */
    ngx_http_core_merge_srv_conf,          /* merge server configuration */

    ngx_http_core_create_loc_conf,         /* create location configuration */
    ngx_http_core_merge_loc_conf           /* merge location configuration */
};

ngx_module_t  ngx_http_core_module = {
    NGX_MODULE_V1,
    &ngx_http_core_module_ctx,             /* module context */
    ngx_http_core_commands,                /* module directives */
    NGX_HTTP_MODULE,                       /* module type */
    NULL,                                  /* init master */
    NULL,                                  /* init module */
    NULL,                                  /* init process */
    NULL,                                  /* init thread */
    NULL,                                  /* exit thread */
    NULL,                                  /* exit process */
    NULL,                                  /* exit master */
    NGX_MODULE_V1_PADDING
};

这是一个NGX_HTTP_MODULE模块,所以ngx_http_core_create_main_conf(),ngx_http_core_create_srv_conf(),ngx_http_core_create_loc_conf()会分别创建三个配置数据结构cmcf, cscf, clcf,并分别存放与ctx->main_conf指针数组,ctx->src_conf指针数组,ctx->loc_conf指针数组当中。

server配置指令

server指令由ngx_http_core_module.c文件的ngx_http_core_server()负责解析。
    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));

    http_ctx = cf->ctx;   /* cf->ctx指的是http指令对应的ctx */
    ctx->main_conf = http_ctx->main_conf;

    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);

    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);

    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_HTTP_MODULE) {
            continue;
        }

        module = ngx_modules[i]->ctx;

        if (module->create_srv_conf) {
            mconf = module->create_srv_conf(cf);
            if (mconf == NULL) {
                return NGX_CONF_ERROR;
            }

            ctx->srv_conf[ngx_modules[i]->ctx_index] = mconf;
        }

        if (module->create_loc_conf) {
            mconf = module->create_loc_conf(cf);
            if (mconf == NULL) {
                return NGX_CONF_ERROR;
            }

            ctx->loc_conf[ngx_modules[i]->ctx_index] = mconf;
        }
    }
    /* 把这个server指令对应的cscf放到cmcf的servers数组中。 */
    /* cscf的ctx成员包含srv_conf,和loc_conf,指向server层的数据 */
    cscf = ctx->srv_conf[ngx_http_core_module.ctx_index];
    cscf->ctx = ctx;

    cmcf = ctx->main_conf[ngx_http_core_module.ctx_index];

    cscfp = ngx_array_push(&cmcf->servers);
    if (cscfp == NULL) {
        return NGX_CONF_ERROR;
    }

    *cscfp = cscf;

location配置指令

location指令由ngx_http_core_module.c文件的ngx_http_core_location()负责解析。
    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_http_conf_ctx_t));

    pctx = cf->ctx;   /* cf->ctx指的是cscf->ctx */
    ctx->main_conf = pctx->main_conf;
    ctx->srv_conf = pctx->srv_conf;

    ctx->loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);

    for (i = 0; ngx_modules[i]; i++) {
        if (ngx_modules[i]->type != NGX_HTTP_MODULE) {
            continue;
        }

        module = ngx_modules[i]->ctx;

        if (module->create_loc_conf) {
            ctx->loc_conf[ngx_modules[i]->ctx_index] =
                                                   module->create_loc_conf(cf);
            if (ctx->loc_conf[ngx_modules[i]->ctx_index] == NULL) {
                 return NGX_CONF_ERROR;
            }
        }
    }

    clcf = ctx->loc_conf[ngx_http_core_module.ctx_index];
    clcf->loc_conf = ctx->loc_conf;
    /* cscf->ctx的loc_conf指针数组中,有一个clcf成员,它的locations队列中,存放所有包含的location指令块 */
    pclcf = pctx->loc_conf[ngx_http_core_module.ctx_index];
    ngx_http_add_location(cf, &pclcf->locations, clcf);

配置数据结构的总体结构图





合并配置数据结构

将http上下文合并到server上下文


将server上下文合并到location上下文

【Nginx 源码学习】Nginx 的缓冲区 Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》 阅读详情

相关推荐

nginx-rtmp模块初始化

rtmp模块初始化源码剖析 rtmp模块初始化过程主要分为以下几个点: 上下文结构初始化、配置项解析、配置项合并、server 相关端口设置。相关源码文件主要在ngx_rtmp.c和ngx_rtmp.h文件中 下面主要从rtmp框架相关的数据结构,以及整个初始化过程进行分析。 数据结构 nginx-rtmp模块的核心框架定义的通用数据结构主要有以下几个:ngx_rtmp_module_t 、ngx...

wu5215080的专栏 1014

C语言 生成二维码-嵌入式平台

C语言-二维码

qq_36075612的博客 4587

【Nginx学习】从0到1:用Nginx编写一个简单的HTTP模块,如何理解HTTP模块的数据结构?

解析:模块版本。:模块上下文。:模块指令。:模块类型。初始化和退出函数。通过本文的详细介绍,相信你对Nginx模块开发有了更深刻的理解。编写自定义模块不仅可以扩展Nginx的功能,还能让你在技术上更进一步。如果你有任何疑问或需要进一步的帮助,欢迎随时留言交流!希望这些知识能成为你Nginx模块开发之旅的得力助手,祝你一路顺风!

java专栏 957

STM32热敏打印机打印二维码

为了解决过扁的问题,我在每次循环打印的时候将同一点行数据打印了四遍,这样打印出来的效果还可以,起码看着是个二维码了方方正正的。n1只有最低两位有效,用来修改倍高倍宽打印,n2是每一点行打印的字节数,可以填m_nSymbleSize。0x01全改为0xFF,这样打印出来的二维码很扁,配合倍高或倍宽命令倒是可以进行扫描。这个库生成的数据,一个字节打一个点,我这里将其改为八个点,也就是遍历一下数组,将。,参数就填写要转为二维码的字符串,生成的数据为0和1,保存在全局变量的二维数组。移植之后包含头文件,使用函数。

qq_40637013的博客 997

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

将CityScapes数据集转换为COCO格式的实例分割数据集

##¥##2019年结束前最后两小时,写出本年度最后一篇博客,不是博主没地方去跨年,实在是Coding乐趣无穷ahhhh ##¥## COCO数据集是研究实例分割的通用数据集,但是针对道路环境的数据较少,对于自动驾驶和移动机器人的应用并不适配。而提供道路环境的实例分割数据的数据集目前有KITTI、CityScapes、Apllo等,CityScapes算是应用较广,数据质量较高的一个,所以,本篇...

陆羽飞的博客 9940

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强,其并发能力确实在同类型的网页server中表现较好。

m0_67544708的博客 449

opencv-meshgrid

使用opencv::repeat函数和std::iota函数完成meshgrid功能。 X Y Z 通俗的说就是根据Z的大小生成X矩阵,Y矩阵

yuegooxi的博客 1607

配置数据结构

【代码】配置数据结构。

Anthony_ls的博客 230

超分算法 SwinIR: Image Restoration Using Swin Transformer

这篇文章结构比较简单,如果看过Swin-Transformer的话就没什么难点了。作者引入Swin-T结构应用于低级视觉任务,包括图像超分辨率重建、图像去噪、图像压缩伪影去除。网络由一个浅层特征提取模块、深层特征提取模块、重建模块构成。重建模块对不同的任务使用不同的结构。浅层特征提取就是一个3×3的卷积层。深层特征提取是k个RSTB块和一个卷积层构成。RSTB(Res- SwinIR: Image Restoration Using Swin Transformer[ICCV 2021]Abstract1.

qq_45122568的博客 1万+

OpenFoam实用技巧——starccm网格高效转换openfoam格式全解析

本文详细解析了如何利用OpenFOAM官方工具`ccm26toFoam`,将STAR-CCM+生成的高质量网格高效、稳定地转换为OpenFOAM格式。内容涵盖从STAR-CCM+正确导出网格、执行转换命令、解读转换日志,到转换后关键的边界条件修复与网格质量检查等全流程,旨在帮助用户规避常见错误,实现无缝工作流衔接。

weixin_28309571的博客 456

【浅谈Nginx中合并配置的作用】

Nginx合并配置的作用

Sallyyym的博客 566

从 Product Master 视角理解 Configurable Products

摘要:SAP S/4HANA中的可配置产品(Configurable Products)通过集中管理产品变体解决主数据膨胀问题。以汽车和服务器为例,销售端显示为单一产品,生产端则处理多维度组合。核心机制包括:1)使用KMAT物料类型或Configurable标记;2)通过特征(characteristics)定义可选项;3)用分类(class)组织特征;4)配置档案(configuration profile)控制业务逻辑。这种设计将客户选择与主数据解耦,避免为每个组合创建独立物料,同时支持销售配置、生产B

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 83

【Nginx】如何使用http配置

处理http配置项可以分为下面4个步骤: 1)创建数据结构用于存储配置项对应的参数 2)设定配置项在nginx.conf中出现时的限制条件与回调方法 3)实现第2步中的回调方法,或者使用Nginx框架预设的14个回调方法 4)合并不同级别的配置块中出现的同名配置项 一、分配用于保存配置参数的数据结构 创建结构体(命名例子:ngx_http_mytest_conf_t)来存储配置项的参数...

weixin_30345055的博客 115

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

华为OD机试2025A卷 - 分苹果(Java & Python& JS & C++ & C )

算法大师! 720

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 884

《深入理解Nginx》阅读与实践(二):配置项的使用

前文链接:《深入理解Nginx》阅读与实践(一):Nginx安装配置与HelloWorld   HelloWorld的完成意味着已经踏入了nginx的大门,虽然很振奋人心,但在编写中仍有很多疑惑的存在:nginx.conf的配置项中各个参数是如何读入程序中的?ngx_command_t如何完成配置项的读入工作?名称相同的配置项的冲突如何解决?Hel...

weixin_34391445的博客 102

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

nginx源码分析之http解码实现

分析nginx是如何解析并且存储http请求的。对非法甚至恶意请求的识别能力和处理方式。可以发现nginx采用状态机来解析http协议,有一定容错能力,但并不全面 相关配置   跟解码有关的配置   merge_slashes   语法 merge_slashes on | off 默认值 on 上下文 http server 说明 支持解析请求...

ronon77的专栏 718

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

关于ngx的一些常用函数和结构体

http://cjhust.blog.163.com/blog/static/17582715720124544047608/ 1,数据结构体          ngx_conf_t                   ngx_http_conf_ctx_t           ngx_http_module_t         ngx_comma

u012566181的专栏 1788

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Nginx 配置解析

简单介绍了 Nginx 启动的过程,并分析了其启动过程的源码。在启动过程中有一个步骤非常重要,就是调用函数 ngx_init_cycle(),该函数的调用为配置解析提供了接口。配置解析接口大概可分为两个阶段:准备数据阶段 和 配置解析阶段;

关注校招求职,微信号:job_campus 3335

Nginx基础. Nginx配置解析

之前给出了配置简单模块的例子, 现在来仔细分析一下配置文件中的 http, server, location这三个部分. 在配置文件中, 在http块下可以有多个server块, 在servre块下可以有多个location块, 在location块下仍然可以有location块. 同一个配置项可以同时出现在多个http块, server块, 或是location块内. 既然如此, 就远

博客 1718

Nginx专题(四、解析读取配置文件)

nginx的强大功能就是可以通过配置文件来配置代码,全面只是简单的介绍了配置文件,现在这节要讲解一下怎么在模块中使用配置文件的参数。

酱油师兄的博客 2045

【Nginx】如何处理HTTP配置

同一个配置项可以同时出现多个块内,例如HTTP块、server块、location块。一个配置项到底是取哪个块中的值完全有我们定义的模块决定。 处理HTTP配置项分以下4个步骤: 创建数据结构用于存储配置项对应的参数设定配置项在配置文件中出现时的限制条件与回调方法实现上述回调方法,或使用Nginx预设的14个回调方法合并不同级别的同名配置项 1、分配用于保存配置参数的数据结构

Nestle的专栏 1908

Nginx 配置项参数解析

nginx 配置项参数解析

上善若水 4942
上一篇: Nginx配置文件处理过程
下一篇: python处理中文字符
wangst4321
博客等级 码龄16年 4粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值