首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx:缓存Brotli压缩代理上游响应

Nginx:缓存Brotli压缩代理上游响应
EN

Stack Overflow用户
提问于 2020-01-24 15:25:17
回答 1查看 1.2K关注 0票数 2

我为动态生成的资源启用了Nginx中的Brotli压缩,但很少更改资源。

我的期望是,当Nginx缓存上游响应时,它也会缓存压缩结果。因此,我假设启用Brotli的CPU成本可以忽略不计。相反,我看到了perf top确认的与Brotli相关的性能影响。

我验证了对上游服务器的缓存是有效的。然而,Nginx只在其缓存中存储未压缩的上游请求。因此,它将不得不为每个请求运行代价高昂的Brotli压缩。这就是问题所在。

有一些源(与gzip压缩有关)建议在上游压缩,或者如果这不是创建第二个Nginx代理请求的选项,它将充当上游的角色并进行压缩。这两种解决方案都不是很优雅。

是否有一种方法使Nginx缓存不仅包括未压缩的上游请求,还包括压缩的结果?

也许我忽略了一些。下面是一个简化的配置:

代码语言:javascript
复制
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;
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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无能力的客户数量却在下降。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59899354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档