问题
我已经快要绝望了,所以决定发布一个询问。我正在尝试在 nginx docker 容器上设置 gzip 压缩,因为我注意到 Lighthouse 抱怨我的一些客户站点没有启用它。所有有问题的站点都在它们的配置中添加了正确的设置和类型的 gzip 压缩设置,但无论我如何更改设置,它都不会压缩。我已经通过浏览器和使用 CURL 请求来测试过这个问题,但是没有任何变化。
我查看了许多票据,包括这里和其他地方的票据,尽管对配置进行了很多调整,但没有解决方案起作用。
我尝试过的方法
出于此票证和测试目的,我创建了一个完全“原始”的 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/
Dockerfile
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时,打开开发选项卡并查看index.html时,可以发现它正在使用gzip压缩进行服务:
现在如果我们查看test-css.css
文件,我们会发现它没有被压缩:
通过控制台进行测试
因此,在进行一些研究后,似乎有时Chrome或各种Windows杀毒软件会在到达浏览器之前对其进行解压缩。因此,我尝试使用curl从Linux虚拟机中获取带有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镜像(我的项目在alpine上运行,所以认为可能是一个因素),但结果始终如一。
客户端nginx配置示例
以下是从客户网站复制/粘贴的当前配置示例:
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;
参考票据
我查看了许多票据,但这是我仍然在浏览器中打开的三个最近的票据: