sendfile()经过压缩之后,存在着一个问题是使用sendfile之后无法进入应用程序缓冲区,而压缩需要由内核缓冲区进入到应用程序缓冲区
解决问题的方法是,在内核缓冲区就进行压缩,将原先的jquery.js文件压缩成jquery.js.gz
前面在讲解sendfile的时候,提到过,开启sendfile以后,在读取磁盘上 的静态资源文件的时候,可以减少拷贝的次数,可以不经过用户进程将 静态文件通过网络设备发送出去,但是Gzip要想对资源压缩,是需要经 过用户进程进行操作的。所以如何解决两个设置的共存问题。
可以使用ngx_http_gzip_static_module模块的gzip_static指令来解决。
gzip_static指令
gzip_static: 检查与访问资源同名的.gz文件时,response中以gzip相关 的header返回.gz文件的内容。
语法:gzip_static on | off | always;
它的默认值是 gzip_static off;
位置存储在:http、server、location三个模块当中
怎样用,使用vim nginx_gzip.conf打开配置文件
如果你想手动配置压缩指令,先要将gzip的文件进行关闭
使用gzip_static on;将文件进行打开
配置完gzip_static之后,出现一个命令,不认识unknown,出现这个问题的原因是什么?它缺少一个模块配置
如何安装ngx_http_gzip_static_module模块
第一步:nginx -v
第二步:将nginx安装目录下sbin目录中的nginx二进制文件进行更名
cd /usr/local/nginx/sbin
mv nginx nginxold
第三步:进入Nginx的安装目录
cd /root/nginx/core/nginx-1.16.1
第四步:使用make clean将之前编译的文件给他清除掉
第五步:使用--with-http_gzip_static_module,其中--with-的意思就是添加模块的意思
之后就会生成一个Ngnix的二进制可执行文件
输入ll之后,发现这里生成了一个objs的二进制文件
cd 进入之后有一个nginx的可执行文件
cp的意思是,将nginx拷贝到 /usr/local/nginx/sbin文件下,最后项目升级一定要在Ngnix安装目录下升级
先通过cd 往上跳一层
最后执行make upgrade进行升级
检验语法,重新加载 nginx -s reload
步骤小结:
1、查询当前Nginx的配置参数
nginx -V
2、将nginx安装目录下sbin目录中的nginx二进制文件进行更名
cd /usr/local/nginx/sbin
mv nginx nginxold
3、 进入Nginx的安装目录
cd /root/nginx/core/nginx-1.16.1
4、执行make clean清空之前编译的内容
make clean
5、使用configure来配置参数
./configure --with-http_gzip_static_module
6、使用make命令进行编译
make
7、将objs目录下的nginx二进制执行文件移动到nginx安装目录下的sbin 目录中
mv objs/nginx /usr/local/nginx/sbin
8、执行更新命令
make upgrade
gzip_static测试使用
首先切换到 cd /usr/local/nginx/html/页面下查看是否有jquery.js文件是否存在
直接访问/jquery.js发现文件的数据格式是281kb,文件数据格式没有进行压缩
在Network中没有压缩的请求头数据格式
直接使用gzip jquery.js可以将jquery.js.gz文件进行压缩
再对jQuery.js文件进行访问,此时jQuery的数据大小已经变成了83.4kb了,数据已经被压缩了
使用NetWork查看请求头的相关信息,此时经过压缩文件后访问的jQuery.js文件,多了一个Contets-Encoding:gzip和Var:Accept-Encoding,表示该文件经过了压缩