Skip to content

优化网站性能:正确配置 Nginx MIME 类型和 gzip 压缩

在今天的博客中,我将分享我是如何解决一个关于 Nginx gzip 配置的棘手问题。这个问题最初是通过使用 Lighthouse 进行网站性能分析时发现的。

Lighthouse 提示我可以通过使用 gzip 来加快网站资源的传输速度。这让我感到困惑,因为我确信我的 Nginx 服务器已经启用了 gzip 压缩。 登录到服务器后,我开始检查 Nginx 的配置文件。我发现虽然 gzip 是启用的,但是一些关键的 gzip 配置指令,如 gzip_varygzip_proxiedgzip_comp_levelgzip_buffersgzip_http_versiongzip_types,都是被注释掉的,这意味着它们并没有生效。

这解释了为什么我的网站上一部分资源有 Content-Encoding: gzip 头,而另一部分资源没有。显然,只有默认启用的 gzip 压缩在起作用,而没有针对特定类型的资源进行配置。

为了解决这个问题,我采取了以下步骤:

  1. 取消注释 gzip 配置指令:我首先取消了 gzip_vary、gzip_proxied、gzip_comp_level、gzip_buffers、gzip_http_version 和 gzip_types 的注释,这样它们就会生效。
  2. 调整 gzip_types:我检查了 gzip_types 指令,确保它包含了所有我应该压缩的资源类型。我添加了常见的文本和脚本类型,例如 text/plain、text/css、application/json、application/javascript 等。
  3. 重新加载 Nginx 配置:为了让更改生效,我重新加载了 Nginx 的配置文件。

重新测试:我使用 Lighthouse 再次测试了我的网站,这次所有符合条件的资源都被正确地压缩了,性能得分有了明显的提升。

然而,这又引出了一个新的问题:我注意到我的字体文件(MIME 类型为 application/octet-stream)是否也应该使用 gzip 压缩?

首先,让我澄清一下 MIME 类型。MIME 类型是服务器用来告诉浏览器如何处理文件的机制。对于字体文件,例如 .woff 和 .woff2,它们应该分别使用 font/woff 和 font/woff2 作为其 MIME 类型。

我查阅了 Nginx 的 mime.types 文件,发现 .woff 字体文件被描述为 application/font-woff,这是过时的。根据最新的互联网标准,我们应该将其更新为 font/woff

经过一番调查和考虑,我更新了服务器中 nginx 的 mime.types 文件, 并决定不将这些字体文件包含在 gzip 压缩中,因为它们已经是高度压缩的格式,再次压缩可能不会带来显著的好处,反而可能增加服务器的负担。

总结一下,通过仔细检查和调整 Nginx 的 gzip 配置,我能够确保我的网站资源得到正确的压缩,从而提高了性能和用户体验。这个经验提醒我,定期检查和优化服务器配置对于保持网站的最佳性能至关重要。希望这篇博客对您有所帮助!

命令说明
gzip_vary on;这个指令告诉 Nginx 在响应头中添加 Vary: Accept-Encoding,表明响应内容会根据请求头中的 Accept-Encoding 字段来变化。这对于缓存代理服务器很重要,因为它们需要知道何时提供 gzip 压缩的响应。
gzip_proxied any;这个指令指定了哪些情况下对代理请求的响应进行 gzip 压缩。any 参数意味着对所有代理请求都进行压缩,无论请求头中是否包含 Accept-Encoding 字段。
gzip_comp_level 6;这个指令设置了 gzip 压缩的级别,范围是 1 到 9(9 是最高压缩率,也是最消耗 CPU 资源的)。6 是一个平衡点,提供了不错的压缩率而不会过度消耗服务源。
gzip_buffers 16 8k;这个指令设置了用于压缩的缓冲区数量和大小。16 表示缓冲区的数量,8k 表示每个缓冲区的大小。这有助于控制 Nginx 在压缩数据时使用的内存量。
gzip_http_version 1.1;这个指令指定了使用 gzip 压缩的最低 HTTP 版本。将此设置为 1.1 意味着只有 HTTP/1.1 及以上的请求才会被压缩。
gzip_types这个指令指定了哪些 MIME 类型的响应将使用 gzip 压缩。列表中的每个类型都表示一种内容类型,Nginx 将对这些类型的响应进行压缩。