优化 Nginx对静态资源如何进行优化配置。这里从三个属性配置进行优化: 1 2 3 sendfile on; tcp_nopush on; tcp_nodeplay on; send?le 用来开启高效的文件传输模式。 语法 send?le on |o?; 默认值 send?le o?
优化Nginx对静态资源如何进行优化配置。这里从三个属性配置进行优化:
send?le用来开启高效的文件传输模式。
请求静态资源的过程:客户端通过网络接口向服务端发送请求,操作系统将这些客户端的请求传递给服务器端应用程序,服务器端应用程序会处理这些请求,请求处理完成以后,操作系统还需要将处理得到的结果通过网络适配器传递回去。
tcp_nopush该指令必须在sendfile打开的状态下才会生效,主要是用来提升网络包的传输效率。
tcp_nodelay该指令必须在keep-alive连接开启的情况下才生效,来提高网络包传输的实时性。
经过刚才的分析,"tcp_nopush"和”tcp_nodelay“看起来是"互斥的",那么为什么要将这两个值都打开,这个大家需要知道的是在linux2.5.9以后的版本中两者是可以兼容的,三个指令都开启的好处是,sendfile可以开启高效的文件传输模式,tcp_nopush开启可以确保在发送到客户端之前数据包已经充分“填满”, 这大大减少了网络开销,并加快了文件发送的速度。 然后,当它到达最后一个可能因为没有“填满”而暂停的数据包时,Nginx会忽略tcp_nopush参数, 然后,tcp_nodelay强制套接字发送数据。由此可知,TCP_NOPUSH可以与TCP_NODELAY一起设置,它比单独配置TCP_NODELAY具有更强的性能。所以我们可以使用如下配置来优化Nginx静态资源的处理。 压缩经过上述内容的优化,我们再次思考一个问题,假如在满足上述优化的前提下,我们传送一个1M的数据和一个10M的数据那个效率高?,答案显而易见,传输内容小,速度就会快。那么问题又来了,同样的内容,如果把大小降下来,我们脑袋里面要蹦出一个词就是"压缩",接下来,我们来学习Nginx的静态资源压缩模块。 在Nginx的配置文件中可以通过配置gzip来对静态资源进行压缩。 体验示例我们在html目录下放入一个jquery-1.10.1.js文件,访问 http://127.0.0.1/jquery-1.10.1.js,结果如下:
配置开启压缩后,如下:
相关配置gzip该指令用于开启或者关闭gzip功能。
注意只有该指令为打开状态,下面的指令才有效果。 gzip_types该指令可以根据响应页的MIME类型选择性地开启Gzip压缩功能。
所选择的值可以从mime.types文件中进行查找,有些类型比如图片、视频等本身压缩了也节省不了多少空间,反而会浪费CPU资源,所以在选择压缩的时候需要注意是否有必要进行压缩。
gzip_comp_level该指令用于设置Gzip压缩程度,级别从1-9,1表示压缩程度最低,效率最高,9刚好相反,压缩程度最高,但是效率最低最费时间,所以使用时,注意并不是级别越高越好。建议设置在中间值5/6即可。
gzip_vary该指令用于设置使用Gzip进行压缩发送是否携带“Vary:Accept-Encoding”头域的响应头部。主要是告诉接收方,所发送的数据经过了Gzip压缩处理。
开启后,在浏览器中可以看到多了一项,如下标红部分:
gzip_buffers该指令用于处理请求压缩的缓冲区数量和大小。
其中number:指定Nginx服务器向系统申请缓存空间个数,size指的是每个缓存空间的大小。主要实现的是申请number个每个大小为size的内存空间。这个值的设定一般会和服务器的操作系统有关,所以建议此项不设置,使用默认值即可。 gzip_disable针对不同种类客户端发起的请求,可以选择性地开启和关闭Gzip功能。
regex:根据客户端的浏览器标志(user-agent)来设置,支持使用正则表达式。指定的浏览器标志不使用Gzip.该指令一般是用来排除一些明显不支持Gzip的浏览器。
gzip_http_version针对不同的HTTP协议版本,可以选择性地开启和关闭Gzip功能。
该指令是指定使用Gzip的HTTP最低版本,该指令一般采用默认值即可。 gzip_min_length进行压缩响应页面的最小长度,响应页面的大小可以通过头信息中的Content-Length来获取,如果设置的值大于content-length将不进行压缩。
nignx计量大小的单位:bytes[字节] / kb[千字节] / M[兆] Web缓存Web缓存是指一个Web资源(如html页面,图片,js,数据等)存在于Web服务器和客户端(浏览器)之间的副本。缓存会根据进来的请求保存输出内容的副本;当下一个请求来到的时候,如果是相同的URL,缓存会根据缓存机制决定是直接使用副本响应访问请求,还是向源服务器再次发送请求。比较常见的就是浏览器会缓存访问过网站的网页,当再次访问这个URL地址的时候,如果网页没有更新,就不会再次下载网页,而是直接使用本地缓存的网页。只有当网站明确标识资源已经更新,浏览器才会再次下载网页。 Web缓存种类
浏览器缓存是为了节约网络的资源加速浏览,浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器就可以从本地磁盘显示文档,这样就可以加速页面的阅览。 为什么使用浏览器缓存
浏览器缓存的执行流程HTTP协议中和页面缓存相关的字段,我们先来认识下:
(1)用户首次通过浏览器发送请求到服务端获取数据,客户端是没有对应的缓存,所以需要发送request请求来获取数据; (2)服务端接收到请求后,获取服务端的数据及服务端缓存的允许后,返回200的成功状态码并且在响应头上附上对应资源以及缓存信息; (3)当用户再次访问相同资源的时候,客户端会在浏览器的缓存目录中查找是否存在响应的缓存文件 (4)如果缓存中有,直接响应,如果没有找到对应的缓存文件,从服务器重新获取。 (5)如果有缓存文件,接下来对缓存文件是否过期进行判断,过期的判断标准是(Expires), (6)如果没有过期,则直接从本地缓存中返回数据进行展示 (7)如果Expires过期,接下来需要判断缓存文件是否发生过变化 (8)判断的标准有两个,一个是ETag(Entity Tag),一个是Last-Modified (9)判断结果是未发生变化,则服务端返回304,直接从缓存文件中获取数据 (10)如果判断是发生了变化,重新从服务端获取数据,并根据缓存协商(服务端所设置的是否需要进行缓存数据的设置)来进行数据缓存。 浏览器缓存相关指令Nginx需要进行缓存相关设置,就需要用到如下的指令。 expiresexpires:该指令用来控制页面缓存的作用。可以通过该指令控制HTTP应答中的“Expires"和”Cache-Control"
add_headeradd_header指令是用来添加指定的响应头和响应值。
Cache-Control作为响应头信息,可以设置如下值:
测试
如上,我们设置浏览器对html、js、css、png类型的响应进行缓存,缓存时间为1000秒, 然后再次访问 http://118.190.152.59/jquery-1.10.1.js 返回的响应信息中就可以看到多了几项,如下:
补充一下,从请求上看下缓存的效果,第一次访问的时候状态码200,传输文件267K,当我们刷新页面后会发现 状态码为304并且传输栏里也变为了已缓存。
我们再试下 add_header相关的指令,如下:
如上,我们指定浏览器不缓存请求或响应的任何内容,清空浏览器缓存后,多次访问资源每次都会请求服务器,状态码200,传输都会显示资源的大小。
|
2023-01-09
2022-08-10
2022-08-26
2024-03-27
2022-08-26