Nginx 文件传输效率、实时、压缩配置指令

# sendfile  开启文件高效传输模式
# 默认值:off
# 位置:http、servcer、location……
# 开启和不开启worker访问的文件发送到浏览器的过程不同。
# 不开启的时候worker进程先调用read()函数将数据读取致缓存,然后返回给浏览器
# 开启之后worker进程直接调用sendfile()将文件在缓存中通过句柄发送给浏览器了
sendfile on|off;

# tcp_nopush 该指令必须在sendfile打开的时候才会生效,主要是用来提高网络包的传输'效率'
# 语法:tcp_nopush on|off
# 默认值: off
# 位置:http、server、location
tcp_nopush on|off;

# tcp_nodelay 该指令必须在keep-alive开启的情况下才生效,来提高网络包传输的‘实时性’
# 语法:tcp_nodelay on|off
# 默认值:on
# 位置:http、server、location
# tcp_nopush 、tcp_nodelay 之间的关系是互斥的
# 大家都知道tcp每个包传输的时候其中可能99%都是协议的内容,%1是我们真实要发送到客户端的内容,
# tcp_nopush就是要等数据达到规定大小的时候才发送出去,这样就提高了发送数据的效率,但于此同时却缺乏了发送数据的实时性,tcp_nodelay 就和tcp_nopush相反,只要有数据就发送。
# 后面随着linux系统和Nginx的更新,这两个指令可以同时设置为on,linux系统会判定发送文件的时候启用tcp_nopush 模式,其他时候看情况适用tcp_nodelay 模式。具体是怎么应用还需要进一步查证。
tcp_nodelay on;

# ngx_http_gzip_module 模块
# nginx内置了很多模块,这些模块的使用在nginx官方都是有说明文档的
# gzip、gzip_types配置指令就是来配置ngx_http_gzip_module
# gzip、gzip_types是来配置浏览器访问文件的时候是否先将文件压缩后传输
# gzip是用来是指是否启用或关闭压缩功能
# gzip_types是用来控制只对哪些文件类型进行压缩,它对应的值是mime.type文件中的值
# 位置 http、server、location
# 语法:
gzip on|off;  # 默认off
gzip_type mome-type1 mome-type2 ...;  # 默认 text/html
# 之所以要用gzip_type指定类型,是因为有些图片或者文件,它本身就已经压缩了,你通过nginx再次对它压缩的效果其实不大,反而大大增加了服务器运算。
# 所以不建议直接设置成gzip_type *;

# gzip_comp_level指令,该指令可以设置压缩级别1-9,数值越低压缩耗时越低,同时压缩程度越低,
# 数值越高,压缩耗时越高(也就是运算复杂度越高),但压缩成都越好。
# 一般不建议直接设置成1或者9,建议使用6(中间值)就可以了,因为设置6级和9级压缩后文件的大小变化其实并没有预想的那么好。
# 语法 gzip_comp_level level;
# 默认值:1
# 位置: http、server、location
 gzip_comp_level 6;

# gzip_vary指令:设置http的请求头中是否包含Vary: Accept-Encoding;值来告诉浏览器我们传输的文件是进行过gzip压缩的。
# 语法: gzip_vary on|off
# 默认:off
# 位置 http、server、location
gzip_vary on;

# gzip_buffers指令:该指令用于处理请求压缩的缓冲去数量和大小。对文件进行压缩的时候需要用到缓存,这里就是设置压缩时申请缓存大小。一般该指令不建议去修改它的默认值。32bit和64bit它的默认值是不同的,
# 语法:gzip_buffers number size;
# number 数量,size是大小,number*size等于缓冲区内存大小
# 默认值:gzip_buffers 32 4k | 16 8k;
# 位置 http、server、location

# 选择性开启或者关闭gzip压缩功能
# 如果浏览器发送的http请求头User-Agent的值符合regex 就启用gzip,否则就不启用。
# User-Agent是浏览器和操作系统的相关信息,防止某些浏览器版本不支持gzip。
# 语法: gzip_disable regex ...;
# gzip_disable "Mozilla/5.0.*";
# 语法:gzip_http_version 1.0|1.1;
# 默认:1.1  一般不用改动它
# gzip_http_version 通过http请求版本来控制是否启用gzip
# gzip_min_length length;  如果请求的内容小于length的时候就不启用gzip功能。
# 页面大小可以通过Content-Length来获取。
# 默认:20kb,当数值后面没有跟单位的时候,默认b单位
gzip_min_length 20;
# 单位有 bytes[字节]/kb[千字节]/m[兆]
# gzip_proxied指令是在反向代理的时候使用
# 当满足某些条件的时候启用gzip
# 语法 gzip_proxied off|expired|no_cache|no-store|private|no_last_modifield|no_etag|auth|any;
# 默认值:off
# off   关闭Nginx服务器对后台服务器返回结果的gzip压缩
# expired    启用压缩,如果header头中包含“Expires”头信息
# no-cache  启用压缩,如果header头中包含“Cache-Control:no_cache”头信息
# no-store  启用压缩,如果header头中包含“Cache-Control:no_store”头信息
# no-private    启用压缩,如果header头中包含“Cache-Control:private”头信息
# no_last_modifield  启用压缩,如果header头中不包含"Last-Modifield"头信息
# no_etag  启用压缩,如果header头中不包含"ETag"头信息
# auth  启用压缩,如果header头中包含"Authoriztion"头信息
# any  无条件启用压缩

# gzip和sendfile共存问题
# 在浏览器访问服务器文件的时候,文件从服务器返回致浏览器经过了三个缓存区
# 分别是:1.服务端收到请求时应用程序向内核发送read读取文件指令,然后内核去读取文件到内核缓冲区,
# 2.再冲内核缓冲区返回到应用程序缓冲区,
# 3.再由应用程序把文件内容冲应用程序缓冲区发送到Socket缓冲区返回到浏览器。
# 而sendfile省去了第2步骤,当服务器接收到请求时,直接将要传递的文件名通过sendfile函数告诉内核要发送到哪个Socket缓存。那么内核读取到文件后并不返回到应用程序缓冲区,而是直接将文件读取到和内核缓冲后直接copy到Socket缓冲区完成返回。
# 那么问题来了,gzip压缩是需要在应用程序中执行压缩的,然而你启用了sendfile模式那么就无法使用gzip的功能。
# 后面Nginx新增了ngx_http_gzip_static_module模块去处理它
# 指令:gzip_static on | off | always;
# 注意,ngx_http_gzip_static_module在Nginx安装的时候,默认是不安装的,所以你要用的话需要手动通过./configure去配置升级。
# 它的处理流程是:在文件发送前先一步将文件内容压缩打包成.gz后缀的压缩包,等用的时候直接使用把压缩包返回到浏览器。这样做好处也是挺大的。
# 那么.gz文件是什么时候生成的呢
# 是通过命令来的,下面就是 jquery.js打包成 jquery.js.gz
gzip jquery.js
# on:当客户端浏览器支持就发送压缩后的文件,而不是原文件
# off:关闭
# always:不管客户端浏览器支持不支持都发送压缩后的文件

 

posted @ 2021-10-31 15:05  看一百次夜空里的深蓝  阅读(544)  评论(0编辑  收藏  举报