一文读懂nginx gzip

本文详细探讨了Nginx中gzip_proxied指令的语义和使用,尤其是在代理请求响应压缩的场景下。通过配置示例和参数解析,分析了如何根据请求和响应头字段决定是否进行压缩,以及各种参数对缓存的影响,强调了配置实践的重要性。
摘要由CSDN通过智能技术生成

HTTP中包体【body】压缩协商对应的头字段为Accept-Encoding/Content-Encoding。对于HTTP包体压缩,Nginx的ngx_http_gzip_module模块提供了动态gzip压缩功能,并且有很精细的控制。
包括:
开启关闭gzip压缩: gzip on|off
对指定类型的文件进行压缩: gzip_types
文件最小压缩阈值: gzip_min_length
设置压缩率: gzip_comp_level
查看压缩率: $gzip_ratio
是否插入Vary: Accept-Encoding头字段: gzip_vary
禁止指定浏览器使用压缩:gzip_disable
是否对代理请求响应压缩:gzip_proxied

关于Nginx gzip基本功能,其语义,逻辑,配置和使用都相当简单,网上相关文章也很多,本文不再赘述,具体细节可以参看下文的配置实例及说明。本文将重点讨论其中的gzip_proxied指令的语义和使用,其涉及若干个参数,特定的应用场景,最为复杂,且网上文章涉及不多。

语义:
gzip_proxied的基本逻辑是对于代理请求,根据请求及回应的头字段决定是否压缩响应包体。判断的依据是请求头中是否携带Via头字段。
如:

拓扑:
对应的典型网络拓扑如下:

client — proxy1 — proxy2 — … proxyn — reverse proxy — origin web

我们的配置点在reverse proxy上, 也就是企业提供对外WEB服务的边缘的反向代理服务器。通常,proxyx会通过Via头字段标记消息自己的版本号和名称,从而形成了一条有序的消息路径,方便排错。

这是一个取自京东首页的Via字段的值,表示博主访问京东首页中间经过了2台代理服务器。

Via: http/1.1 ORI-CLOUD-HEN-MIX-109 (jcs [cSsSfU]), http/1.1 HENzhengzhou-CT-1-MIX-34 (jcs [cRs f ])

仿真:
我们可以通过在curl中添加头字段Via,模拟该场景。

curl -H 'Via: 1.1 aaa' test/200_accept_encoding.css --compressed -I

验证:
响应包体是否压缩,可以curl -I查看响应头中是否有Content-Encoding: gzip
如:

HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Fri, 18 Feb 2022 03:25:26 GMT
Content-Type: text/css
Last-Modified: Tue, 08 Feb 2022 15:48:26 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: W/"620290ca-3523"
Content-Encoding: gzip

压缩率可以查看log

tail -f ../logs/200_accept_encoding_access.log

47151 192.168.31.133 - - [18/Feb/2022:10:08:07 +0800] "GET /200_accept_encoding.css HTTP/1.1" 200 2646 "-" "curl/7.61.1" "-" 5.16

其中5.16就是压缩率

本文使用的是nginx 1.20.1, 客户端工具是curl 7.61.1, 测试文件为200_accept_encoding.css,可自行选择任意文件测试。

[root@test01 conf]# nginx -v
nginx version: nginx/1.20.1

[root@test01 conf]# curl -V
curl 7.61.1 (x86_64-redhat-linux-gnu) libcurl/7.61.1 OpenSSL/1.1.1k zlib/1.2.11 brotli/1.0.6 libidn2/2.2.0 libpsl/0.20.2 (+libidn2/2.2.0) libssh/0.9.4/openssl/zlib nghttp2/1.33.0

gzip_proxied的参数解析:
off gzip_proxied的缺省参数是off,语义是不对代理请求的回应进行压缩。
any 对任意代理请求回应压缩,语义正好和off相反。
expired 如果回应中包含头字段Expires,并且其值响应导致不会缓存,则压缩。因此可以构造缓存不过期,缓存过期2种场景,分别验证。回应中添加Expires头字段可以用expires指令。

#expires 1h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值