当前位置: 首页 > news >正文

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_tngx_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_commandsngx_http_core_module 之上。文件:nginx-release-1.26.0\src\http\ngx_http_core_module.c

ngx_mail_core_commandsngx_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 的了解和代码简单阅读&#xff0c;发现这个C代码的中间件确实存在过人之处&#xff0c;使用场景特别多&#xff0c;插件模块很丰富…...

笔试训练2

牛客.单词搜索 刚开始我就想是搜索&#xff0c;但是不清楚bfs还是dfs更好&#xff0c;我尝试了bfs但是队列存东西&#xff0c;没有我想象的那么好写&#xff0c;所以我决定试试dfs import java.util.*;public class Solution {static int m 0;static int n 0;static int […...

构建坚不可摧的Web安全防线:深入剖析二阶注入与全面防御策略

引言 在数字化时代&#xff0c;数据安全是企业和个人最为关注的问题之一。网络攻击手段层出不穷&#xff0c;其中SQL注入攻击尤为狡猾&#xff0c;它允许攻击者通过Web应用的漏洞对数据库进行非法操作。更隐蔽的是二阶注入攻击&#xff0c;它不仅威胁当前操作&#xff0c;还能…...

(4) qml动态元素

文章目录 概述注意 动画元素变化的策略Animation on 变化behavior on⽤standalone animation注意 缓冲曲线&#xff08;Easing Curves&#xff09;动画分组 概述 这⼀章介绍如何控制属性值的变化&#xff0c;通过动画的⽅式在⼀段时间内来改变属性值。这项技术是建⽴⼀个现代化…...

深度神经网络——什么是梯度下降?

如果对神经网络的训练有所了解&#xff0c;那么很可能已经听说过“梯度下降”这一术语。梯度下降是提升神经网络性能、降低其误差率的主要技术手段。然而&#xff0c;对于机器学习新手来说&#xff0c;梯度下降的概念可能稍显晦涩。本文旨在帮助您直观理解梯度下降的工作原理。…...

基本元器件 - 二极管

目录 二极管的主要参数 二极管的分类 整流二极管 快恢复二极管&#xff08;FRD&#xff09; 稳压&#xff08;齐纳&#xff09;二级管 瞬态电压抑制器&#xff08;TVS&#xff09; 开关二极管 肖特基二极管&#xff08;SBD&#xff09; 正偏与反偏 常用封装 伏安特性…...

【设计模式】单例模式(创建型)⭐⭐⭐

1.概念 1.1 什么是单例模式 单例模式属于创建型模式&#xff0c;一个单例类在任何情况下都只存在一个实例&#xff0c; 构造方法必须是私有的、由自己创建一个静态变量存储实例&#xff0c;对外提供一 个静态公有方法获取实例。 1.2 优点与缺点 优点:是内存中只有一个实例&…...

《深入浅出C语言:从基础到指针的全面指南》

1. 简介 C语言是一种通用的编程语言&#xff0c;广泛应用于系统编程、嵌入式系统和高性能应用程序。它由Dennis Ritchie在1972年开发&#xff0c;并且至今仍然非常流行。C语言以其高效、灵活和强大的功能著称&#xff0c;是许多现代编程语言的基础。 2. 基本语法 2.1 Hello, …...

Typescript高级: 深入实践Record类型

概述 Record 类型是TS中其众多强大特性之一它为我们提供了创建键值对映射的强大能力极大地增强了代码的灵活性与类型安全性 应用示例 1 &#xff09;用于配置场景 在复杂的项目中&#xff0c;配置文件往往包含多个模块的不同设置使用 Record 可以确保配置的键名正确且值类型…...

重构与优化-对象间特性搬移重构(2)

在软件开发过程中,重构是改进代码结构和设计、不改变其外在行为的过程。对象之间的特性搬移(Moving Features Between Objects)是重构的一种重要类型,它涉及到将属性、方法或其他特性从一个对象转移到另一个对象,以优化代码结构、提高可维护性和遵循设计原则。以下是几种典…...

网络流量监控与DNS流量分析

