Author: haoransun
Wechat: SHR—97
学习来源:极客时间-Nginx核心知识100讲,本人购买课程后依据视频讲解汇总成个人见解。
前言
正式开始学习HTTP模块之前,先要谈一谈指令的嵌套结构,每一个HTTP模块出现的指令,可能出现的Context(上下文),既可以在location中,也可以在server中,或是http中,当一个指令出现在多个配置块中时,它们的值可能是冲突的,到底以谁为准呢?或者在某个配置块下发现没有这个指令,但是在启动时却发现生效了,这样的机制是怎么实现的呢?还有很多的第三方模块可能不是很守规矩的去遵循官方制定的规则,这个时候我们应该怎样去判断配置指令到底是怎样生效,发生冲突时如何解决冲突呢?
典型的配置块嵌套
http–server–location 是HTTP框架来定义,处理一个请求时,先按照请求中的域名:如 host找到对应的server,再根据URL找到对应的location,根据location下具体的指令来处理请求。
指令的 Context
- log_format出现的上下文Context是在http中的,如果把它放在server、location时,启动nginx检查配置文件语法时,会失败,无法启动。
- access_log 同理。
指令的合并
存储值的指令继承规则:向上覆盖
listen指令只能出现在server上下文中
alias指令虽然可以出现在 http、server、location中,但是在上述图示中只在location中出现
server下的root /home/geek/nginx/html;而其他location中没有定义root,同样可以使用父配置块定义的root,如最下方的root。这是一个通用配置规则,只要该指令允许在子配置块中生效
在 location /test 下重新定义了一个 root /home/geek/nginx/test; 或者 access_log 也重新定义了,此时直接使用子配置覆盖父配置
HTTP模块合并配置的实现
举一个例子 ngx_http_referer_module防盗链模块,它们都有一个结构体是 ngx_module_t,相当于说明书。
该模块提供的配置指令,都在 *ngx_command_t ngx_http_referer_commands[] *中提及。
如 valid|referers 指令可以出现在 server、location下,可以携带1MORE(1个或多个)参数。
所有指令解析完要做合并,可以看 ngx_http_module_t 结构体。
它定义了 8个回调方法,重点看 ngx_http_referer_merge_conf,以上指令都是在location下生效的,所以需要 http、server向location合并。
合并规则
parent:父指令
child: 子指令
小结
以上介绍了HTTP模块指令合并规则,为下面正式学习HTTP每一个模块提供了技术帮助。