一、配置块的嵌套
nginx的配置块的嵌套基本事例:
main;
http {
upstream {}
split_clients {}
map {}
geo {}
server {
location {}
}
......
}
这是一个基本的嵌套配置。其中事件模块、配置进程、user的上下文都在main中,这不是我们重点关注的地方,我们要重点关注的地方是http模块及其里面的内容。
一个http模块模块中可以有多个server模块,当nginx接收到一个请求时,会先根据域名来确定哪个server模块执行,再根据url确定哪个location模块执行,那么当发生冲突时以谁为准呢?
二、指令的context
指令的context也就是该指令可以配置在哪些模块中,如下:
log_format的执行上下文为http,access_log的执行上下文为http、server......,当配置到其他模块中时,nginx将不会重启,并提示错误。
三、指令的合并
有些指令同时存在多个模块下时,是可以合并的,那么哪些指令可以合并,哪些不可以呢?
nginx所有的指令可以分为两类指令:值指令、动作指令。
值指令:存储配置项的值,例如root、gzip、access_log等,这类指令是可以合并的。
动作指令:指定行为的指令,比如return、rewrite、proxy_pass等,这类指令是不可以合并的。动作类指令的生效阶段是:server_rewrite、rewrite、content阶段。
例如:
......
server {
.....
access_log /logs/access_log.log;
location /api/ {
......
access_log /etc/nginx/logs/access_log.log;
}
location /static/ {
......
#没有配置access_log
}
}
......
这里有两个location配置,一个有配置access_log,一个没有配置,并且server模块中有配置access_log指令。
当请求/api/时,/api/对应的location中的access_log配置回覆盖server模块中的access_log配置,也就是access_log日志实际上回存储在/etc/nginx/logs/access_log.log中。
当请求/static/时,/static/对应的location中没有配置access_log,所以它会使用父配置的access_log配置,也就是/logs/access_log.log。
总结:子配置中不存在时,使用父配置的;子配置中存在时,覆盖父配置的。