nginx 源码分析 1 - 配置解析

nginx源码阅读(一).综述 前言 nginx作为一款开源的轻量级高性能web服务器,是非常值得立志从事服务端开发方向的人学习的。现今nginx的最新版本是nginx-1.13.6,代码量也日渐庞大,但是由于其核心思想并没改变,为了降低阅读难度,我选择的是nginx-1.0.15版本,并且由于时间和水平有限,重点关注的是nginx的启动以及进程模型、事件模块中的epoll模块、负载均衡以及整体的框架等方面。 这里先推荐两本 阅读详情

看了nginx代码,感觉应该写点什么,记下来,自己以后慢慢看,很多还是浅浅的懂了那么点点

看代码,首先进入的当然是main函数了,

nginx.c -> main()

进入后,是一堆的一些init初始化

 if (ngx_strerror_init() != NGX_OK) {
        return 1;
    }


    if (ngx_get_options(argc, argv) != NGX_OK) {
        return 1;
    }


局部变量有一个cycle, init_cycle 

看代码可以看到,起初把一些配置信息都是放到init_cycle里面,然后通过

  cycle = ngx_init_cycle(&init_cycle);

把需要的本模块的配置指令都返回到cycle里面,形成一个全新的配置信息;



看代码的时候在 ngx_init_cycle(&init_cycle)之前,会有

    ngx_max_module = 0;
    for (i = 0; ngx_modules[i]; i++) {
        ngx_modules[i]->index = ngx_max_module++;
    }

这个地方主要是做了一个统计,统计一下最大的ngx_max_module量,同时呢,赋值每一个ngx_modules的index变量; ngx_modules是一个全局的数组,存放着每一个模块的地址;查看源码的时候发现找ngx_modules的时候一直找不到,只有一个地方声明了一下,没有地方实现!!那怎么来了这么多地址呢,实际上,ngx在执行configur脚本的时候,会自动的把所要添加的模块,放到ngx_modules数组里面,进行定义,在configur后,生成一个objs/ngx_modules.c里面,如果你打开这个文件后,你就自然明白了;


接着往下走,进入

cycle = ngx_init_cycle(&init_cycle);

这个主要初始化一些ngx的配置信息,及把一些指令里面的函数钩子都进行赋值和实现;

下面看看这个函数吧,

进入后,发现刚开始就是把一些old_cycle赋值给新的cycle

    cycle->pool = pool;
    cycle->log = log;
    cycle->old_cycle = old_cycle;


    cycle->conf_prefix.len = old_cycle->conf_prefix.len;
    cycle->conf_prefix.data = ngx_pstrdup(pool, &old_cycle->conf_prefix);
    if (cycle->conf_prefix.data == NULL) {
        ngx_destroy_pool(pool);
        return NULL;
    }

初始化一个文件的list,ngx的list结构我在这里就不多说了,可以自己查看一下,

主要有一个数组存储信息,同事有一个n  和size表示数据的容纳的最大个数和数组的大小,在ngx_list_part_t数组里面有个nelts ,表示数据已经容纳多少个了,具体可以自己下去再查看查看;

 if (ngx_list_init(&cycle->open_files, pool, n, sizeof(ngx_open_file_t))
        != NGX_OK)
    {
        ngx_destroy_pool(pool);
        return NULL;
    }


接着下面走,

if (ngx_conf_parse(&conf, &cycle->conf_file) != NGX_CONF_OK) {
        environ = senv;
        ngx_destroy_cycle_pools(&conf);
        return NULL;
    }

看到这俩个部分,重点在ngx_conf_parse里面, 把配置文件名,穿进去,然后进行一行行的解析,

进入 ngx_conf_parse看到

rc = ngx_conf_read_token(cf);

这个主要就是读取每一行,如果配置正确就返回正确的值,并保存配置指令及参数的值

然后下面调用

        rc = ngx_conf_handler(cf, rc);

