我为动态生成的资源启用了Nginx中的Brotli压缩,但很少更改资源。
我的期望是,当Nginx缓存上游响应时,它也会缓存压缩结果。因此,我假设启用Brotli的CPU成本可以忽略不计。相反,我看到了perf top确认的与Brotli相关的性能影响。
我验证了对上游服务器的缓存是有效的。然而,Nginx只在其缓存中存储未压缩的上游请求。因此,它将不得不为每个请求运行代价高昂的Brotli压缩。这就是问题所在。
有一些源(与gzip压缩有关)建议在上游压缩,或者如果这不是创建第二个Nginx代理请求的选项,它将充当上游的角色并进行压缩。这两种解决方案都不是很优雅。
是否有一种方法使Nginx缓存不仅包括未压缩的上游请求,还包括压缩的结果?
也许我忽略了一些。下面是一个简化的配置:
proxy_cache_path /var/cache/nginx levels=1 keys_zone=my_config_cache:8M
inactive=60m use_temp_path=off;
server {
location = /foo {
proxy_pass http://test-upstream;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_ignore_headers Expires;
proxy_ignore_headers Cache-Control;
brotli on;
brotli_comp_level 11;
proxy_cache my_config_cache;
proxy_cache_valid 10s;
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
expires 60s;
}
}发布于 2020-01-25 10:32:05
brotli_comp_level 11;
太高了。推荐的是动态内容的4。
您不能用当前的设置来做您想做的事情。
如果您可以将您的上游设置为支持brotli,那么您可以通过将$http_accept_encoding作为缓存密钥的一部分来缓存来自它的压缩响应。但是,仅仅这样做还不够好,因为您必须将其值正常化(想想看,所有可能的Accept-Encoding传入头都会导致缓存膨胀和效率低下)。
如果您真正关心的是启用Brotli的客户端(现在大多数浏览器都支持Brotli ),并且有可能达到最高的压缩级别,那么您可以通过在代理传递时提供Accept-Encoding: br来对支持brotli的上游进行压缩,这将导致缓存始终具有brotli编码响应。(您不需要调整缓存键)。但是,这需要一个当前不可用的特性,例如,我称之为unbrotli。
他们的想法是,所有的事情都流向上游,说“我想要Brotli编码的响应”。上游提供Brotli编辑的响应(当然,在适用的情况下,例如文本响应)。但是对于只支持gzip或根本不支持压缩的客户端,应该动态地从Brotli (非常低的CPU影响)中解压缩。这不是很好,但Brotli无能力的客户数量却在下降。
https://stackoverflow.com/questions/59899354
复制相似问题