nginx源码阅读理解 [持续更新,建议关注]
文章目录
- 前述
- 一、nginx 进程模型基本流程
- 二、源码里的小点
- 1.对字符串操作都进行了原生实现
- 2.配置文件解析也是原生实现
- 待续
前述
通过对 nginx 的了解和代码简单阅读,发现这个C代码的中间件确实存在过人之处,使用场景特别多,插件模块很丰富,近些年 nginx 用户量也是飙升,所以和大家一起学习下 nginx 源码。后续通过阅读源码方式不断更新本篇文章,希望能够坚持读下去,并给大家带来 nginx 源码级的阅读体验。[抱拳]
个人阅读的 nginx 代码版本度盘: nginx-release-1.26.0.tar.gz
其他或最新版本见 nginx 官网:https://nginx.org/
一、nginx 进程模型基本流程

当然了,除了上述进程模型流程,I/O多路复用技术也是必然的,大家可以从目录 nginx-release-1.26.0\src\event\modules\ 下找到:

这个实现也是比较丰富的,如果不熟悉I/O多路复用,可阅读:I/O多路复用技术最佳学习实践及总结(含完整实现源码) 。
二、源码里的小点
1.对字符串操作都进行了原生实现
详见 nginx-release-1.26.0\src\core\ngx_string.h

抽取了一个,进行了测试,如下:
#include <bits/stdc++.h>#define NGX_OK 0
#define NGX_ERROR -1#define NGX_MAX_INT_T_VALUE 99999999int
ngx_atoi(unsigned char *line, size_t n)
{int value, cutoff, cutlim;if (n == 0) {return NGX_ERROR;}cutoff = NGX_MAX_INT_T_VALUE / 10;cutlim = NGX_MAX_INT_T_VALUE % 10;for (value = 0; n--; line++) {if (*line < '0' || *line > '9') {return NGX_ERROR;}if (value >= cutoff && (value > cutoff || *line - '0' > cutlim)) {return NGX_ERROR;}value = value * 10 + (*line - '0');}return value;
}int main()
{unsigned char str[] = "999";std::cout << ngx_atoi(str, strlen((char*)str)) - 1 << std::endl;return 0;
}
2.配置文件解析也是原生实现
nginx中配置是以 command 的方式展现的,如 类型 ngx_command_t 的 ngx_core_commands nginx 核心运行相关命令的全局变量是的一个结构体数组,附着于 ngx_module_t ngx_core_module 之上。文件:nginx-release-1.26.0\src\core\nginx.c
ngx_core_commands 结构如下,除了 daemon 和 worker_processes (指定工作进程数,auto 表示自动根据 CPU 核心数设置) 其他都折叠起来了。

