nginx短篇(2):第一个静态web服务器

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

这仍然是一篇为初学者准备的文章,有一定基础的朋友就不用看了。

 

在我不了解一个技术之前,先灌输一大堆专业概念会让我比较反感,所以我们不如先设定一个目标,一边动手,一边来理解nginx

 

今天的目标就是利用nginx搭建一个静态的web服务器,然后访问这个web服务中的一些资源,通过这个目标,来了解nginx的一些基础目录结构和基础语法。

 

首先,请确保你已经安装了nginx,安装方法可以参见上一篇文章,链接如下:

nginx短篇(1):安装nginx

 

以上述链接中的安装方法为准,我们知道,有两种方式可以安装nginx,通过yum源或者通过编译,但是通过两种方式安装后的nginx的目录结构略有不同,默认提供的资源与配置略有不同,所以,我们暂且先以编译安装的方式进行介绍,之后再按照yum源安装的方式进行介绍,以免发生混淆。

 

我已经将nginx编译安装到了srv目录,在没有启动过nginx的情况下,/srv/nginx目录的结构如下

此处我们大致介绍一下上述目录的作用,之后会详细的进行解释,如果疑问,不必纠结:

conf目录中存放了nginx相关的配置文件。

html目录是默认提供的web服务的"根目录"。

logs目录是nginx日志的存放目录。

modules目录中存放了一些模块会用到的库。

sbin目录中存放了nginx的二进制文件,我们需要使用nginx二进制文件启动nginx。

 

好了,我们并没有做任何其他配置,那么现在让我们来启动之前安装好的nginx,命令如下:

执行上述命令即可启动nginx

 

nginx启动以后,我们就可以访问它了,虽然我们没有进行任何配置,但是nginx会默认为我们创建一个http服务器,这个默认的http服务会监听在80端口上,安装nginx的虚拟机IP地址是10.1.1.72,访问这个IP地址即可访问到nginx的默认提供的http服务,如下:

nginx短篇(2):第一个静态web服务器

如上图所示,我们看到的页面是nginx默认提供的一个html页面,在 [http基本概念] 一文中我们提到过,网络上的资源不是凭空产生的,都是别人为我们准备好的,上图中默认的html页面也是一个提前准备好的资源,那么,这个html页面到底放在了哪里呢?它就在nginx的html目录中,如下:

刚才访问到的html页面就是此目录中的index.html页面,稍后我们会解释为什么默认会访问这个index.html文件。

 

我们知道,nginx的最核心的功能就是提供http服务,而且刚才已经演示过,安装nginx以后,即使不做任何配置,nginx也会默认提供一个http服务供我们使用,其实,之所以有默认的http服务可以使用,是因为nginx的配置文件中默认就有对应的配置,我们一起来看看这个配置文件,它就是conf目录中的nginx.conf配置文件,这个配置文件是nginx的主配置文件,我们大多数的配置工作都要在这个配置文件中完成,所以,我们先打开这个文件看个究竟。

 

默认情况下,nginx.conf文件中会有很多注释的行,这些注释行是nginx官方为我们准备的一些配置示例,如果你没有参考这些示例的需求,完全可以将这些行删除掉,从初学者的角度考虑,我们先把这些注释行删除,以免从心里上带来负担,不要着急,这些配置并不困难,我们会慢慢搞懂它们的,此处,我先执行如下命令,将默认的注释行删除。

 

同时,为了演示方便,我删除了一些没用的空行,最终,nginx.conf中真正有用的部分如下:

nginx短篇(2):第一个静态web服务器

其实,就是因为有上述配置的存在,nginx才能为我们提供一个默认的http服务, 我们暂且先放下这个配置文件不管,来聊聊nginx的基本配置语法,等聊完这些基本语法,再来看上图中的配置,就简单多了。

 

先来说说最常用到的配置语法,示例如下:

