Nginx静态资源部署优化_压缩02

Nginx静态资源压缩

在Nginx的配置文件中可以通过gzip来对静态资源进行压缩

1
2
3
ngx_http_gzip_module模块		# nginx自带
ngx_http_gzip_static_module模块 # 需要安装
ngx_http_gunzip_module模块 # 需要安装

Gzip各模块支持配置指令

以下指令都来自于ngx_http_gzip_module模块支持, 该模块nginx内置, 可以直接使用

1
模块文档: http://nginx.org/en/docs/http/ngx_http_gzip_module.html

gzip

gzip on|off 用于开启或关闭gzip功能

1
2
3
http{
gzip on;
}

可以用于http/server/loaction

gzip_types

gzip_types mime-type ... 设置需要压缩的文件mime类型

默认压缩text/html

1
2
3
http{
gzip_types application/javascript;
}

所选值可以从mime.types文件中查找, 也可以使用* 代表所有类型, 但不推荐

gzip_comp_level

gzip_comp_level level 设置Gzip压缩程度

级别从1到9, 压缩程度上升, 压缩效率降低, 9 代表压缩程度最高, 但效率最低

1
2
3
http{
gzip_comp_level 6;
}

gzip_vary

gzip_vary on|off 设置是否携带gzip响应头

gzip_vary 用于设置进行压缩发送是否携带 Vary:Accept-Encoding 响应头, 告诉接收方该资源经过了Gzip压缩处理

1
2
3
http{
gzip_vary on;
}

可用于http/server/location

gzip_buffers

gzip_buffers number size 用于设置压缩的缓冲区数量及大小

该值设定一般和服务器操作系统有关, 一般使用默认值即可

1
2
3
http{
gzip_buffers 4 16k;
}

gzip_disable

gzip_disable regex .. 用于使用正则针对不同的浏览器禁用Gzip功能

regex匹配Request HeadersUser-Agent 数据

1
2
3
http{
gzip_disable "MSIE [1-6]\."; # 排除IE6以下版本
}

gzip_http_version

gzip_http_version 1.0|1.1 针对不同的HTTP协议版本, 选择性开启或关闭gzip

该指令用于指定最低HTTP协议版本, 一般用默认值即可

1
2
3
http{
gzip_http_version 1.1;
}

gzip_min_length

gzip_min_length 指定需要压缩的最小文件长度

默认20, 从头信息中的Content-Length中获取

1
2
nginx 计量但对: bytes[字节] / kb[千字节] / M[兆]
如: 1024 / 10k / 10m
1
2
3
http{
gzip_min_length 20;
}

gzip_proxied

gzip_proxied off|expired|no-cache|no-store|private|no_last_modified|no-etag|auth|any 设置是否对服务端返回结果进行Gzip压缩

反向代理相关

  • off 关闭nginx服务器对后台服务器返回结果的压缩, 忽略其他参数
  • expired 启用压缩, 如果响应头headers头中包含Expires 头信息
  • no-cache 启用压缩, 如果响应头headers头中包含Cache-Control:no-cache头信息
  • no-store 启用压缩, 如果响应头headers头中包含Cache-Control:no-store头信息
  • private 启用压缩, 如果响应头headers头中包含Cache-Control:private头信息
  • no-last-modified 启用压缩, 如果响应头headers头中不包含Last-Modified 头信息
  • no-etag 启用压缩, 如果响应头headers头中不包含 ETag 头信息
  • auth 启用压缩, 如果响应头headers头中包含Authorization 头信息
  • any 为所有代理请求无条件启用压缩

Gzip压缩功能配置

编辑新建nginx_zip.conf文件

1
2
3
4
5
6
7
8
9
gzip on;			# 开启gzip功能
gzip_types *; # 压缩文件类型,mime-type
gzip_comp_level 6; # gzip 压缩等级
gzip_min_length 1024;# 需要进行压缩响应页面的最小长度 content-length
gzip_buffers 4 16k; # 缓存空间数量及大小
gzip_http_version 1.1;# 指定压缩响应需要的最低HTTP协议版本
gzip_vary on; # 向响应头中添加压缩表示
gzip_disable "MSIE [1-6]\."; # 过滤浏览器禁用压缩
gzip_proxied off; # nginx作为反向代理压缩服务端返回数据的条件

将配置文件引入nginx.conf

1
include nginx_zip.conf;

Gzip和sendfile的冲突解决

Gzip需要应用程序用户态进行操作文件并压缩发送, 但sendfile是直接从内核缓冲区发送到Socket缓冲区的, 会导致功能冲突

可以使用ngx_http_gzip_static_module 模块的 gzip_static 指令解决问题

image-20211119012700914

解决方案是在请求资源之前, 就将资源压缩, jquery.js 压缩为 jquery.js.gz, 在用户请求资源时, 发送压缩后的文件给用户, 由浏览器进行解压缩显示

gzip_static

gzip_static on|off|always;

访问与资源同名的.gz 文件时, response中以gzip相关的header返回.gz文件内容

添加上述命令后, 若报错 unknown directiove ‘gzip_static’, 原因是Nginx默认没有添加对应模块, 需要手动安装 ./configure –with-http_gzip_static_module

1
2
3
http{
gzip_static on;
}
1
gzip /var/www/test/images/jquery.js