Apache会缓存静态文件的gzip版本吗?

9
如果你配置了Apache以启用gzip压缩静态的HTML/CSS/JS等文件,它会自动输出一个gzipped版本给任何发送适当的Accept-Encoding请求头的客户端。(对于其他客户端,它只会发送未压缩的原始文件。)
我的问题是:Apache是否每次被gzip接受的客户端请求时都重新压缩原始文件?还是只有在注意到文件的最后修改时间已更改时才重新压缩?
如果它确实缓存了您的文件的gzipped副本,那么这个缓存存储在哪里?

除非您的服务器无法处理请求,否则不必担心它。 - mikerobi
http://www.schroepl.net/projekte/mod_gzip/cache.htm - silex
3个回答

4

不,它不会缓存经过gzip压缩的文件。

然而,压缩文件的代价要比通过网络传输额外的数据包的代价更小,因此即使没有缓存,您的服务器上的总体CPU使用率(以及内存使用率和上下文切换次数)都会降低,并且客户端会得到更快的响应。

请注意,压缩后的文件不会存储在临时文件夹中--mod_deflate将输入读入到内存中的固定大小缓冲区中--当缓冲区已满(或流结束)时,内容被压缩并返回给Web服务器。

如果内容在服务器端预先压缩或缓存,则使用的CPU甚至更少(尽管速度不会明显提高)。这可以通过多种方式实现--mod_rewrite可以测试filename.gz的存在并将其替换为filename,或者您可以使用反向代理(假设内容还通过缓存指令提供)。


使用mod_deflate会存在一个权衡,即服务器的CPU使用率和带宽节省之间的平衡。这篇文章虽然有些陈旧,但非常清楚地阐述了这一点:http://www.webperformance.com/library/reports/moddeflate/。 - QuadrupleA
不,这并不是一个权衡——正如我在回答中所指出的,压缩数据需要的CPU周期和上下文切换比处理额外数据的传输要少。虽然你提供的文章很有趣,但它的方法和分析还有一定的局限性。 - symcbean
2
你是如何得出结论,认为没有权衡?这个回答只是陈述了它是真实的,没有任何背景信息。你可能是对的,但我想这取决于特定的硬件配置等因素。我很想看到任何性能测试结果的链接。 - QuadrupleA

3
不,它并不会。现在 mod_deflate 的文档中已经 描述

由于 mod_deflate 每次请求都重新压缩内容,因此可以通过预先压缩内容并告诉 mod_deflate 在不重新压缩的情况下提供服务来获得一些性能上的好处。


0

Apache不会保留任何缓存文件。它只会保留您告诉它要保留的文件。以下是压缩的工作原理:

  1. 浏览器请求页面并声明接受压缩
  2. 服务器查找页面并读取请求的标头。
  3. 服务器将页面发送到浏览器(如果在标头请求中声明接受压缩,则进行压缩-压缩文件存储在内存/临时文件夹中)
  4. 浏览器接收信息并显示(如果已压缩,则解压缩后)。然后,浏览器缓存页面和图像。
  5. 服务器从内存/临时文件夹中删除任何压缩文件的痕迹,以释放空间供下一个请求使用。它会在access_log中记录交易。

当浏览器再次请求相同的文件或页面时,它会向服务器发送一个请求,声明它接受压缩,并提供当前文件和修改日期。从这里开始,服务器将响应它们是相同的并且不发送其他信息,或者根据修改日期仅发送更改的文件。


你有关于它在请求后直接删除gzipped版本的信息参考吗?它似乎有点疯狂,因为它会为每个完整请求重复压缩相同的静态文件。我知道If-Modified-Since请求可以减少这种情况发生的次数,但如果只是提供静态文件,则至少每个客户端都需要发生一次,这是不必要的。 - callum
压缩版本存储在缓存/内存中。以前有一种方法可以使用Apache 1.3中的mod_gzip,对文件进行预压缩和多视图处理,但是自从那时以来就没有再查看过了。我运行多个专用服务器,实际上没有看到任何压缩版本存储在服务器上。http://httpd.apache.org/docs/2.2/mod/mod_deflate.html 显示如何更改内存限制。 - James Williams
mod_deflate 现在是标准,更加用户友好。此外,使用预压缩文件后,您需要在更新或定期基础上重新压缩文件以保持最新状态。 - James Williams
既不使用文件的是mod_deflate也不是mod_gzip。 - symcbean

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接