从上述语法配置示例可以看出,上述示例可以分为几个逻辑部分,http部分、server部分、location部分,或者说,上述示例可以分为几个逻辑块,http块、server块、location块,聪明如你一定看出来了,每个"配置块"都是使用大括号"{  }"作为分界线的,而且,从缩进可以看出,它们是有层级关系的,http中可以配置多个server,一个server中可以配置多个location,我们知道,nginx最基础的功能就是用来提供http服务,所以,跟http有关的公共配置,可以放置在http块中,http块中又可以配置多个server,那么server代表了什么呢?我们在一台主机中安装了nginx,那么能不能让这台nginx主机同时提供多个web服务呢?答案是肯定的,每一个server就代表一个http服务,我们可以同时配置多个server,以便同时提供多个http服务,不同的server可以使用不同的配置,写入到某个server块中的配置只对对应的http服务生效,如果多个server存在共同的公用配置,则可以将共同的配置写在http块中,以便多个server共享这些配置,一个server块中又可以有一个或多个location,location又是什么意思呢?当我们访问一个网络上的资源时,都是通过url访问的,你可以把location当做url的一部分,此处,我们使用如下url作为示例:

http://www.zsythink.net/archives/1591

上述链接中的"/archives"部分就是一个location,我们可以通过location将url中的路径和服务器的某个目录建立起关联关系,此处不用纠结,在用到它时我们再来细说。

 

通过上述描述,你应该已经对刚才的nginx.conf有了一个初步的了解,nginx.conf中包含了我们最常用到的配置块:http块、server块和location块,当然,nginx中不止有这三种块,还有一些其他的块,比如events块、stream块等,还是那句话,先有一个大致概念,细节之处用到了再说,了解了上述概念以后,再回过头来看刚才的配置文件,是不是觉得顺眼多了,你可能已经发现了,示例中的nginx.conf中有一些配置不在任何"块"中,而是放在了nginx.conf文件的最顶部,比如"worker_processes"配置项,它没有配置到任何一个块中,而是配置的到了这些"块"之外的最上方,你可以把最上方这一片区域理解成"全局配置区"或者"主配置区",我们暂且把这片区域称之为"main"配置区,"main"配置区不属于任何一个块。

 

你也会从nginx.conf中看到各种各样的配置项,比如刚才提到的"worker_processes",以及你在示例文件中看到的"include"、"listen"等,我们可以把这些配置项称之为"配置指令",而配置指令后面通常会跟随一个或多个"值",我们也可以称这些"值"为"配置参数",一个配置指令通常会跟随一个或多个配置参数,想要正确的配置这些指令,最好先理解这些指令对应的功能,不过此处,我们先搞明白它们的基本配置语法,细心如你一定发现了,每个指令都是以分号结尾的,分号代表了指令的配置结束,没添加一个配置指令,都不要忘记加分号,否则会因为配置语法错误,而导致无法正常启动nginx,为了清晰明了,方便查看,通常每个指令单独配置在一行中,你也可以将多个指令配置在一行中,每个指令用分号隔开,但是大家通常不会这样做。

 

再来回过头来聊聊"块",从示例中的各种块可以看出,块的基本结构就是大括号"{ }",每个块后面都有一对大括号,"{"代表块配置的开始,"}"代表块配置的结束,而"块"和"配置指令"是有一定的对应关系的,比如,某些配置指令只能在http块中配置,某些配置指令只能在server块中配置,某些配置指令只能在location块中配置,有些配置指令既能在server块中配置又能在http块中配置,而有些配置指令只能在main区中进行配置,比如刚才提到的"worker_processes"配置项,就只能在main区中配置,不能配置在块中,那么哪些配置指令能在哪些块中进行配置呢?让我们记住所有指令与块的对应关系显然不太可能,我们可以通过官网查看对应的指令都能在哪些块中进行配置,以及指令的具体作用,具体方法会在之后的文章中进行介绍。

 

刚刚在准备nginx.conf示例文件时,我已经通过命令把注释行去掉了,如你所见,在nginx配置文件中,也是使用"#"作为注释符的。

 

好了,读到此处,我们再来仔细看看刚才的nginx.conf配置文件,我们知道,nginx会提供一个默认的http服务,这个服务其实就是nginx.conf中默认配置的一个server块,如上述示例文件nginx.conf所示,这个默认server监听在80端口上,没错,"listen 80;"这条指令就是用来配置server所监听的端口的,当我们访问一个http网站时,如果没有明确指明端口,默认会访问80端口。

 

