冲突的指令配置以谁为准

228 阅读2分钟

一、配置块的嵌套

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。

总结:子配置中不存在时,使用父配置的;子配置中存在时,覆盖父配置的。