我在 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;
}
}