正如本文开头的示例所示,当我访问"http://10.1.1.72/"这个网址时,默认会访问到nginx服务器上的/srv/nginx/html/index.html文件,之所以会访问到这个文件,是由下面这段配置决定的:

nginx短篇(2):第一个静态web服务器

刚才说过,location可以理解成url的一部分,那么当我们访问"http://10.1.1.72/"这个url时,这个url的最后一个"/"其实就是上图中的"location /

",换句话说就是,上图中红线标记出的"/"其实对应的就是"http://10.1.1.72/"这个url的最后一个"/",这个location块中有两条配置指令,它们分别是root和index,root配置项是什么意思呢?root配置指令的意思是:当前location所对应的文档根目录是哪里,"root html;"表示当前location的文档根目录是html目录,那么"文档根目录"又是什么意思呢?说白了,文档根目录的意思就是当有人访问"/"这个路径时,去服务器的哪个目录中找对应的资源,举个例子,如果我在html目录中放了一张图片,图片名为a.jpg,那么我就能通过"http://10.1.1.72/a.jpg"访问到这张图片,url中的"/"对应了"location /"配置段,而"location /"又对应到了服务器的html目录,所以,url中的"/"就与服务器的html目录建立了对应关系,当我们访问"http://10.1.1.72/a.jpg"这个地址时,其实访问的是服务器上html目录中的a.jpg,再换句话说,html目录就是当前location的资源目录。注意,上例中的html路径是一个相对路径,表示nginx安装目录中的html目录,因为我将nginx安装到了/srv/nginx目录中,所以上例中的html目录的绝对路径就是"/srv/nginx/html/",你可以在"/srv/nginx/html/"目录中放一张a.jpg图片,然后尝试使用"http://10.1.1.72/a.jpg"这个地址访问它,其实,要想完全搞明白location还是要费一番口舌的,不要怕,后面会有专门总结location的文章。

说完root指令,再聊聊index指令,index指令表示当没有指明任何资源时,默认访问哪个资源,什么意思呢?仍然拿刚才的url作为示例,当我们访问"http://10.1.1.72/a.jpg"这个地址时,nginx知道我们想要获取a.jpg这张图片资源,但是如果我们直接访问"http://10.1.1.72/"这个地址,没有指明我们想要获取什么,那么nginx会默认去把index.html或者index.htm返回给我们,原因就是上图中配置的"index  index.html index.htm;"起的作用。

 

好了,通过上述描述,你的脑海中应该已经有了大致的框架与概念,有了自己的理解以后,剩下的就好办了。

 

刚才我们所有的描述都是基于编译安装的方式进行的,由于通过yum源安装nginx后的目录结构与编译安装后的目录结构略有不同,所以此处我再将两种方式安装后的区别与注意点描述一下。

 

编译安装后,我们通过如下二进制文件启动nginx

 

通过yum源安装nginx后,对应的二进制文件已经自动拷贝到了/usr/sbin目录中,而此目录默认已经加入到环境变量中,所以我们可以在任意目录直接执行"nginx"命令启动nginx

 

编译安装后,nginx相关的配置文件存放在如下路径中

/nginx安装路径/conf/

而通过yum源安装nginx后,相关的配置文件存放在如下路径中

/etc/nginx/

 

通过编译安装的方式安装nginx以后,默认的"server块"直接配置到了nginx.conf文件中,而通过官方yum源安装nginx后,默认的"server块"会配置在"/etc/nginx/conf.d/default.conf"文件中,换句话说就是,如果你通过官方yum源安装了nginx,那么你在/etc/nginx/nginx.conf文件中无法找到默认提供的server块,只能在/etc/nginx/conf.d/default.conf文件中找到默认的server块,这是为什么呢?其实,我们从/etc/nginx/nginx.conf文件中就能找到答案,打开/etc/nginx/nginx.conf文件,查看默认的http块的配置,你会在http块中发现如下配置指令

