当nginx 检测到 http{} 关键配置的时候, HTTP 配置模型启动, 首先建立一个ngx_http_conf_ctx_t 的上下文结构 typedef struct { void ** main_conf; void ** srv_conf; void ** loc_conf; // 指针数组, 数组的每个元素指向相应 HTTP 模块 的 create_loc_conf 方法产生的结构体的地址 } ngx_http_conf_ctx_t; HTTP 框架为所有的HTTP 模块建立 3个数组, 分别存放 create_main_conf, create_srv_conf, create_loc_conf 方法所返回的地址指针。即ngx_http_conf_ctx_t 结构保存了所有HTTP 模块的配置数据结构的入口。
解析HTTP 配置的流程对于每一个server 块, location 块, http 块 都会建立一个相应的 ngx_http_conf_ctx_t 的结构
HTTP配置模型的内存结构
通过上面的图, 我们可以知道, nginx.conf中 http{}, server{}, location{} 的总个数 与 调用create_loc_conf方法的次数相同; 而 http{}, server{} 的总个数 与 调用create_srv_conf 方法的次数相同。 而这些方法每被调用一次就生成一个结构体。 (便于解决同名配置项的合并问题)。
调用 merge_srv_conf, 和 merge_loc_conf 进行配置项合并
预设配置项处理方法的工作原理通过 使用 cf->args->elts 直接获取配置参数
nginx 配置项解析模块在调用 ngx_command_t 结构体的set 方法的时候, 会同时把offset 编译传递进来。由此, 可以正确识别需要解析的配置项的存储位置
error日志
可以使用 ngx_log_error / ngx_log_debug 进行日志记录
请求上下文在一个请求的处理过程中, 用类似struct 这样的结构体把一些关键的信息保存起来的结构体, 称为上下文上下文是针对一个请求 一个模块而言的, 因而他是低耦合的
使用方法:
两个宏:
ngx_http_get_module_ctx
ngx_http_set_ctx
一般的调用方式是:
可以看到这里先设置了上下文,然后后面就可以获取它并进行使用
HTTP 框架维护上下文结构的方式
类似于ngx_http_conf_ctx_t 的 3 个数组成员, HTTP 框架 使用 ctx 数组 保存所有 HTTP 模块上下文结构体的指针 struct ngx_http_request_s { ... void ** ctx; ... }
ngx_http_get_module_ctx 和 ngx_http_set_ctx 的原理就是去获取或设置 ctx 数组中相应的 HTTP 模块的指针
下面关于Nginx的文章您也可能喜欢,不妨参考下:
CentOS上安装Nginx服务器实现虚拟主机和域名重定向
CentOS 6.8 安装LNMP环境(Linux+Nginx+MySQL+PHP)
Linux下安装PHP环境并配置Nginx支持php-fpm模块
Ubuntu 16.04上启用加密安全的Nginx Web服务器