尽管遵循官方 Nginx 文档/在线研究,Nginx gzip 压缩仍无法正常工作

Nginx gzip compression not working despite following official Nginx documentation / online research

问题

我无计可施所以决定 post 查询,在我注意到 lighthouse 抱怨我的一些客户后,我试图在 nginx docker 容器上设置 gzip 压缩网站没有启用它。所有有问题的站点在其配置中都有 gzip 压缩设置,并添加了正确的设置和类型,但无论我如何更改,它都会以未压缩的形式出现。我已经通过浏览器和使用 CURL 请求对此进行了测试,没有任何变化。

我在这里和其他地方查看了无数票证,none 尽管有很多配置摆弄,但解决方案仍然有效。

我试过的

为了这张票和测试的目的,我创建了一个完整的 'virgin' docker 项目,其中包含一个包含站点配置的 default.conf 文件和一个包含站点配置的 public/ 文件夹index.htmltest-css.css 文件。

您可以在此处找到此示例项目:https://github.com/MajorFailz/so-issue-nginx-docker-example

配置文件只是为文件夹提供服务,并包含 nginx 自己的文章推荐的 gzip 设置:https://docs.nginx.com/nginx/admin-guide/web-server/compression/

Docker 文件

FROM nginx:1.21

RUN mkdir /app

WORKDIR /app

COPY ./public /app/public

COPY ./conf/default.conf /etc/nginx/conf.d/default.conf

default.conf

server {
    gzip on;
    gzip_types      text/plain application/xml text/css;
    gzip_proxied    no-cache no-store private expired auth;
    gzip_min_length 1000;

    location / {
        root /app/public;
    }
}

正在使用浏览器进行测试

启动并在 chrome 中查看此项目时,打开开发选项卡并查看 index.html 显示它正在使用 gzip 压缩服务:

现在如果看一下 test-css.css 文件,我们可以看到它没有被压缩:

通过控制台测试

因此,在进行一些研究后,似乎有实例是 Chrome 或各种 windows 防病毒软件,并在到达浏览器之前解压缩内容。因此,我使用 curl 从 linux VM 进行测试,尝试使用 gzip 获取文件并查看其内容。

master@apex:~$ curl -H "Accept-Encoding: gzip" -I http://www.apex.local/test-css.css
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Tue, 11 Jan 2022 15:38:00 GMT
Content-Type: text/css
Content-Length: 53790
Connection: keep-alive
Last-Modified: Tue, 11 Jan 2022 14:55:59 GMT
ETag: "61dd9a7f-d21e"
Accept-Ranges: bytes

所以还是没有压缩!所以好像不是浏览器的问题,另外我用一个网站性能报告网站测试也遇到了同样的问题。

从进一步的研究来看,问题可能是 nginx 没有安装 gzip 模块,所以在挖掘之后我 运行 从容器中测试它是否是用 gzip 编译的这个命令:

root@127b59858b48:/app# 2>&1 nginx -V | tr -- - '\n' | grep _module | grep gzip
http_gzip_static_module

所以它有模块!那是什么嘿?

附加信息

我尝试了多种配置设置组合,还尝试了 nginx docker 映像的不同 OS 设置(我的项目 运行 在 alpine 上,所以认为这可能是一个因素) 但结果是一致的。

客户端 nginx 配置示例

当前配置示例 copy/pasted 来自我的一个客户网站:

    gzip on;
    gzip_min_length 10240;
    gzip_comp_level 1;
    gzip_vary on;
    gzip_disable msie6;
    gzip_proxied expired no-cache no-store private auth;
    gzip_types
        # text/html is always compressed by HttpGzipModule
        text/css
        text/javascript
        text/xml
        text/plain
        text/x-component
        application/javascript
        application/x-javascript
        application/json
        application/xml
        application/rss+xml
        application/atom+xml
        font/truetype
        font/opentype
        application/vnd.ms-fontobject
        image/svg+xml;

门票参考

我查看了很多票,但我仍然在浏览器中打开了最近的三张票:

这一切都适用于我的 Debian 11 主机

$:/so-issue-nginx-docker-example# curl -Iv -H "Accept-Encoding: gzip" 127.1:49153/test-css.css
*   Trying 127.0.0.1:49153...
* Connected to 127.1 (127.0.0.1) port 49153 (#0)
> HEAD /test-css.css HTTP/1.1
> Host: 127.1:49153
> User-Agent: curl/7.74.0
> Accept: */*
> Accept-Encoding: gzip
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Server: nginx/1.21.5
Server: nginx/1.21.5
< Date: Wed, 12 Jan 2022 09:12:35 GMT
Date: Wed, 12 Jan 2022 09:12:35 GMT
< Content-Type: text/css
Content-Type: text/css
< Last-Modified: Wed, 12 Jan 2022 09:04:47 GMT
Last-Modified: Wed, 12 Jan 2022 09:04:47 GMT
< Connection: keep-alive
Connection: keep-alive
< ETag: W/"61de99af-d21e"
ETag: W/"61de99af-d21e"
< Content-Encoding: gzip
Content-Encoding: gzip

我注意到您的浏览器以及 curl 中的 NGINX 版本是 1.18.0。您共享的 Dockerfile 使用 NGINX 版本 1.21。鉴于此,您确定将 curl 发送到正确的实例,还是有任何其他 NGINX 服务器在流量到达“Dockerized”NGINX 之前代理流量?

你能仔细检查一下吗?我将使用 1.18 测试设置以确保它不是版本。

更新:它也适用于 1.18.0

HTTP/1.1 200 OK
< Server: nginx/1.18.0
Server: nginx/1.18.0
< Date: Wed, 12 Jan 2022 09:52:00 GMT
Date: Wed, 12 Jan 2022 09:52:00 GMT
< Content-Type: text/css
Content-Type: text/css
< Last-Modified: Wed, 12 Jan 2022 09:04:47 GMT
Last-Modified: Wed, 12 Jan 2022 09:04:47 GMT
< Connection: keep-alive
Connection: keep-alive
< ETag: W/"61de99af-d21e"
ETag: W/"61de99af-d21e"
< Content-Encoding: gzip
Content-Encoding: gzip