nginx短篇(4):模块、配置指令、块之间的关系

  • A+
所属分类:Nginx  运维技术

  

博主会将与Nginx有关的知识点总结到"nginx短篇系列"文章中,如果你对nginx不是特别了解,请按照顺序阅读"nginx短篇系列",以便站在前文的基础上理解新的知识点。

 

通过前文我们已经了解到,安装nginx以后,nginx会提供一个默认server,我们可以从nginx.conf文件中找到这个默认server的相关配置,如下:

前文中已经解释过上述配置的大致含义,而且我们知道,一个http块中可以配置多个server块,一个server块中可以配置多个location,那么此处,我们就来多配置几个location试试,我已经配置好了一个用于演示的示例,如下:

如你所见,我在默认配置之上,添加了一个location块,这个location对应的url为"/demo",此location块中的"root /opt;"配置指令表示这个location的文档根目录为"/opt"目录,所以,当我们在浏览器中访问"/demo/a.jpg"这个url时,访问的其实是服务器中的"/opt/demo/a.jpg"文件,如果你不明白为什么url与服务器路径存在这种对应关系,不用担心,我们会在之后的文章中总结root指令和location块之间的具体关系以及它们的用法,此处我们先不用纠结这些,我们先把关注的重点放在别的地方,为了方便示例,我已经在服务器上创建了/opt/demo/目录,并且在此目录中创建了一个名为index.html的文件,index.html内容如下:

 

由于我在完成上述配置之前已经启动了nginx,所以此处执行"nginx -s reload"命令重载配置,以便在不停止nginx服务的情况下使新的配置能够立即生效,重载配置以后,在浏览器中访问链接地址"http://10.1.1.72/demo/",效果如下:

nginx短篇(4):模块、配置指令、块之间的关系

如你所见,我们自定义的location已经生效了,当我们访问"http://10.1.1.72/demo/"这个url时,即可访问到服务器的"/opt/demo/index.html"文件,通过上述示例,你应该已经明白了,在同一个web服务中,我们可以将不同的url对应到不同的服务器路径中,上例中,除了默认的location,我们又手动配置了一个新的location,默认的location为"/",我们手动配置的新的location为"/demo",所以,访问这两个url时,会分别对应的不同的文档根目录,从不同的目录中查找对应的资源,又因为index配置指令的原因,会默认访问对应目录中的index.html文件或index.htm文件,所以最终效果就像你刚才看到的那样。

 

细心如你,一定发现了,默认的location和我们新加入的location中,index配置指令的值是完全相同的,那么,我们能不能把index配置项提取出来呢?是可以的,由于这两个location的index配置完全相同,所以,我们可以把这个index配置项提取到上一级的server块中,以便这两个location共享这个index配置,配置如下

聪明如你,一定看明白了,由于两个location块中的index配置项完全相同,所以我们将index配置指令提取到了这两个location块的上一级server块中,以便两个location块能够共享这个index配置,换句话说就是,server块中的index指令是对当前server块中的所有location生效的,当然,如果某个location块中有自己的index配置,那么针对当前location块来说,还是以自己的index配置为准,比如如下配置:

上述配置中,server块中index配置是对当前server块中的所有location块生效的,但是由于" location /demo"中有自己的index配置,那么针对" location /demo"来说,自己的index配置的优先级更高,自己的index配置会覆盖上一级的index配置,所以,当我们访问"/demo"这个url时,默认会在对应的目录中查找a.jpg这个文件,而不是index.html文件,但是另外一个location中由于没有配置index指令,所以它仍然会以上一级server块中的index配置为准。

 

通过上述示例,你肯定明白了一个道理,同一个配置指令,配置在不同的块中时,对应的"作用域"是不同的。

 

还记得我们在之前的文章中总结过如下这段话吗?

某些配置指令只能在http块中配置,某些配置指令只能在location块中配置,有些配置指令既能在server块中配置又能在http块中配置,而有些配置指令只能在main区中进行配置。

 

其实,刚才示例中的index指令就属于那种既能在location块中配置,又能在server块中配置,还能再http块中配置的指令,只不过,当index指令配置在不同的块中时,对应的作用域不同。

 

举一反三,有些指令既能配置在server块中,也能配置在http块中,当多个server存在相同的配置时,我们可以将这些完全相同的配置指令提取到上一级的http块中,以便多个server块共用这些配置,当然,如果你在某个server中单独配置了对应的配置指令,那么这个server仍然会以自己的配置为准。

 

通过上述示例,你是不是对"配置指令"和"块"之间的关系理解的更加透彻了呢?

