如何防止nginx反向代理重新压缩上游压缩响应?

How to prevent nginx reverse proxy recompress the upstream compressed response?

我有 nginx 反向代理,它从上游(Varnish 缓存)接收 brotli 压缩响应。但是,仅当我设置“brotli on”时,反向代理才会对浏览器提供 brotli 压缩响应;在反向代理服务器块内。

我的目标是让 nginx 反向代理完全不处理压缩。为此,我有以下问题:

  1. 是否期望反向代理块解压缩收到的响应并自行处理?不能直接把上游响应传回客户端吗?

  2. 有没有办法将代理响应或它的大小转储到 nginx 日志?这将有助于更好地调试问题。

我已经解决了这个问题,所以将此发布给可能遇到类似问题的任何人:

  1. Varnish 将我的 'Accept-Encoding' 请求 header 更改为 'gzip'。根据 Varnish 文档,这是设计好的 (see here)。
  2. 但是,上游 nginx 服务器(在 varnish 后面)响应了 non-compressed 内容,因为 gzip_http_version 的默认值是 1.0,而 proxy_http_version 的默认值是 1.1。 (see here)

解决方法是:

一个。通过将 -p http_gzip_support=off 传递给 varnishd.

来设置 Varnish 不担心压缩

b。在上游 Nginx 服务器上将 gzip_http_version 设置为 1.1

破译上述行为成为可能,因为我在我的上游 nginx 服务器(清漆后面的服务器)上记录了以下内容:

log_format bytes_sent '$bytes_sent' - '$http_accept_encoding' - '$request';