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

抽取了一个,进行了测试,如下:

cpp 复制代码
#include <bits/stdc++.h>

#define  NGX_OK          0
#define  NGX_ERROR      -1

#define NGX_MAX_INT_T_VALUE 99999999

int
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是对应的回调:

cpp 复制代码
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/* 模块看即可。

待续

相关推荐
福大大架构师每日一题30 分钟前
nginx 1.29.4 发布:支持 HTTP/2 后端与加密客户端问候(ECH),多项功能优化与修复
运维·nginx·http
爱宇阳1 小时前
宝塔面板 + Nginx + Spring Boot 零停机滚动发布完整教程
运维·spring boot·nginx
全栈工程师修炼指南1 小时前
Nginx | HTTP 反向代理:对上游服务端返回响应处理实践
运维·网络·nginx·安全·http
serve the people2 小时前
AI 模型识别 Nginx 流量中爬虫机器人的防御机制
人工智能·爬虫·nginx
Evan芙2 小时前
基于Nginx和Python的动态站点安装配置
数据库·python·nginx
元气满满-樱2 小时前
Nginx虚拟主机实验
运维·chrome·nginx
余生H3 小时前
反向代理与 Forwarded 相关 Header 深度解析
javascript·nginx·http
苹果醋33 小时前
JAVA设计模式之观察者模式
java·运维·spring boot·mysql·nginx
irisart4 小时前
第二章【开源功能】—— HTTP 服务器(上)
服务器·nginx·开源
fendouweiqian4 小时前
warm-flow 生产环境静态资源 404,本地正常的原因与 Nginx 配置解决方案
运维·nginx