其实,"配置指令"不仅和"块"有一定的关系,"配置指令"和"模块"也有着非常紧密的对应关系,之前总结过,nginx是模块化的,不同的"模块"负责不同的"功能",所以,当我们需要针对某个"功能"进行配置时,就需要使用到对应的"配置指令",从根本上来说,每个"配置指令"都属于某一个"模块",一个"模块"中会有一个或多个"配置指令",当我们想要对相关模块或者功能进行设置时,就会使用到对应模块中的配置指令。在第一篇文章中我们就提到过,除了内置的标准模块,还有一些可选模块,我们可以在编译安装时选择安装哪些可选模块,如果你没有安装对应的可选模块,那么你也无法使用对应的配置指令。原因刚才已经说过,每个配置指令都属于某一个模块。

 

当然,作为用户,没有人天生就会使用nginx的这些配置指令,也没有人能够记住所有模块、配置指令、块之间的关系,所以,我们可以通过官方的文档进行查询,那么此处,我们就来介绍一下怎样通过官网文档找到我们想要的答案。

 

首先,打开nginx开源版官网,nginx.org,打开官网后,可以看到如下页面,在如下页面的右侧菜单中,可以找到"documentation"链接,点击此链接,即可看到nginx官网文档。

nginx短篇(4):模块、配置指令、块之间的关系

打开文档页面后,你可以看到一些关于nginx的相关链接,这些链接中包含了与nignx相关的各种信息,我们可以从这些链接中找到我们想要的答案,仍然拿刚才的index指令作为示例,如果,我们想要找到index指令的使用方法,该怎么办呢?方法如下:

下拉文档页面,找到如下图所示的"modules reference"部分,点击下图中标注出的"Alphabetical index of directives"链接

nginx短篇(4):模块、配置指令、块之间的关系

点击上述链接后,你会看到一个指令列表,这个指令列表里面就是所有我们能用到的配置指令,这些配置指令按照字母顺序排序,在浏览器中使用"ctrl + f"进行搜索,此处,我搜索刚才我们用于示例的index配置指令,如下

nginx短篇(4):模块、配置指令、块之间的关系

点击index链接,即可看到index指令的相关信息,此处就不截图了,首先,页面最上方会显示当前指令属于哪个模块,你看到的应该是一行黑体字"Module ngx_http_index_module",也就是说,index配置指令属于ngx_http_index_module模块,由于这个模块中只有index一个指令,所以你在当前页面中只会看到index指令的用法与示例,如果你查看的指令所在的模块包含很多条指令,那么这个模块中所包含的所有指令的用法与示例都会展示在这个页面中,你在当前页面中,应该可以看到index的基本语法概述,如下:

Syntax:  index file ...;

Default: index index.html;

Context: http, server, location

上述这段示例告诉了我们index指令的基本语发、默认值、以及上下文位置。

Syntax表示指令的基本语法

Default表示指令的默认值是什么

Context表示指令所处的上下文位置,上下文位置是什么意思呢?说白了,就是我们之前说的,指令能够配置在哪个块中,从官网的示例中可以看出,index指令只能配置在http块、server块或者location块中。

 

基本语法概述之后,还有该指令对应的一些示例,你可以参考官网给出的示例学习该指令的用法。

 

经过上述描述,你肯定已经明白了怎样通过指令列表找到它所在的模块以及指令的用法。

 

不过在使用的过程中,你可能还会有另一种需求,就是想要了解某个模块的作用,以及这个模块中包含哪些指令,那么,怎样才能找到自己想要了解的模块呢?其实与刚才的步骤非常类似,仍然是打开官网,点击右侧菜单中的"documentation"链接,进入文档页面,下拉页面,找到"modules reference"部分,"modules reference"部分下面其实就是所有模块的模块列表,如果你想要的了解某个模块,只要点击模块对应的链接,就能够看到模块以及对应指令的使用方法了,此处,点击模块列表中的"ngx_http_index_module"链接,你会发现,此链接中的内容与之前通过指令列表查找到的内容完全相同,其实,我们只是通过两种方式查找到了相同的内容而已,第一种方式是通过指令列表查找,第二种方式是通过模块列表查找,只是查找方式不同,最终得到的内容是完全相同的。

 

这篇文章就写到这里,希望能够对你有所帮助~

  

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:7   其中:访客  5   博主  2

    • avatar herman 0

      感谢

      • avatar 怒风 3

        从最初的shell文本处理,到后来的ansible、zabbix,我都一路拜读。如今欣喜的看到朱老师开始更新nginx了!必须要赞一个!这些都是非常常用的技术

          • avatar 朱双印 Admin

            @怒风 一路有你们支持,会坚持写下去的,加油了~共勉~~

          • avatar Maxi 1

            自从老王上课推荐朱师兄的博客,就一直关注学习,营养满满,非常感谢!!祝大表哥猪年工作顺利,家庭幸福!

              • avatar 朱双印 Admin

                @Maxi 老王还是我们的老王,也祝兄弟新年新气象,阖家欢乐~加油~

              • avatar 游客 1

                写得真好