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:不管客户端浏览器支持不支持都发送压缩后的文件