一、在了解Nginx模块开发前,首先得知道在Nginx中http初始化流程、11个状态机、http请求具体流程。
(1)conf文件加载
对conf文件内容进行初始化,在命令行执行nginx -c ./conf/nginx.conf的之后,开始解析conf文件,启动http模块(入口:ngx_http_block)。
(2)状态机初始化
ngx_http_init_phase_handlers,保存状态机每个阶段需要处理的handler。
(3)tcp server启动
ngx_http_optimize_servers里面ngx_http_init_listening监听多个端口,这里是在master进程监听。
(4)http处理流程
业务处理逻辑是在worker进程处理,每一个worker都有一个ngx_worker_process_cycle()函数无限循环的处理,这个函数处理流程:
(a)accpet_cb接收和处理事件
(b)处理 request 的 header 和 body
(c)产生响应,并发送回客户端
一个HTTP Request 的处理过程涉及到以下几个阶段:
(a)初始化 HTTP Request(读取来自客户端的数据,生成 HTTP Request 对象);
(b)处理请求头;
(c)处理请求体;
(d)调用与此请求(location)关联的handler;
(e)依次调用各phase handler进行处理。
每一个phase就是一个阶段/状态,每个状态包含若干个handler,依次调用该状态的handler对HTTP Request进行处理,包括获取location配置、产生适当的响应、发送response header、发送response body
二、Nginx模块包括:event、handler、filter、upstream、load-balancer等,本文主要讲handler、filter、upstream等模块的开发;对于这3种模块的开发,模块配置指令结构、模块上下文写法类似。
(1)handler模块
接收客户端请求并产生输出的模块,每个模块就需要定义三个不同的数据结构去进行存储。
(a)模块配置信息存储结构
//以hello模块为例
typedef struct
{
ngx_str_t hello_string;
ngx_int_t hello_counter;
}ngx_http_hello_loc_conf_t;
(b)模块配置指令结构
struct ngx_command_s {
ngx_str_t name;//配置指令的名称
ngx_uint_t type;//该配置的类型,配置接收参数个数
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);//处理指令handler
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
};