目录 一、网络流量监控的基础知识 什么是网络流量监控&#xff1f; 网络流量监控的重要性 实用案例&#xff1a;如何通过网络流量监控优化带宽利用 二、DNS流量分析的核心要点 什么是DNS流量分析&#xff1f; DNS流量分析的优势 实用技巧&#xff1a;如何通过DNS流量分…...

【数据分析】打造完美数据分析环境:Python开发环境搭建全攻略

打造完美数据分析环境&#xff1a;Python开发环境搭建全攻略 在数据分析的世界中&#xff0c;搭建一个稳定且高效的Python开发环境是至关重要的。本文将介绍三种主要的环境搭建方式&#xff1a;使用pip、Anaconda和Miniconda。 1. 使用pip从清华镜像安装Python包 pip是Pytho…...

我的app开始养活我了

大家在日常使用各类 app 时应该会发现&#xff0c;进入 app 会有个开屏广告&#xff0c;在使用 app 中&#xff0c;时不时的也会有广告被我们刷到。 这时候如果我们看完了这个广告&#xff0c;或者点击了这个广告的话&#xff0c;app商家就会获得这个广告的佣金。 这个佣金就是…...

linux中最基础使用的命令

小白学习记录&#xff1a; 前情提要&#xff1a;Linux命令基础格式!查看 ls看目录的小技巧 进入指定目录 cd查看当前工作目录 pwd创建一个新的目录(文件夹&#xff09; mkdir创建文件 touch查看文件内容 cat、more操作文件、文件夹- 复制 cp- 移动 mv- 删除【危险操作&#xff…...

【算法实战】每日一题:17.1 订单处理问题(差分思想,二分搜索)

题目 一个会议中心的场地预订系统。在接下来的 n 天里&#xff0c;会议中心有一定数量的会议室可供租用。共有 m 份预订请求&#xff0c;每份请求描述为 (d_i, a_i, b_i)&#xff0c;表示需要从第 a_i 天到第 b_i 天使用会议室&#xff08;包括第 a_i 天和第 b_i 天&#xff0…...

UML静态图-对象图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段&#xff0c;帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构&#xff0c;包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 对象图与类图之间的关系&…...

数据结构第三篇【链表的相关知识点一及在线OJ习题】

数据结构第三篇【链表的相关知识点一及在线OJ习题】 链表链表的实现链表OJ习题顺序表和链表的区别和联系 本文章主要讲解关于链表的相关知识&#xff0c;喜欢的可以三连喔 &#x1f600;&#x1f603;&#x1f604;&#x1f604;&#x1f60a;&#x1f60a;&#x1f643;&#…...

RabbitMQ-发布/订阅模式

RabbitMQ-默认读、写方式介绍 RabbitMQ-直连交换机(direct)使用方法 目录 1、发布/订阅模式介绍 2、交换机(exchange) 3、fanout交换机的使用方式 3.1 声明交换机 3.2 发送消息到交换机 3.2 扇形交换机发送消息代码 3.2 声明队列&#xff0c;用于接收消息 3.3 binding …...

客运提质增效新模式!苏州金龙客货邮融合公交闪耀2024道路运输展

5月31日&#xff0c;“2024北京国际商用车及零部件展览会”暨“2024北京国际道路客货运输车辆及零部件展览会”&#xff08;简称为“2024道路运输车辆展”&#xff09;在中国国际展览中心&#xff08;顺义馆&#xff09;落下帷幕。本届展会以“智能、绿色、安全&#xff0c;助力…...

【Python实战】使用postman测试flask api接口

cookie_demo.py # -*- coding: utf-8 -*- """ Time : 2024/5/28 17:14 Author : 娜年花开 File : cookie_demo.py Desc : 需求&#xff1a;用户需要先登陆&#xff0c;登陆之后&#xff0c;通过Cookie来判断是不是能够访问登录后的接口userinfo &quo…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

归并排序:分治思想的高效排序

目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法&#xff0c;由约翰冯诺伊曼在1945年提出。其核心思想包括&#xff1a; 分割(Divide)&#xff1a;将待排序数组递归地分成两个子…...

基于 HTTP 的单向流式通信协议SSE详解

SSE&#xff08;Server-Sent Events&#xff09;详解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 标准中定义的一种通信机制&#xff0c;它允许服务器主动将事件推送给客户端&#xff08;浏览器&#xff09;。与传统的 H…...