CDN源站是Nginx服务器,开启了Gzip压缩功能,当客户端直接请求源站时,Gzip压缩功能正常;当客户端的请求回源时,Gzip压缩功能失效,详情如下:
支持Gzip压缩/解压缩时,Nginx将返回压缩后的内容,以降低流量开销,加快响应速度。但是启用CDN后,请求将通过CDN进行转发,而客户端最终收到的是未压缩的内容,即CDN回源后,源站的Gzip功能未生效,详情如下:
未启用CDN
请求头(Request Header)含有
Accept-Encoding: gzip, deflate
,响应头(Response Header)正常返回
Content-Encoding: gzip
,即内容已经被压缩。
启用CDN后
请求头含有
Accept-Encoding: gzip, deflate
,但响应头返回的是
Content-Length
,并未响应
Content-Encoding: gzip
。
源站Nginx服务器中Gzip相关配置错误,CDN的回源请求未启用Gzip压缩功能,详情如下:
客户端请求经过CDN转发至源站时,回源的请求头中将增加
Via
字段以标识请求来自代理服务器(此处指CDN)。而Nginx的
ngx_http_gzip_module
模块中存在一个
gzip_proxied
配置,此配置专门用于控制代理服务器的请求是否启用Gzip压缩,并且此配置生效的前提之一是请求头中含有
Via
字段。由此可见,
gzip_proxied
配置将决定回源的请求是否启用Gzip压缩。
如果您遇到的问题与
问题描述
中的情况完全一致,则可以参考下列步骤更新Nginx的配置文件,以修复此问题。如果您无法确定问题现象,可参见
更多信息
进行排查。
找到Nginx中含有Gzip的配置段。由于Gzip可配置在http、server、location三个配置段中,不同配置段对应的配置文件可能不同,请您以实际配置情况为准,本文以Gzip配置在
nginx.conf
文件的HTTP配置段为例。
检查Gzip配置中是否存在
gzip_proxied
配置。
如果存在,则修改为以下配置;如果不存在,则添加以下配置。更多有关
gzip_proxied
配置的介绍,请参见
Nginx的官方文档
。
说明
:当不存在
gzip_proxied
配置时,
该配置将使用默认值
off
。
gzip_proxied any
说明
:
any
表示所有来自代理服务器的请求都将启用压缩。
保存上述配置后,依次执行下列命令,确认Nginx配置无误,然后重新加载Nginx配置文件。
nginx -t
nginx -s reload
启用CDN,客户端请求经过CDN转发至源站Nginx服务器后,确认返回的响应头中含有
Content-Encoding: gzip
,即内容被压缩。
为确保现场环境中的问题情况与本文的
问题描述
一致,请参见下列步骤进行测试:
登录任意支持
curl
命令的客户端。
参考下列命令,通过curl命令直接访问源站,同时增加含有
Accept-Encoding: gzip, deflate
的请求头。
curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate'
[$Domain]:您的域名。
[$Resource]:网站里某个资源的请求地址,例如一张图片、一个API接口等。
[$Original_Server_IP]:源站Nginx服务器的公网IP地址。
系统返回类似如下,确认响应头中含有
Content-Encoding: gzip
。
参考下列命令,在步骤2命令的基础上,增加一个
Via
字段,模拟请求来自于代理服务器。
curl -voa 'http://[$Domain]/[$Resource]' -x [$Original_Server_IP]:80 -H 'Accept-Encoding: gzip, deflate' -H 'Via:xxx'
说明
:
Via
字段使用任意值均可,不影响测试结果,本文以
xxx
为例。
系统返回类似如下,确认响应头中返回的是
Content-Length
,并未响应
Content-Encoding: gzip
。
同时启用Gzip压缩与CDN的页面优化功能,页面优化功能无效
CDN的常见问题