出现上述情况的根本原因就在于这条配置指令,include指令表示将指定的文件中的内容包含到当前位置中,举个例子,如果我在http配置块中的第三行设置了"include  test.conf;"指令,那么test.conf文件中的所有内容都会替换到http配置块的第三行,换句话说就是,虽然文本内容写在test.conf文件中,但是通过include指令替换后,相当于test.conf中的文本写在了http块中的第三行。

 

那么,理解了include指令的作用以后,再回过头看刚才的配置,就一目了然了。

"include /etc/nginx/conf.d/*.conf;"这条指令的作用就是将"/etc/nginx/conf.d/*.conf"文件中的内容替换到当前指令所在的位置,由于使用了"*"作为通配符,所以/etc/nginx/conf.d/目录中所有以".conf"作为后缀名的文件都会被匹配到,/etc/nginx/conf.d/default.conf文件自然也会被匹配到,所以最终,http块中include指令所在位置的文本内容会被替换成/etc/nginx/conf.d/default.conf文件中的内容,而/etc/nginx/conf.d/default.conf文件中的内容恰好是默认提供的server块配置,当然,如果你在/etc/nginx/conf.d/目录中放了一些其他以".conf"结尾的文本文件,那么这些文件中的内容也会因为刚才的include指令而被包含到nginx.conf文件中。

 

综上所述,通过官方yum源安装nginx后,虽然/etc/nginx/nginx.conf文件中看不到默认server块的配置,但是并不代表没有提供默认的server块配置,只是通过include指令的方式,将默认server块的配置单独放置在了/etc/nginx/conf.d/default.conf文件中,最终效果与直接将server块配置写入到http块中无异。其实,即使是通过编译安装的方式安装的nginx,也可以借鉴这种配置方式,当我们配置了多个server块时,可以将各个server块分别提取出来,单独放置到一个配置文件中,然后再使用include指令引用对应的配置文件,这样就能从逻辑上将各个server块的配置隔离到不同的配置文件中,结构上更加分明,也方便我们进行配置管理,这些操作在以后都会进行实际的演示,不必着急,此时,你只要搞明白大概的原理即可。

 

通过官方yum安装后,如果你查看了/etc/nginx/conf.d/default.conf中提供的默认server块配置,那么你会发现,默认server块中的location块配置的root指令对应的路径是"/usr/share/nginx/html",也就是说,默认提供的server对应的文档根目录是此路径,我们需要将对应的资源放置到此目录中,即可通过默认的服务进行访问了。

 

其实,上述注意点多数是因为两种安装方式的默认路径和结构的不同造成的,如果你是通过yum源安装了nginx,那么你可以通过如下命令查看安装nginx后都使用到了哪些目录和文件。

 

如果你没有使用官方yum源,而是使用了epel源安装了nginx,那么配置文件和默认的index.html页面可能又是另外一番样子了,但是只要搞明白原理,都是可以轻松应对的。

 

好了,本来是准备写一些nginx短篇文章,结果不知不觉就越写越长了,如果你觉得这篇文章对你有所帮助,可以点击微信文章链接中的"好看"以鼓励作者,"好看"的数量会推进下一篇文章的诞生,加油,共勉~

  

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

发表评论

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

目前评论:13   其中:访客  8   博主  5

    • avatar 1

      大表哥 加油,比你晚一期,你都已这么牛逼了,服

      • avatar linfeng 1

        老师写的文章通俗易懂,由衷配服。

        • avatar Dracary 2

          好看!

          • avatar 哈哈哈 0

            已点好看,期待下一期

              • avatar 朱双印 Admin

                @哈哈哈 没毛病,请保持这种正确的打开方式~

              • avatar 南京的刘俊 1

                大佬,小白,看你的东西感觉非常好,很棒,坐等更新

                  • avatar 朱双印 Admin

                    @南京的刘俊 请向”@哈哈哈”同学学习,点击微信中的”好看”,”好看”数量会刺激作者的,嘿嘿~加油~

                  • avatar 叫我大脸吧 1

                    看到公众号推送,第一时间过来看了,谢谢。

                    • avatar bruce 1

                      期待下一篇

                      • avatar echo 6

                        板凳