00:00
同学们,接下来我们带大家来看一下N的配置文件,学习这个配置文件呢,是我们在这个阶段的学习当中最重要的一部分内容了,呃,也是我们在学习呃对NG2次开发之前呃最难的一部分,在这部分内容当中呢,我们会给大家从头到尾详细的去梳理NS配置文件对于呃现在的互联网应用场景的一一对应的这些关系,以及具体应该怎么去配置和实现。呃,当然还会给大家去讲解原理,首先第一步呢,我们先开始,呃,N这配置文件我们先简单认识一下,那我们先把这个N配置文件呢,给大家打开看一下。这就是N这配置文件,那后续的这些编辑修改操作呢,我们尽量就用这个记事本来给大家操作演示,因为这样看起来更直观一些,比在我们的那个命令行里要强得多,这就是我们NG的默认的配置文件,这个配置文件呢,大家打开之后呢,可以发现它有好多行,呃,此时呢,你不要慌。
01:04
先把它分成两部分来看啊,第一部分就是带井号的,第二部分就是不带井号的,带井号的,其实这就是注释,注释之后呢,这一段就没有用了啊,你把它解开呢,这段啊,它就有用了,第一句呢,就是指我们的N这个啊,在启动的时候,用什么用户来启动,呃,把这个井号呢,再给它加上之后,这句话然后又瞬间又失效了,变成了变成了注释。我们先把这个N的配置文件简化一下,也就是把这些被注释起来,这些呢,我们先把它给删掉,看一下N呢,究竟有多少核心配置,也就是我们在刚刚开始学习的时候呢,简化一下学习的过程,有很多没必要在这个阶段学的呢,我们就放到后边去学啊,你像这些被井号呃。注释掉的呢,内容还是比较多的啊。然后留下的呢,我带着大家一个一个的给大家讲解一下,当然被住掉的你也不要,后面也都会讲到啊。
02:01
只是我们学习呢,需要一步一步来。大家看啊,我们一步一步的把这个注释给它去掉,会发现这个配置文件会变得非常非常的少啊,几乎就没啥了,这后边几乎全是了,注意括号啊,给他留着。这会大家在看呢,这就是我们最简化版本的配置文件,也是能够满足正常的一个N这个运行的最小配置文件的这个版本啊,那这个配置文件接下来带着大家来讲解一下它这里边剩下那些内容究竟是干啥的。咱这个呃,别怕记不住啊,也是给大家梳理了一个文档,然后课后呢,你可以拿着这个文档对照着我这视频,然后再进一步加强学习啊,你也没必要自己在这做笔记,我们在这看一下这几这些核心配置,首先第一个呢叫worker process,这是工作的进程个数。上节课呢,我们给大家讲到了NG的运行的模型,它是由一个主进程和一个子进程或多个子进程同时运行工作的,其中这个主进程呢,它叫master,然后它的子进程呢,就叫worker啊,也叫worker进程,在这配置好这个worker processes,说明一下我们在启动NG格的时候要启动多少个worker processes?呃,在这呢,先简单的给大家介绍一下这些核心的配置啊。
03:25
这些核心的配置呢,我们还会在呃,进阶的部分,就是条约的部分呢,再详细给大家讲解,呃,因为在这个阶段我们先需要快速的认识NG和它的应用以及配置什么的,所以在这先简单给大家带一遍,你知道这些都是干嘛的,这worker processes1就代表我们要开启一个进程,你要把它填成十呢,它就会开启十个进程。那究竟应该填几这在调优的时候再跟大家讲,简单跟大家说一下。这基本上会对应到我们当前这台服务器的物理的CPU的内核数,比如说我们现在的这台虚拟机,我给他分配了一个内核,那你如果把这改成十,其实没有什么太大的意义啊,如果要是把一个CPU绑定到多个进程上,同时去执行任务的话,他会去分开时间段同时去执行好多任务,那么这样的话效率反而会变低,这个意思就是说,如果说,呃,假如说我现在在这儿给大家讲课,那来一个这个我们的助教老师来帮我,呃,这个捏捏脖子吧。
04:25
对吧,那他帮我捏捏脖子,这就是一个老师对应一个这个呃给我服务的人,那如果要是后边有四个呃等着他同时需要帮忙给捏脖子的老师的话,那很明显他这一个呃执行者,一个worker,呃同时去做很多的事情,呃他就需要任务的调度帮我捏一下,再帮隔壁的老师捏一下。它就需要这个分开时间窗口,这种同时的工作呢,反而会降低它的效率。这个基本的配置就是一个CPU内核对应呃,一个worker process啊。
05:02
然后下边这个呢,Events,这是它的,呃,事件驱动模块,在这里边呢,有一个配置叫worker connections,前面不是已经配了组有多少个worker嘛,有多少个,有多少个ER的进程,那么每一个worker的进程呢,可以创建多少个连接,它默认就是1024,在这我们也不调,也不需要调啊。再往下边看呢,这就进入了HTTP模块,大家看啊,这有一个work processes,它是在最顶级的这个呃层级上直接做配置的。整个结构呢,有点像Jason文件是吧,然后这events呢,这一大括号,这下面可以配好多个,这分了层级结构的下边是HTTPHTP这个,呃。配置的这个模块呢,下边包含内容呢就比较多了,这个命令呢,可以把另外的一个配置文件引到我当前的这个配置文件当中,后边我们也会用到include的命令,尤其是我们在配置文件写的特别多的时候,我不希望在一个配置文件里写过多的行业,不便于后期的维护管理,对吧?比如小张一个配置,小李一个配置,我们共同去完成的一项任务,那你自己写你自己的。
06:06
那尽量不要打开同一个文件,因为这样就会竞争锁嘛,我在改的时候它就不能改了,对吧?那这样呢,呃,我们可以include一个额外的文件,把它引到这个主的配置文件里,对吧?那我们在协同工作的时候,其实也是可以这样的,这个mime type子啊type资这个配置文件里呢,其实记录的就是呃,所有的MI1TYPE,这mime type是干嘛的呢?其实就是请求的头头里边会标明我当前给你返回或者给你发送的这个文件,它是什么类型的。比如它是个文本文档啊,它是个HTML文档,它是一个可执行的应用程序,它还是一个flash文件。这个主要是由我们的服务器端向客户端,比如说浏览器发送这么一个头,来明确的告诉他,我给你发送这是个什么文件,注意这是由服务器端来定义的,那么服务器端是谁?这就是我们当前的这个NG,比如用户。
07:04
在这给大家找一张图啊,呃,比如说用户来请求我的服务器了,他想要一张照片,比如说叉叉o.JPG呃,一个JPG文件,这个JPG文件呢,在服务器端存着,服务器端接收到请求之后,会把这个文件发送给我们的客户端,它发送给我们客户端,客户端接收到这个文件的时候,它本质上在网络当中传输的是二进制数据,二进制数据就是零一和零一嘛。对吧,一或者一零和一零,它传到他的。他传到他的这个,呃,机器当中呢,他怎么去解释解读它,它就用什么类型的文件,它不能只看文件后缀啊,或者说我们的浏览器,他看文件后缀是看不懂这文件究竟是什么文件的。他必须由服务器端在HTTP的协议头里边加上,呃,我们当前传输这个文件的文件类型是啥啊,比如说我们当前传输的这一图片,那么隐秘制啊,Jpeg。给它加到这个头上,那么浏览器就会按照,呃,我们。
08:03
服务器端返回的这种数据类型,就是图片的数据类型,来展示当前这个文件,也就是我们当呃上网看见一个图片的时候,呃单独打开一个图片,比如说啊,就这个什么HTTP啊at硅谷点com,然后接下来隐秘什么什么点PNG浏览器直接输入这个网址,打开这个图片会给会给我们在浏览器里边把这张图给它直接展示出来,而不是显示这个下载。我不知道说到这大家有没有理解,如果这个PNG换成点exe会怎么样?它会弹出一个下载框来帮我们去下载吧,对吗?那它究竟是展示还是下载,不是由这个后缀名来决定的,是由我们返回的这个imme types来决定的,这mime types可以对应到具体的文件后缀名里。比如说点勾PG,它是图,比如说点exe,它是应用程序,我们把这个mime types给它打开,大家看一下。
09:05
在这儿。大家可以看在这里边对应的就是类型,然后文件后缀名,比如说我的文件后缀是点HTML,那么我们就在返回的这个HTP头里边呢,加上它是text HTML,用text HTML的方式来解析,我当前给你返回这个文件,注意这事告诉浏览器上,浏览器解析的再说一遍啊,CSS也是一样啊,要不然浏览器不知道啊,我要啊渲染这个当前的页面,以CSS的方式去读它啊,要不他不知道啊,图,图片也是GIFJPGGIF这些都是,然后呢,还有一些这个。比较复杂的类型,它不太好解析的,比如说exe,然我们想下载一个呃,软件下载到我们的电脑上,比如说就下载这个XFTP,点一个X,它不能以图片的形式在我们浏览器的界面里展示出来,对不对,那么它就会弹出一个下载框,那在这返回的类型的就是application o stream,它以数据流的方式去加载,并且呃提示用户要不要下载下来,那么这就是mime type,那么在这里边如果要是没有匹配上的类型怎么办?大家注意看啊,这些都是一些文件后缀,如果搞了一些比较特殊的文件后缀。
10:20
那么我如果想要按照某种特定格式,比如说按照视频的格式让它播放出来,比如这MP4吗?哎,我搞1MP5。然后想让他在浏览器里直接帮我把它播放出来的话,那我就可以在这个m me tap里给它加上告诉浏览器你也什么呢,MP4的方式去帮我去。把这个文件哎给我播放出来,而不是让它去弹出来下载块,让用户去下载,也不是以图片的方式去展示啊,说到这儿大家应该能理解了吧。这个mime type呢,它不可能包含所有类型啊,要么我们自己加能,呃,不可能把把所有的类型的全部都加上,那么这还有一个default type。
11:03
这default type就是默认的这种类型,如果不包含在我们这mime types里,那么我就以application o这种。格式的流的这种方式传输给我们的客户端,这客户端一般来说我们就指的就是浏览器啊。这是includeme types和这个default type。好,同学们,接下来我们再给大家讲这个下一个配置,这是send file,这file呢指的是数据零拷贝,什么叫数据零拷贝?哎,就是不需要复制和拷贝了,我想要从你那拿一个片儿,你需要把U盘插到你电脑里,对吧,然后把片儿呢拷到U盘里,然后把U盘呢再给我,我再插到我的电脑里,然后再从U盘里把这份数据拷过来,这需要中间的一个拷贝的过程,这也是我们正常能理解的这种数据拷贝的过程,这个零拷贝指的就是免除了中间的一次拷贝的环节,也就是往U盘里拷的这个过程,直接从你的电脑里通过无线啪一下就过,把这个片儿就给甩过来,我就可以看了,减少了一次拷贝的过程,既减少了中间的这种调度的过程。
12:12
同时也减少了复制的过程,呃,这个center file呢,比较复杂,我在这儿呢,简单给大家讲一讲啊。如果你能听懂的话就听得懂,如果听不懂的话,我们在进阶的课程里还会给大家讲这个,呃,调优,调优这一部分呢,像s fair啊,还有一些其他的一些,呃,基于Linux内核这些这个调味的参数也都会给大家讲,大家可以看一下这张图。我们的请求打到我们的服务器上,我们的服务器上呃,存有你想要这些文件,比如说有一个叉叉O点。呃,MP4。你想要这么一个视频文件,那么这个视频文件呢,在哪?肯定是在我当前服务器的磁盘上嘛,对吧,我要没有的话,你不可能来找嘛,是吧,那在找的过程当中NG它是一个软件,注意听它是个软件。
13:07
软件是运行在我们的操作系统之上的啊,我们现在用的操作系统是Linux操作系统centers,它跑在Linux操作系统之上,那么这个请求。由网络打过来之后,NG怎么能接得到呢?是由我们的操作系统的网络接口转发,转发给了我们的NGNG个才能读到用户的请求,他怎么转发的,肯定是在启动的时候要绑定注册,学过网络编程的小伙伴肯定知道,你学过Java的话,在启动一个Java的网络程序的时候,他也会向我们的操作系统去注册某个端口,他注册的过程中,也就是告诉他接下来有什么请求呢,通过这个端口发过来的,你要转发给我,对吧?那么这个请求转发给他了,在这个过程呢,我们先不表他接下来想要这个文件的时候,N这接到请求了,他要从磁盘去找文件,找文件这个过程呢,我们上节课也跟大家简单的讲了,对吧,他需要呃,找这个我们的这个配置文件,配置文件某个目录下边找到了这个文件,这文件想要发给我们的用户,这一步开始开启了我们send file还是不send file这个过程,那么如果send file的话是这样的,如果不send file的话,它就这样的,如果你的send file配置给它。
14:17
关掉的话,这里边就有read和write的两个过程,Read指的就是我们的N去read这个文件,它就把这个文件读读出来,完整的加载起来,加载到它应用程序的内存里,通过应用程序的内存读完之后,他再把这当前的这份文件发送给我们计算机操作系统的网络接口,也就是我们的网卡的驱动程序,当然这里边还会经历d ma的调度和网卡驱动程序的缓存,以及我们内核的缓存。层层缓存都都要层层的去复制NG去读这个文件,这是一次复制,他复制完成之后,把数据读到自己的内存里,然后再把这份数据复制给我们的网络接口,这里边多了一层复制,大家注意看,它要读取文件,读到应用程序内存里,然后再发送给网络接口,网络接口把数据推送给我们的用户,这是read write的过程,也就是没有这个s file。
15:13
那么有了存在file是什么样子的呢?就是不需要那个U盘了,你不需要给我拷了,直接扔给我就可以了啊,那我扔给你哪个呢?你是不是得给我喊一声对吧?来一份信号就可以了,通过NG可以向我们的方电内核发送一个信号,用户请求打到NG上,NG应用内存呢不去。呃,复制或者说不去加载磁盘上这个文件,直接推送一个信号叫send file send file里边会,当然这是一个方法啊,里边会传递这个socket,以及你究竟想要发送哪个文件,就是文件描述符,把文件描述符发送给我们的操作系统的网络接口,网络接口来读取这个文件,它读到文件之后,诶,直接通过网络就发送给我们用户了,在这里边减少了一次数据拷贝的过程,也就是少了你递给我U盘,然后我再从U盘里读这个过程,当然你也得往U盘里拷东西,这就是send file,简单的实现更深层的理解。
16:06
我们会在操作系统内核里边再给大家讲解啊,这就send file。看,那下边这个呢,是keep alive timeout这个参数在这呢,先不做详细的讲解,你把它理解成保持连接,然后超时的这个时间就可以在刚开始的时候啊,我们也不需要配置这个东西啊,这keep live的timeout想要保持长连接的话,这一般来说呢,呃,是从两个的方向来聊的,一个是像我们客户端,另外一个呢,是像我们的后端的代理端,等我们讲到反向代理的时候,再给大家好好讲讲这个keep live的,呃,具体的配置的问题,那好我们再接着往下看啊,下边就到这个server这个模块了,是在HTTP下边的server这个模块,这个模块下呢。呃,配置的一些这个参数我们仔细看看呢,呃,和我们之前的那些好像能对应的上,比如说index的,比如说这HTML来注意看啊,我们一个一个来看,首先这个。
17:00
这个license呢,指的就是监听的端口号,呃,当前服务器的端口号,那监听端口号这是为什么?Server监听端口号说明这就是一个主机,这个server这就是一个主机啊,注意听。一个主机和多个主机都可以配置,在我们的NG配置文件里,就是一个NG可以同时运行多个主机,一个server代表一个主机啊,一个主机就是代表了它有一个独立的站点,它有自己独立的根目录,它互相不干扰,每一个主机之间互相不干不干扰,我们可以通过端口号的方式区分每一个主机的不同,比如说我当前的这个呢,是在八零端口运行,下一个呢是在八零,八零端口运行,只需要开一个ing,我就可以开好多个。那么这种呃,开启多个主机的方式呢?我们管它就叫虚拟主机。虚拟主机呢,还有另外一个名字叫virtual host啊,我们一般来说简化叫host。你见到we host其实指的就是这个虚拟主机,那这个license指的是当前一个主机的监听端口号啊,不能重啊,你不能这个server是80,下一个还是80,这就重了啊,它起不来,配置文件有问题,Server name,这指的是当前这台主机的主机名,你可以在这去配置。
18:21
域名。或者是主机名。域名这个大家好理解啊,比如说at硅谷点com,这就是我们的域名对吗?啊,我们访通过互联网访问到这个域名会解析成IP地址,那这个主机名呢,也是得我们能够解析的了的主机名啊,比如说local host,这就能解析,为什么呢?因为在我们本机的那个host的文件里,是不是写了一个local host对应的是127.0.0.1的这个IP地址啊,所以你填了local host呢,它是能够解析开的,对吧?那再往下边看呢,这个location啊,也是我们要学习的重点内容,所以我们把这个location呢,放到单独的章节里边给大家讲。
19:03
啊,你在这儿可以理解成这个location是我们域名后边跟的。子的这个目录或者路径。或者管它叫uri,专业一点来说,呃,具体是哪一段呢?怎么写一注释,比如HTTP冒号双斜杠硅谷。点com斜杠叉叉oo斜杠index.html。Location指的就是uri这一套完整的,呃,这个网址啊,它叫uril uri指的是什么呢?是在域名之后,这一段叫uri,叫资源啊,这是uri,注意听这location是用来匹配这一段的,也就是说匹配某一段uri完整的路径,完整匹配,或者是某一段按照规则能够模糊匹配的上啊,它就会进入到这套location里边去帮我们去找它的root目录,这个root目录。
20:00
指的是什么呢?我们当前的,呃,匹配上这个location之后,用户请求接进来之后,我从哪个目录下去帮他找相应的网页,也就是一个主机下面还可以分好多个location。啊,它可以配置到不同的目录下,互相还不影响对吧,这root呢,后边跟着一个HTML,这个HTML指的是相对路径,相对路,相对路径相对在哪?相对在N几的主目录,就是user local n几这个HTML。这个HTML和这个root后边跟这个HTML它是一一对应的,我们也可以把它改到其他的目录。在下面这个index啊,就是当前访问这个location下生效啊,如果没有默认页的话啊,下面如果有indexl index htm这两个文件,我就给它默认展示出来,这是默认页。说到这儿,大家不理解的话不要慌,后边呢,我一一的都会给大家举例讲解,并且会给大家讲这个具体的应用场景哈。
21:07
好,那接下来我们看一下这个error配置啊,这error配置呢,是在发生服务器端错误的时候,比如说500了啊,比如服务器内部错误嘛,一般我们看见的就就是其实就是我们写代码的时候出了什么问题,或者什么资源访问不到了,呃,报了什么错误了,数据库连不上了,就会返回这500,当返问500的时候,这是几个错误码对吧?500502 503 504啊,这几个错误码接下来会怎么着,会给它转向到内部的某一个地址上。啊,这个怎么理解呢。一旦出错了,我们让他访问这个地址,哪个地址,比如说当前我们的站点是这个。那如果要是出错了,访问这页面的时候,会让他跳转到当前这个站点的这个地址上。注意看前面是一个斜杠,那么它就会直接从这个位置开始。就会让你访问这个页面,跳转到这个页面,展示这个页面里边的内容啊,那这个页面里内容有没有,我们现在没有这个页面啊,所以在这呢,诶又写了一个location,这个逻辑是这样的,他跳转到这个页面,但这个页面没有,一旦用户访问。
22:16
斜杠五零叉点HTL的时候,会把这个目录指向root目录下边的HTL,让它从这个目录下去找这个50x.HTL这样就能找得到了,在这儿。这个逻辑不理解也没关系,我后边在实战的时候带着大家来操作就好了,这是呃,我们NG的基本的配置文件的简单解读,后边还会再给大家详细讲解。
我来说两句