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

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

更新时间:2017-06-28 00:34:50浏览次数:1+次

        继文章《云平台开发架构分析系列11:Nginx服务器默认配置文件入门分析3》,我们继续来讲解nginx的配置文件里的http下的配置项。我们讲解一个配置项,不是告诉你这个配置项是什么就完了,我们更多的是讲解背景知识,让你知道这个选项真正起到什么作用,让你不仅会操作,而且真的懂配置。

    keepalive_timeout

        从这个配置项的名字我们可以看出是保持活跃的超时时间。然后你知道这个值可以设置一个时间值。但是什么是保持活跃的超时时间呢?这个得从HTTP协议说起。

        我们先来感受一下这个选项是如何起作用的。如下图:

    nginx keepalive_timeout

        看到图中有三个箭头,下面两个都是Connection:keep-alive,意思是连接保持活跃着。然后上面的箭头的版本是HTTP/1.1。我告诉你这么多,你可能还是不明白的。虽然隐隐约约你能感受到,keepalive_timeout和箭头所指的东西是有联系的,但是有什么联系你还是不清楚。那么如果你只是知道设置一个值,你是没有掌握的。因为你不懂背后的原理。如果换一种场景,这个设置又不起作用了。

        HTTP是无状态的协议,也就是一次请求,请求完之后,就断开了连接。服务器不会为这个请求记录请求状态。每一次请求都是新的请求。而HTTP协议是基于TCP协议的,所以每一次请求时都会和服务器建立连接通路之后,再发送请求数据和接收请求数据的。而TCP连接的时候,需要经历三次握手确认。

        这样看似也没有什么不妥。然而,当一个页面有很多个图片,此时浏览器会连续请求很多次,请求html页面需要一次,然后每一个图片url,又会去请求一次,然后这样就可以显示图片。在很早的时候,网页主要是文字,多媒体很少。所以不会存在大量的连续请求。而现在没有图片的网页,很少见了。打开一个网页的时候,会下载形形色色的各种资源,当然还不只是图片,还有动画,还有脚本之类的文件。如果每一次请求时都建立一个连接,请求完之后就断开,然后又重新建立连接,这样反反复复的请求数据,效率就非常低了。

        所以,从之前的HTTP1.0版本的协议里进行了改进升级,这就是HTTP1.1版本的由来。在1.1版本中,允许请求保持一段连接时间,这样在一个请求没有断开的时候,就可以连续多次请求多个文件。这样就可以不用频繁的重新建立连接。TCP建立连接的开销也是挺大的。这样可以大大提高性能。

        所以你可以看到,上图下面两个箭头所指,表面的就是连接的状态。如果连接状态没有断开,还是处于保持活跃(或者叫做活着的),那么就可以继续直接发送请求。如果这里显示的连接状态是关闭close的时候,那么就必须重新建立连接了。

        如果浏览器都是用的HTTP1.0版本,那么服务器设置这个选项是没有意义的。好在现在浏览器都会支持1.1版本的HTTP协议的。

        就这样就完了吗?不然!我们这里说的是连续请求很多文件,才需要这样的配置。假如你的页面仅仅只有文字呢?一次请求就可以了,那么保持连接反而会占用更多的资源。这个你可能会觉得情况很少。但是你得想清楚一个问题,这个连接保持时间不是越久越好,也不是越短越好。如果保持时间太久了,在高并发的情况下,服务器因为大量的连接被占用而没有释放,当连接数到达上限的时候,服务器就不能再处理新来的连接了。如果时间短了,虽有所改善,但是效果并不明显。时间长度的多少,就看服务器提供的内容综合确定。

        还要一种情况,你也需要考虑进来,那就是CDN。现在很多服务器都采用分布式方案来加速。因为一个页面的所有文件都从一个地方请求的话,必然导致这个服务器压力过大。所以CDN就将页面需要的文件都连接至另外一个服务器,比如图片服务,脚本服务器,样式服务器,动画服务器。这样可以分担主服务器的压力。那么既然这样,浏览器从主服务器请求的就只有html本身了,其他的就会从其他服务器请求了。这样一来,浏览器不会需要保持连接,因为一次就请求完了,保持连接反而会增加服务器的压力,而不会提升性能。

        所以别看是设置一个简单的保持连接的超时时间,但是背后却有很多需要学习的知识。而这个时间值的合适取值,则需要通过实际分析和测试得到最优的值。