ngx_command_t 结构体如下,与上述图片中的参数结合来看,set是对应的回调:
struct ngx_command_s {ngx_str_t name;ngx_uint_t type;char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);ngx_uint_t conf;ngx_uint_t offset;void *post;
};typedef struct ngx_command_s ngx_command_t;
相同的:
ngx_http_core_commands 于 ngx_http_core_module 之上。文件:nginx-release-1.26.0\src\http\ngx_http_core_module.c
ngx_mail_core_commands 于 ngx_mail_core_module 之上。文件:nginx-release-1.26.0\src\mail\ngx_mail_core_module.c
…
类推的,其他模块的配置都是这样,通过预定义的 static ngx_command_t 静态全局变量绑定到自身模块结构体 static ngx_core_module_t ngx_*_module_ctx 上去。上述就是nginx的配置方式了,需要看哪个配置直接去对应的 src/* 模块看即可。
待续
相关文章:
nginx源码阅读理解 [持续更新,建议关注]
文章目录 前述一、nginx 进程模型基本流程二、源码里的小点1.对字符串操作都进行了原生实现2.配置文件解析也是原生实现待续 前述 通过对 nginx 的了解和代码简单阅读,发现这个C代码的中间件确实存在过人之处,使用场景特别多,插件模块很丰富…...
笔试训练2
牛客.单词搜索 刚开始我就想是搜索,但是不清楚bfs还是dfs更好,我尝试了bfs但是队列存东西,没有我想象的那么好写,所以我决定试试dfs import java.util.*;public class Solution {static int m 0;static int n 0;static int […...
构建坚不可摧的Web安全防线:深入剖析二阶注入与全面防御策略
引言 在数字化时代,数据安全是企业和个人最为关注的问题之一。网络攻击手段层出不穷,其中SQL注入攻击尤为狡猾,它允许攻击者通过Web应用的漏洞对数据库进行非法操作。更隐蔽的是二阶注入攻击,它不仅威胁当前操作,还能…...
(4) qml动态元素
文章目录 概述注意 动画元素变化的策略Animation on 变化behavior on⽤standalone animation注意 缓冲曲线(Easing Curves)动画分组 概述 这⼀章介绍如何控制属性值的变化,通过动画的⽅式在⼀段时间内来改变属性值。这项技术是建⽴⼀个现代化…...
深度神经网络——什么是梯度下降?
如果对神经网络的训练有所了解,那么很可能已经听说过“梯度下降”这一术语。梯度下降是提升神经网络性能、降低其误差率的主要技术手段。然而,对于机器学习新手来说,梯度下降的概念可能稍显晦涩。本文旨在帮助您直观理解梯度下降的工作原理。…...
基本元器件 - 二极管
目录 二极管的主要参数 二极管的分类 整流二极管 快恢复二极管(FRD) 稳压(齐纳)二级管 瞬态电压抑制器(TVS) 开关二极管 肖特基二极管(SBD) 正偏与反偏 常用封装 伏安特性…...
【设计模式】单例模式(创建型)⭐⭐⭐
1.概念 1.1 什么是单例模式 单例模式属于创建型模式,一个单例类在任何情况下都只存在一个实例, 构造方法必须是私有的、由自己创建一个静态变量存储实例,对外提供一 个静态公有方法获取实例。 1.2 优点与缺点 优点:是内存中只有一个实例&…...
《深入浅出C语言:从基础到指针的全面指南》
1. 简介 C语言是一种通用的编程语言,广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发,并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称,是许多现代编程语言的基础。 2. 基本语法 2.1 Hello, …...
Typescript高级: 深入实践Record类型
概述 Record 类型是TS中其众多强大特性之一它为我们提供了创建键值对映射的强大能力极大地增强了代码的灵活性与类型安全性 应用示例 1 )用于配置场景 在复杂的项目中,配置文件往往包含多个模块的不同设置使用 Record 可以确保配置的键名正确且值类型…...
重构与优化-对象间特性搬移重构(2)
在软件开发过程中,重构是改进代码结构和设计、不改变其外在行为的过程。对象之间的特性搬移(Moving Features Between Objects)是重构的一种重要类型,它涉及到将属性、方法或其他特性从一个对象转移到另一个对象,以优化代码结构、提高可维护性和遵循设计原则。以下是几种典…...
网络流量监控与DNS流量分析
目录 一、网络流量监控的基础知识 什么是网络流量监控? 网络流量监控的重要性 实用案例:如何通过网络流量监控优化带宽利用 二、DNS流量分析的核心要点 什么是DNS流量分析? DNS流量分析的优势 实用技巧:如何通过DNS流量分…...
【数据分析】打造完美数据分析环境:Python开发环境搭建全攻略
打造完美数据分析环境:Python开发环境搭建全攻略 在数据分析的世界中,搭建一个稳定且高效的Python开发环境是至关重要的。本文将介绍三种主要的环境搭建方式:使用pip、Anaconda和Miniconda。 1. 使用pip从清华镜像安装Python包 pip是Pytho…...
我的app开始养活我了
大家在日常使用各类 app 时应该会发现,进入 app 会有个开屏广告,在使用 app 中,时不时的也会有广告被我们刷到。 这时候如果我们看完了这个广告,或者点击了这个广告的话,app商家就会获得这个广告的佣金。 这个佣金就是…...
linux中最基础使用的命令
小白学习记录: 前情提要:Linux命令基础格式!查看 ls看目录的小技巧 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹) mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删除【危险操作ÿ…...
【算法实战】每日一题:17.1 订单处理问题(差分思想,二分搜索)
题目 一个会议中心的场地预订系统。在接下来的 n 天里,会议中心有一定数量的会议室可供租用。共有 m 份预订请求,每份请求描述为 (d_i, a_i, b_i),表示需要从第 a_i 天到第 b_i 天使用会议室(包括第 a_i 天和第 b_i 天࿰…...
UML静态图-对象图
概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段,帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构,包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 对象图与类图之间的关系&…...
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】 链表链表的实现链表OJ习题顺序表和链表的区别和联系 本文章主要讲解关于链表的相关知识,喜欢的可以三连喔 😀😃😄😄😊😊🙃&#…...
RabbitMQ-发布/订阅模式
RabbitMQ-默认读、写方式介绍 RabbitMQ-直连交换机(direct)使用方法 目录 1、发布/订阅模式介绍 2、交换机(exchange) 3、fanout交换机的使用方式 3.1 声明交换机 3.2 发送消息到交换机 3.2 扇形交换机发送消息代码 3.2 声明队列,用于接收消息 3.3 binding …...
客运提质增效新模式!苏州金龙客货邮融合公交闪耀2024道路运输展
5月31日,“2024北京国际商用车及零部件展览会”暨“2024北京国际道路客货运输车辆及零部件展览会”(简称为“2024道路运输车辆展”)在中国国际展览中心(顺义馆)落下帷幕。本届展会以“智能、绿色、安全,助力…...
【Python实战】使用postman测试flask api接口
cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求:用户需要先登陆,登陆之后,通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…...
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛
千问3.5-2B多场景落地:电商商品图识别、医疗报告图释义、工业缺陷初筛 1. 开箱即用的视觉理解工具 千问3.5-2B是Qwen系列中的小型视觉语言模型,它能够理解图片内容并生成相关文本描述。这个工具特别适合需要快速处理图片信息的场景,比如电商…...
SAP移动类型全解析:从收货到移库,一文搞懂库存管理核心配置
SAP移动类型实战指南:解锁库存管理的核心密码 当你第一次在SAP系统中执行货物移动时,面对上百种移动类型代码,是否感到无从下手?作为全球500强企业广泛采用的ERP系统,SAP的库存管理模块以其严谨性和灵活性著称…...
使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例
使用Cosmos-Reason1-7B分析网络协议交互逻辑:以TCP三次握手为例 最近在尝试用大模型来理解一些复杂的系统交互逻辑,发现了一个挺有意思的用法。我们团队在测试Cosmos-Reason1-7B时,没有让它写代码或者生成文案,而是给了它一个更“…...
GLM-4.6V-Flash-WEB新手入门:从镜像加速到网页推理实战
GLM-4.6V-Flash-WEB新手入门:从镜像加速到网页推理实战 1. 为什么选择GLM-4.6V-Flash-WEB 智谱AI最新开源的GLM-4.6V-Flash-WEB是一款专为实际业务场景优化的多模态视觉大模型。它结合了视觉理解和语言生成能力,特别适合需要快速部署的Web应用场景。 …...
让ai替你思考架构:描述需求,快马智能生成带rabbitmq的微服务通知系统代码
最近在做一个微服务通知系统,用到了RabbitMQ这个强大的消息队列工具。说实话,消息队列的配置和绑定关系一开始让我有点头疼,好在发现了InsCode(快马)平台的AI辅助功能,整个过程变得轻松多了。下面分享下我的实现思路和经验。 系统…...
HTML新手入门教程(二)
一、网页图像标签以及超链接 接着上篇文章,这次我们来学习一下图像标签、超链接标签如何使用,以及使用效果。本文章我们以<img>和<a>标签来展开教学。 在 HTML 中,<img>标签用于在网页中插入图像。它的作用是可以把文档中…...
Agent如何帮助企业实现人效最大化?——深度拆解AI Agent驱动的企业生产力变革路径
在2026年的产业化浪潮中,AI Agent正在从“技术概念”转变为企业实现“人效最大化”的核心驱动力。这场变革的本质并非简单的工具迭代,而是企业组织形态与工作流的深度重塑。通过将人类从重复、低效的执行性工作中解放出来,企业智能自动化正推…...
Cadence Virtuoso实战:从反相器原理图到GDS版图,手把手搞定你的第一个CMOS Layout
Cadence Virtuoso实战:从反相器原理图到GDS版图全流程解析 在集成电路设计领域,从原理图到物理版图的实现是一个充满挑战又极具成就感的过程。对于初入行的工程师或微电子专业学生来说,掌握Cadence Virtuoso工具链的完整工作流程,…...
Java调用C/C++/Rust的5种方式:FFI vs JNI vs JNA vs JNR vs Panama——2024权威对比评测
第一章:Java外部函数接口概述与技术演进脉络Java外部函数接口(Foreign Function & Memory API),即Project Panama的核心成果,是Java平台为高效、安全地与本地代码(如C/C库)及非堆内存交互而…...
企业内网必看:用U盘搞定Ubuntu服务器Docker离线部署(含依赖树分析)
企业级Ubuntu服务器Docker离线部署全指南:从依赖分析到实战落地 在金融、医疗等对网络安全要求极高的行业,服务器往往部署在物理隔离的内网环境中。这种封闭式架构虽然最大程度降低了外部攻击风险,却给软件部署带来了独特挑战——如何在没有互…...