开始查找指令为name的module, 然后找到后,进行下一步

    for (i = 0; ngx_modules[i]; i++) {
        cmd = ngx_modules[i]->commands;
        if (cmd == NULL) {
            continue;
        }
        for ( /* void */ ; cmd->name.len; cmd++) {
            if (name->len != cmd->name.len) {
                continue;
            }
            if (ngx_strcmp(name->data, cmd->name.data) != 0) {
                continue;
            }
            found = 1;

判断参数是否满足指令块的配置, 这在写模块的时候,里面都有指定

 if (!(cmd->type & NGX_CONF_ANY)) {
               if (cmd->type & NGX_CONF_FLAG) {
                    if (cf->args->nelts != 2) {

                       goto invalid;
                    }
                } else if (cmd->type & NGX_CONF_1MORE) {
                    if (cf->args->nelts < 2) {
                        goto invalid;
                    }
                } else if (cmd->type & NGX_CONF_2MORE) {
                    if (cf->args->nelts < 3) {
                        goto invalid;
                    }

当上面一切条件满足后,开始调用

      rv = cmd->set(cf, cmd, conf);

执行模块挂上钩子信息;这个set方法具体实现是在你的模块里面实现的;

然后配置基本完毕,返回;

返回到main函数里面继续下一步,然后开始初始化其余的信息;进程信息 等等!!


Nginx源码安装和基础配置 Nginx简介 nginx: 世界第二大web服务器软件,以高并发、低消耗著称,源自于俄罗斯,创建者 Igor(伊戈尔),2004年开源,最早以代理服务器的身份出现,2015成立nginx公司,2019年以6.7亿被F5 Networks公司收购。 代理服务器: 正向:squid 反向: squid:最古老的代理服务器 LVS: 优点: 1.抗负载能力强、是工作在网络4层之上仅作分发之用 2.配置性比较低,这是一个缺点也是一个优点,简单不易出错 3.工作稳定,抗负载能力很强,有完整的双机热备方案 阅读详情

相关推荐

使用 Ansible Playbook 实现 LNMP 的动静分离详细示例

使用 Ansible Playbook 实现 LNMP 的动静分离实验拓扑1、安装 Ansible2、添加 hosts2.1 添加主机并进行登陆验证2.2 编辑 Ansible hosts 文件2.3 查看主机列表并检测状态3、 进行 Playbook 编写3.1 lnmp.yaml 内容3.2 lnmp.yaml 文件中涉及的文件内容3.3 lnmp.yaml 语法检查3.3 lnmp.yaml...

weixin_44983653的博客 638

nginx-源码安装

1、nginx安装(源码安装) 1、安装依赖包 yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c++ 2、解压安装nginx tar -zxf nginx-1.18.0.tar cd nginx-1.18.0 ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_modu

weixin_47647077的博客 611

nginx源码分析—启动流程

作者:阿波 本文链接:http://blog.youkuaiyun.com/livelylittlefish/article/details/7243718 Content 0. 序 1. main()分析 2. 注意问题 2.1 几个初值 2.2 nginx工作模式 2.3 一些配置 2.4 其他开关 3. 小结 0. 序 本文主要分析nginx主程序。 nginx主程序mai

学习,思考,记录,分享。 3万+

nginx源码安装及其虚拟主机配置

nginx源码安装及其虚拟主机配置

qq_62974496的博客 924

nginx stream proxy 模块的ssl连接源码分析

本为对 nginx的ngx_stream_proxy_module与上游服务器建立ssl连接的过程进行了详细分析。

一个致力于开源代码学习、分析和交流的博客 3331

手把手教你搭建日本亚马逊CVV钓鱼系统(含自动验证功能)

本文详细介绍了电商平台安全防护的关键实践,重点讲解了如何构建自动化风控系统。内容包括基础架构设计、用户行为分析、交易风险评估模型构建、验证机制实现以及系统部署优化,帮助电商平台有效识别和防范安全威胁,同时提升用户体验。

weixin_30952535的博客 816

nginx——安装和配置详解

参考文章:nginx安装和配置详解 第一章Nginx介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点开发的。 如果需要更加详细的了解nginx,可以通过nginx的官网去了解,下面是nginx的官网地址 一、中文官网地址 https://w...

m47838704的专栏 5万+

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 461

[nginx源码分析]配置解析1

nginx源码分析,配置解析

Ubuntu黑客 1274

破解雪球网acw_sc__v2加密与无限debugger反爬策略

本文详细解析了雪球网的反爬机制,重点破解了其核心的acw_sc__v2加密参数与无限debugger反调试策略。通过实战案例,从抓包分析、逆向调试到算法还原,提供了完整的Python代码实现,帮助开发者掌握应对类似加密反爬的通用方法。

weixin_29207533的博客 1897

OMNeT++入门指南:从tictoc1到tictoc18的实例解析与实战演练

本文是OMNeT++网络仿真框架的入门实战指南,详细解析了从tictoc1到tictoc18的经典示例。内容涵盖OMNeT++的下载安装、核心三文件(.ned, .cc, .ini)的编写、模块化建模、自定义消息、数据统计与可视化,以及参数化批量仿真等核心技能,帮助读者从零开始掌握这一强大的网络仿真工具。

weixin_29228781的博客 329

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module

模块的基本属性&ngx_core_module_ctx, /* 模块上下文 */ngx_core_commands, /* 模块支持的配置指令 */NGX_CORE_MODULE, /* 模块类型 */NULL, /* init_master 回调 */NULL, /* init_module 回调 */NULL, /* init_process 回调 */NULL, /* init_thread 回调 */NULL, /* exit_thread 回调 */

weixin_41812346的博客 733

512分辨率万能遮罩模型实战指南:从下载到高精度应用

本文提供了512分辨率万能遮罩模型的完整实战指南。该模型经过超过540万次迭代,专门优化了对头发、手、眼睛等复杂区域的识别。文章详细介绍了从可靠渠道下载、环境部署、使用DF_ICE工具批量应用遮罩,到利用XSeg Editor进行高精度精修的全流程,旨在帮助用户显著提升AI换脸合成视频的质量与效率。

y2z3a4b5c的博客 1163

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_param

通过。

weixin_41812346的博客 1145

1.4 《SST通用技术规范》整体框架与核心条款解读

本小节以**GB/T《电力电子变压器通用技术要求》**(固态变压器SST核心通用规范)为核心依据,结合电力电子变压器技术特性与工程应用边界,系统解析规范的整体章节框架、层级逻辑与强制性/推荐性核心条款,明确规范与传统工频变压器标准的差异,为SST拓扑设计、性能验证、出厂检验与工程落地提供标准化依据。全文以标准原文、期刊文献数据与试验规范为支撑,无主观推演与感性表述。

技术工作者 1683

手把手教学:利用AutoDL与vLLM快速部署DeepSeek-R1大模型实战指南

本文详细介绍了如何利用AutoDL平台和vLLM框架快速部署DeepSeek-R1大模型的实战指南。从服务器配置、vLLM安装优化到模型部署的两种方案,再到性能调优和生产环境建议,手把手教你高效完成大模型部署。特别针对国内开发者遇到的网络问题提供了稳定解决方案,并分享了显存优化、磁盘清理等实用技巧。

weixin_42531779的博客 327

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_read_token

在。

weixin_41812346的博客 1172

解锁 Bootloader 不再难!HyperOS澎湃系统小米与红米手机通用

必要时,可以在工具右上角安装驱动模块,手动安装驱动。解决方法:确保手机升级到最新稳定版,登录同一个小米账号,并在。新机型解锁时需要等待一段时间,通常为 7 天。如果账号安全评分较低,解锁等待时间会更长。如果解锁失败提示权限不足,说明账号存在安全问题。出现这个错误时,通常是因为网络不稳定。如果解锁次数已满,需要等到下个月。解锁后,手机会重启,首次开机会稍微慢一些,等耐心等待即可。按钮,开始解锁过程,注意:解锁会清除手机内所有数据。7次,开启开发者选项。,右键解压到指定文件夹。,使用小米账号登录。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 7221

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数

【代码】Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数。

weixin_41812346的博客 560

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_core_module_t

定义在 是 Nginx 核心模块的关键结构体,用于定义核心模块的配置管理行为。以下是对该结构体及其成员的详细解释: 为核心模块提供统一的接口,使 Nginx 框架能够: 2. 作用:回调函数,用于创建模块的配置结构。 调用时机:在解析配置文件前被 Nginx 框架调用。 功能: 为模块分配配置结构的内存(通常使用内存池 )。 初始化配置结构的默认值(如设置默认的工作进程数、超时时间等)。 3. 作用:回调函数,用于验证和调整配置。 调用时机:在配置解析完成后被调用。 功能: 验

weixin_41812346的博客 635

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

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

Nginx源码分析(25篇)

Nginx源码分析 - 初探Nginx的架构 Nginx源码分析 - 基础数据结构篇 - 内存池 ngx_palloc.c Nginx源码分析 - 基础数据结构篇 - 数组结构 ngx_array.c Nginx源码分析 - 基础数据结构篇 - 缓冲区结构 ngx_buf.c Nginx源码分析 - 基础数据结构篇 - 双向链表结构 ngx_queue.c Nginx源码分析 ......

奇华资料的博客 9万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NGINX动态DNS解析原理及源码分析

原文作者:皮皮鲁 原文链接:NGINX动态DNS解析原理及源码分析 - NGINX开源社区 转载来源:NGINX开源社区 一. 概述 NGINX在配置上游的服务器时,支持域名配置。根据不同的配置,NGINX提供了静态和动态解析两种方式。本文试图从代码层面分析动态dns解析是如何实现的。 a. 静态解析 http { upstream test { server private.server1.com.cn;

NGINX开源社区的博客 1127

配置指令-listen

【代码】配置指令-listen。

weixin_41812346的博客 175

nginx源码分析--配置文件解析

ngx-conf-parsing 对 Nginx 配置文件的一些认识: 配置指令具有作用域,分为全局作用域和使用 {} 创建其它作用域。同一作用域的不同的配置指令没有先后顺序;同一作用域是否能使用相同的指令,和对相 同指令的处理由各模块自行决定整个 Nginx 的运行时各模块行为都和配置指令密切相关每个配置指令都只能在预先定义好的作用域中使用配置指令解析使用递归的方式 配置解析相关代码量

鱼思故渊的专栏 1634

nginx源码分析----解析upstream配置

nignx解析配置文件时,当遇到一下配置时,会做哪些事情? upstream test.balancer.com { 1.1.1.1:80; 2.2.2.2:80; } 一、 存储upstream配置的三大结构体 首先需要解决upstream配置的存储问题,nginx是通过ngx_http_upstream_main_conf_t,ngx_http_upstream_srv_conf...

qq_26312651的博客 1323

深入理解nginx mp4流媒体模块[上]

本文通过对nginx mp4模块的源码分析,来学习nginx mp4模块的功能和实现原理。 并对mp4格式的分析有一个更加深入的了解。

一个致力于开源代码学习、分析和交流的博客 2478
上一篇: 网络包流程
下一篇: makefile 书写
Dablekai
博客等级 码龄15年 2粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值