54 Nginx的Gzip和sendfile的共存问题
54 Nginx的Gzip和sendfile的共存问题
54.1 回顾sendfile处理流程

1.客户端在浏览器输入网址,通过网络,将请求发送到服务端
2.服务端分为用户区、内核区,应用程序nginx在用户区,用户区想要读取磁盘,需要经过内核区接口的调用
3.用户区通过内核区sendfile()接口读取磁盘信息,将信息从磁盘拷贝(涉及第一次拷贝)到内核缓冲区
4.sendfile 函数中指定了将信息交给的Socket,因此可以直接在内核缓冲区将信息传递给Socket缓冲区
5.nginx再将Socket缓冲区的信息拷贝(涉及第二次拷贝)到网卡,网卡通过网络将信息发送回客户端
54.2 问题
1.使用sendfile() 后,文件不进入应用程序缓冲区,而是在内核区直接向外发送
2.gzip作用于应用程序区,无法对内核区文件进行压缩
54.3 gzip_static
使用 ngx_http_gzip_static_module 模块的 gzip_static 指令解决
gzip_static:检查与访问资源同名的 .gz 文件(例如:访问由 jquery.js 变为 jquery.js.gz), response 中以 gzip 相关的 header 返回 .gz 文件的内容
| 语法 | gzip_static on | off | always; |
| 默认值 | gzip_static off; |
| 位置 | http 、server 、location |
on:判断客户端浏览器是否支持压缩,支持启用、不支持不启用
off:不启用
always:不管客户端浏览器是否支持压缩,皆发送以资源同名的 .gz 文件
注意:使用 gzip_static 指令,需要添加 ngx_http_gzip_static_module 模块
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号