nginx之gzip_static详解
当然,这是在存在许多静态文件入.css时,需要考虑的性能问题。
关于 nginx 的 gzip ,可以分为两种:
- nginx 动态压缩,对每个请求先压缩再输出。
- nginx 静态压缩,使用现成的扩展名为 .gz 的预压缩文件。
Nginx支持静态和动态两种包体gzip压缩方式,分别对应模块ngx_http_gzip_static,ngx_http_gzip。
我们知道gzip是CPU密集型的应用,实时动态压缩比较消耗CPU资源。另外,如果使用gzip,则sendfile零拷贝技术无法使用。
为进一步提高Nginx的性能,我们可以使用静态gzip压缩,提前将需要压缩的文件压缩好,当客服请求到达时,直接发送压缩好的.gz文件,如此就减轻了服务器CPU的压力,提高了性能。
nginx 动态压缩
开启 nginx 动态压缩只需要在 nginx.conf 文件中做如下修改即可:
# 开启和关闭gzip模式
gzip on;
# gizp压缩起点,文件大于1k才进行压缩
gzip_min_length 1k;
# 设置压缩所需要的缓冲区大小,以4k为单位,如果文件为7k则申请2*4k的缓冲区
gzip_buffers 4 16k;
# 设置gzip压缩针对的HTTP协议版本
gzip_http_version 1.0;
# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_comp_level 2;
# 进行压缩的文件类型
gzip_types text/plain application/javascript text/css application/xml;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
nginx 静态压缩
nginx 静态压缩需要使用 ngx_http_gzip_static_module 模块,先简单看一下介绍:
ngx_http_gzip_static_module 模块允许发送扩展名为 .gz 的预压缩文件,而不是常规文件。
该模块可以读取预先压缩的gz文件,这样可以减少每次请求进行gzip压缩的CPU资源消耗。 该模块启用后,nginx首先检查是否存在请求静态文件的gz结尾的文件,如果有则直接返回该gz文件内容。为了要兼容不支持gzip的浏览器,启用gzip_static模块就必须同时保留原始静态文件和gz文件。这样的话,在有大量静态文件的情况下,将会大大增加磁盘空间。我们可以利用nginx的反向代理功能实现只保留gz文件。
使用sendfile指令:如果需要对磁盘当中的内容做gzip压缩,作为http body发送给客户端sendfile就会退化,sendfile功能就没有了,需要使用gzip static模块(sendfile作为0拷贝,但是我们一定要做压缩,那么一定要读到磁盘当中)
gzip_static 生效的前提是nginx开启了gzip_static压缩并且请求目录下存在名称相同且以.gz 结尾的文件。
使用 gzip_static 压缩的话要先准备好压缩后的gz文件,并且服务器会消耗更多的空间来存储压缩文件和原文件,这个有利有弊要自己衡量。
在linux下可以使用命令来创建压缩文件:
tar -zcvf xx.gz xx
tar -zxvf xx.gz 这个是解压文件
安装模块
默认情况下未构建此模块,应使用 --with-http_gzip_static_module 配置参数启用它 。
在安装包目录编译安装:
./configure --with-http_gzip_static_module
然后修改 nginx.conf 配置文件:
gzip_static on;
gzip_proxied expired no-cache no-store private auth;
nginx 动态压缩 和 静态压缩结合使用会更好:
gzip_static on;
gzip_proxied expired no-cache no-store private auth;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/javascript text/css application/xml;
gzip_vary on;
好处
- 提高CPU使用率
- 减少流量
最终提高请求速率。
参考
nginx 配置 gzip_static_gzip static-CSDN博客