当前位置:C++技术网 > 精选软件 > 云平台开发架构分析系列:11 Nginx服务器默认配置文件入门分析3

云平台开发架构分析系列:11 Nginx服务器默认配置文件入门分析3

更新时间:2017-06-27 09:09:43浏览次数:1+次

        看到文章《云平台开发架构分析系列10:Nginx服务器默认配置文件入门分析2》,我们已经知道nginx配置网站的基本方法。我们已经将server的基本配置都讲解了。现在再来看看http相关的配置的几个基本参数。我们这里列举的是生成的默认配置参数,都是基本的参数了。

    1.include mime.types;

        这个include有没有让你想起了C语言的#include指令呢?这两个还真的有点像哦。include是包含的意思,也就是引用的意思。和C语言包含头文件一样,这里也就是相当于引用一个后缀名和文件类型映射表。比如我们请求的网页的后缀是.html,这个后缀就会通过这个映射表映射为text/html类型。

        当浏览器通过网址URL请求一个资源如图片,那么服务器就会返回一个图片数据。那么浏览器如何来识别返回的数据类型呢?在一个网页中,浏览器会接受到很多数据类型,如html、jpg、png、gif,flash等各种文件,而且浏览器不会持续跟踪之前发出的请求的。所以浏览器不会去根据请求和返回的结果来识别文件类型的。而要正确识别类型,就会通过服务器返回的响应信息。在响应信息头里,有一个描述内容类型的字段,叫做content-type。这个类型是服务器返回的。那么服务器又是如何知道浏览器要请求什么类型的内容的呢?浏览器请求内容都是通过链接地址URL确定的。比如http://www.cjjjs.com/1.jpg,这就说明浏览器会从服务器下载一个名为1.jpg的图片文件。我们通过后缀名就知道文件的类型了。那么服务器知道吗?服务器如果知道,又是怎么知道的呢?而这个后缀名和服务器返回的内容的类型又有什么关系呢?

        我们来看看浏览器请求一个图片的请求和响应数据:

    浏览器请求一个图片的请求和响应数据

        浏览器从一个地址请求一个图片,请求网址里可以看到是12.jpg文件。状态码为200 OK。说明请求成功了。在请求头里是看不到说指定请求数据类型的,所以确定请求数据类型的就是文件的后缀了。当然,在动态网站里,URL如果不是常规的后缀名这种形式,而是以乱七八糟的字符串形式的,会在服务器那边先做一个转换的。我们这里是最直接的,没有经过包装的地址。当服务器返回数据时,响应头有一个Content-Type:image/jpeg,后面的Content-Length指明了数据的长度。这样浏览器就可以根据响应头的内容类型和内容长度来接受文件数据了。进而在浏览器显示出图片。

        在浏览器这边,请求时直接按照文件后缀名就可以了。再扩展一点,就是根据url就可以了。而服务器要识别出请求的资源的类型,需要做一些工作。那就是对请求类型的识别工作。服务器怎么知道这个url就对应了image/jpeg呢?关键就在于mime.types这个类型映射表。这个表中将后缀为jpg和jpeg的后缀名映射到了image/jpeg类型,这样也就能够识别出来了。然后响应浏览器的时候,就将image/jpeg作为内容的类型传回去。这个过程不需要浏览器和服务器一直保持状态的连接,是通过URL识别以及协议格式来确定的。

        这个类型映射表会指导浏览器和服务器做出准确的处理动作。我想你可能遇到过这样的情况。有的浏览器因为没有安装PDF插件,无法识别PDF格式。当浏览器在请求PDF文件时,就只是启动了下载,而不会直接显示PDF内容。或者这么说,如果浏览器不支持jpg的图片格式,也就是没有在本地存储mime.types这个类型映射表,自然也就无法将image/jpeg和.jpg后缀名关联起来,所以自然也就无法去显示jpg图片。那么此时会怎么处理呢?万能的做法就是,下载了。因为一般默认的类型就是应用数据流类型。如果遇到了类型映射表中不存在的类型,自然也就启用默认的类型来执行对应的动作。

        如果服务器中不支持这样的数据类型,会怎么做呢?有的服务器可能就不允许下载,有的可能就使用默认的类型代替。这样会导致浏览器识别类型错误。如果服务器没有添加xml类型,然后又设置了默认类型为jpg文件对应的类型,那么最后返回到浏览器时,浏览器就以为接收到了jpg图片,然后按照图片来显示,结果显示图片被损坏了。所以这个映射表是浏览器和服务器都会有的一个类型映射表。

        我们来看看这个nginx里的类型映射表:

    nginx里的类型映射表

        就是一个类型对应表而已。这里尽可能要全面,用以支持更多的文件类型,让文件类型正确的处理。如果你自己定义一个后缀名,然后实际格式是jpg,那么你可以在这里做一个映射。当浏览器请求你定义的那个后缀名的文件时,服务器就可以映射到jpg这个类型,然后返回给浏览器,浏览器依然可以正常显示你这个自定义的后缀名哦。

        下面我们将图片类型里加入一个自定义后缀名:

    image/jpeg   eee jpeg jpg;

        然后重启nginx,然后用浏览器请求这个后缀的文件,看看能不能正常显示图片呢?结果如下:

    浏览器请求这个后缀的文件

        浏览器正常显示了这个图片哦。我是将nginx的显示结果截图存放在了服务器了。这里是个图片。

        当然,我们这个类型也无法覆盖所有的类型,所以还需要指定一个默认的类型。这就是后面的一个配置项.

    2.default_type  application/octet-stream

        当浏览器请求了一个后缀的文件名,而在类型映射表中又不存在此后缀名。那么此时就会使用这个默认的类型返回了。浏览器对于这个类型的处理一般是下载文件了。你也就可以知道,我们经常请求一些文件时,浏览器是直接下载而不是打开文件。如果浏览器安装了对应后缀的插件,则会启动这些插件来打开文件。迅雷的种子文件下载后,如果浏览器支持这个格式了,也就是安装了迅雷的插件,就可以识别迅雷的种子文件的后缀,然后就启动迅雷来下载。如果没有安装,那么浏览器直接将这个种子文件下载完就可以了。

        那么还有一个问题,如果这个默认类型都没有定义,那么一个未知类型,如何处理呢?你可以试一下,结果返回的是text/plain类型。plain为空白类型,就是不知道是什么类型。浏览器还是会启动下载。当然,不同的浏览器处理的规则不太一样。而不同的服务器也不太一样,有的可能就停止这种文件的响应。具体是哪样的实现,一测便知。

        那么本篇就将这么多,下篇继续讲解后续的配置。