如何将 nginx brotli_static 与 proxy_pass 一起使用?

How can I use nginx brotli_static with proxy_pass?

nginx 是在启用 Brotli 的情况下编译的。在我的 nginx.conf

http {
    ...
    brotli_static on;
}

我的 .br 文件位于 proxy_pass.

的服务器上
location / {
    ...
    proxy_pass http://app;
}

并且已在 app 服务器上生成了 .br 文件:

$ ls -lh public/js/dist/index.js*
-rw-r--r-- 1 mike wheel 1.2M Apr  4 09:07 public/js/dist/index.js
-rw-r--r-- 1 mike wheel 201K Apr  4 09:07 public/js/dist/index.js.br

下载未压缩的文件有效:

wget https://example.com/js/dist/index.js

下载 1,157,704 大小的未压缩文件。

wget -S --header="accept-encoding: gzip" https://example.com/js/dist/index.js

下载一个 309,360 大小的 gzip 文件。

但是:

wget -S --header="accept-encoding: br" https://example.com/js/dist/index.js

仍然得到完整的 1,157,704 大小的未压缩文件。

我曾希望 brotli_static 也会代理 .br 文件请求 - 向后端发送 GET 请求以获取 .br 等效资源 - 但这不会似乎没用。

brotli_static可以通过proxy_pass吗?

基于 Maxim Dounin (an nginx core engineer)'s comment on gzip_static - 我想 brotli_static 的行为类似于 - brotli_static 只处理文件,不处理 HTTP 资源:

That is, gzip_static is only expected to work when nginx is about to return regular files.

所以看起来 brotli_static 和 proxy_pass 是不可能的。

您的 nginx 配置文件需要一个部分来告诉它为静态内容文件夹提供服务。您不希望您的应用服务器这样做。

我相信您需要将它放在 location / 之前,以便它优先。