Nginx 源码分析– 模块module 解析执行 nginx.conf 配置文件流程分析 一

搭建nginx 服务器时,主要的配置文件nginx.conf 是部署和维护服务器人员经常要使用到的文件, 里面进行了许多服务器参数的设置。那么nginx 以模块module 为骨架的设计下是如何运用模块module 来解析并执行nginx.conf 配置文件下的指令的呢?在探究源码之前,需要对nginx 下的模块module 有个基本的认知(详情参考前面的博文 Nginx 源码分析– 浅谈对模块module 的基本认知 )同时也要对nginx 中常用到的一些结构有个基本的了解如: 内存池pool 管理相关的函数、ngx_string 的基本结构等(详情参考前面的博文),若不然看代码的时候可能不能很明晰其中的意思,本文着重探究的是解析执行的流程。

1 、从main 函数说起。

Nginx 的main 函数在nginx.c 文件中(本文使用release-1.3.0 版本源码 ,200 行),因为是主函数其中涉及到了许许多多的功能模块的初始化等内容,我们只关注我们需要的部分。看到326 行:

可以看出来,这里对ngx_modules (Nginx 源码分析– 浅谈对模块module 的基本认知中有介绍)进行了索引编号,并且计算得到模块的总数ngx_max_module 。然后,对cycle 进行初始化,跳转到ngx_init_cycle 中。对于cycle 这个变量是nginx 的核心变量,可以说模块机制都是围绕它进行的,里面的参数比较复杂涉及到的内容十分多,本文并不详细对它讨论,可以将其看作是一个核心资源库。

2 、ngx_init_cycle 函数

这个函数在文件ngx_cycle.c 中(43 行),这个函数是nginx 初始化中最重要的函数之一,里面涉及到与cycle 变量相关的初始化工作,看到第188 行

这里获取了ngx_max_module 个指针空间,用来保存每个模块的配置信息,从cycle 变量的字段conf_ctx 命名中就可以知道,ctx 为context 上下文的缩写。接下来看到,下面这段:

意思就是获取模块中属于NGX_CORE_MODULE 类的模块,如果需要创建配置信息就创建相应的配置信息,并且将地址保存在先前创建好的cycle->conf_ctx 地址空间中,完成核心模块配置文件的创建过程,至此前期工作就基本完成了。

前面conf 的赋值那段,无非是对conf 进行些必要的初始化。注意一下这里解析的都是对核心模块进行的,创建的配置文件也只是核心模块。关键的函数开始出现了:ngx_conf_param(&conf)将conf 需要的参数(可能没有就是空)存到conf 中,ngx_conf_parse (&conf, &cycle->conf_file)解析配置文件!

3 、函数ngx_conf_parse 指令解析函数,关键函数!

在以上代码中,除了将关键函数用红色标记以外,还特意将 函数中 对上下文的保存和还原 工作的地方进行了红色标记,因为在nginx源码中经常使用到这种机制,可以记住下这样的写法。

4、函数ngx_conf_handler 指令处理函数,关键函数!

写到这里时间已经有些晚了,小结一下。通过代码摘录的介绍,将整个nginx.conf解析的流程 概括的演示了出来,对于其中的些地方可能还不明晰如:二级模块的指令是如何执行的(就是 events{ … }、http{ … } 括号里面的指令如何执行的)、非核心模块是如何加入对 nginx.conf 这个配置文件进行解析 等一些内容,在后面的分析中再写吧。晚安!

Original: https://www.cnblogs.com/jzhlin/archive/2012/06/18/nginx_conf_1.html
Author: Java研究者
Title: Nginx 源码分析– 模块module 解析执行 nginx.conf 配置文件流程分析 一

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616196/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring-Boot-9-Header参数获取

    Spring 获取Header参数1. 方法一:对应的部分加入@RequestHeader获取@Controllerpublic class HelloController {@R…

    Java 2023年5月30日
    073
  • 设计模式 16 命令模式

    命令模式(Command Pattern)属于 行为型模式 概述 现在各大电子厂商都在推智能家居,即可以通过手机这一个终端控制多个家用电器,比之前的单个设备智能由对应遥控器控制的方…

    Java 2023年6月6日
    078
  • 【Java并发编程】24、Synchronized实现原理解析

    我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。 1、底层原理 sync…

    Java 2023年5月29日
    0119
  • 这个Spring Security登录插件牛啊,验证码、小程序、OAuth2都能快速接入

    上次我们把验证码登录、小程序登录优雅地集成到了Spring Security,很多同学大呼过瘾,相比较一些传统玩法高级了很多。胖哥就赶紧抓住机会举一反三,把几个非标准的OAuth2…

    Java 2023年5月30日
    065
  • Maven安装和在IDEA配置Maven

    一、Windows安装Maven 1、下载Maven 这里需要注意:不要去官网下载最新的版本,因为会出现与IDEA不兼容的现象。 这里提供下载地址:https://archive….

    Java 2023年6月5日
    0110
  • ES查询1w条最大限制修改

    设置普通查询结果最大值 PUT _all/_settings {"index.max_result_window":26000} 设置聚合后 buckets桶的…

    Java 2023年6月13日
    097
  • SpringBoot配置Swagger2接口未显示分析

    0.背景 项目A继承自项目B, SpringBoot为 1.5.16.RELEASE B com.**** ****-SNAPSHOT 1.配置信息 项目A中配置的 Swagger…

    Java 2023年6月5日
    092
  • 你的博客被搜索引擎收录了吗?

    持续原创输出,点击上方蓝字关注我 前言 如何判断自己的博客被百度收录了? 如何操作? 准备一个百度站长账号 验证网站所有权 HTML验证 生成站点地图 如何自动推送? 总结 大部分…

    Java 2023年6月14日
    077
  • k8s v-1.20版本部署详细过程[实测可用无坑]

    k8s v-1.20版本部署详细过程[实测可用无坑] 1.部署环境准备 1.1 各软件版本 系统 Docker k8s Linux master 3.10.0-1160.el7.x…

    Java 2023年6月9日
    067
  • List 移除元素 报错 java.lang.UnsupportedOperationException

    异常信息:java.lang.UnsupportedOperationExceptionat java.util.AbstractList.remove(AbstractList….

    Java 2023年6月5日
    095
  • 代码审计(1)

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/rayob1/p/16353751.htmlAuthor…

    Java 2023年6月6日
    098
  • Java8新特性-Stream API

    Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一 个则是 Stream API(java.util.stream.*)。 Stream 是 Java8 中处…

    Java 2023年6月8日
    079
  • Springboot优雅参数校验,统一响应,异常处理

    1.统一响应 (1)统一状态码首先定义一个状态码接口,所有状态码都需要实现它 public interface StatusCode { public int getCode();…

    Java 2023年6月8日
    074
  • Java 读写 excel 实战完全解析

    背景 时值毕业季,很多毕业生初入职场。 因此,这边也写了一些新手相关的 Android 技术点。 比如上一篇的 Android 开发你需要了解的那些事 就是列举了一些小点,避免新手…

    Java 2023年5月29日
    0107
  • Typora笔记收费的解决

    现在的Typora收费了,但是官网还是可以找到历史版本 Typora在1.0版本之前的不收费!!! 所有只需要下载1.0版本之前的版本就可以解决 打不开官网的需要挂个梯子,进不去的…

    Java 2023年6月16日
    055
  • linux中find命令的摘要

    find命令的使用 按照时间查找 可以很方便按照时间查找文件 find -[mtime|atime|ctime] n #查找n天前当天[修改|访问|创建]的文件 find -[mt…

    Java 2023年6月7日
    089
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球