Nginx的HTTP框架基本由1个核心模块ngx_http_module
、两个HTTP模块(ngx_http_core_module
、nginx_http_upstream_module
)组成,负责调用其他HTTP模块来一起处理用户请求。Nginx把HTTP请求处理流程划分为了11个阶段,其中每个处理阶段都可以由任意多个HTTP模块流水式地处理请求。
管理配置项相关的结构体
ngx_http_module
ngx_http_module
是HTTP模块的核心模块,该模块的功能是定义新的HTTP模块类型,并为每个HTTP模块定义通用接口ngx_http_module_t
结构体,管理HTTP模块生成的配置项结构体,并解析HTTP类配置项。
Nginx定义了一种基础类型的模块:核心模块,它的模块类型叫做NGX_CORE_MODULE, 在ngx_config_file.h
中,
1 | typedef struct { |
其中create_conf
回调方法来创建存储配置顼的数据结构,在读取nginx.conf
配置文件时,会根据模块中的ngx_command_t
把解析出的配置项存放在这个数据结构中;它还提供了init_conf
回调方法,用于在解析完配置文件后,使用解析出的配置项初始化核心模块功能。
ngx_command_t
定义在nginx_http.c
中,解析HTTP模块的入口函数是ngx_http_block
:
1 | static ngx_command_t ngx_http_commands[] = { |
那么接下来看看ngx_http_module
核心模块的定义
1 | /* 定义核心模块的通用接口上下文结构 */ |
ngx_http_module_t
在Nginx中定义了HTTP模块的通用接口ngx_http_module_t
结构体,该结构体定义在文件ngx_http_config.h
,把直属于http{}
、server{}
、location{}
块的配置项分别称为main、srv、loc级别配置项。
1 | typedef struct { |
11个阶段
HTTP模块在处理已经解析完毕的HTTP请求、获得并解析配置项后,将一个请求分为顺序性的多个处理阶段,前一个阶段的结果会影响后一个阶段的处理。一个请求在Nginx处理的示意图:
在ngx_http_core_module.h
中有11个阶段的定义:
1 | typedef enum { |
目前只是简单看了一下这几处的源码,后面再安排仔细读一下好了😄
参考
1、《深入理解Nginx(第2版)》
2、《Nginx核心知识100讲》