尽管遵循官方 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.html
和 test-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
问题
我无计可施所以决定 post 查询,在我注意到 lighthouse 抱怨我的一些客户后,我试图在 nginx docker 容器上设置 gzip 压缩网站没有启用它。所有有问题的站点在其配置中都有 gzip 压缩设置,并添加了正确的设置和类型,但无论我如何更改,它都会以未压缩的形式出现。我已经通过浏览器和使用 CURL 请求对此进行了测试,没有任何变化。
我在这里和其他地方查看了无数票证,none 尽管有很多配置摆弄,但解决方案仍然有效。
我试过的
为了这张票和测试的目的,我创建了一个完整的 'virgin' docker 项目,其中包含一个包含站点配置的 default.conf
文件和一个包含站点配置的 public/
文件夹index.html
和 test-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