我有一个很大的(几兆字节)XML 文件,更新频率相当高(每 10 分钟或更短),流量很大。我想实现一些缓存来减少带宽和服务器负载。查看 Apache 文档,我看到了令人眼花缭乱的配置选项,涉及 mod_expires、mod_headers 和 mod_cache(及其变体)的各种组合。我最终陷入了困境,结果并不是我所期望的。
如果我知道应该更改什么,我可以轻松地编辑各种配置文件。但目前我正在黑暗中摸索,这种感觉总是不舒服。所以,也许如果我描述我想要什么,这里的某个人可以牵着我的手说:“这就是你需要做的。”
该文件名为“stuff.xml”,会定期更新,并将新版本复制到目录中。外部 URL 可以是,例如,http://example.com/stuff.xml。明白了,这部分工作正常。每当我请求文件时,我都会得到预期的结果。但是文件很大,我想节省带宽,所以首先我想使用 If-Modified-Since 标头实现条件 GET 语义。我该怎么做?我已启用 mod_headers 和 mod_expired 并<FilesMatching>
在我的 httpd.conf 中添加了该部分,正如我在网上看到的无数示例中所建议的那样,但这并没有改变发出条件 GET 请求时的行为。我总是得到整个文档的状态 200。那么我到底该如何实现呢?
这会减少不必要的传输。我还想限制传输的数据量。鉴于这是 XML,对其进行 gzip 压缩应该可以节省 50% 或更多。我的下一步是以某种方式对文件进行 gzip 压缩,如果不太困难的话,将其存储在内存中。这将减少每次访问的数据传输,并减少磁盘传输。那么我该如何实现这种类型的缓存?
提前致谢。
答案1
我已经使用设置缓存mod_expires,在 <VirtualHost> 定义中
ExpiresActive on
ExpiresByType text/xml "modified plus 5 minutes"
您可以使用以下方式设置压缩mod_deflate
SetOutputFilter DEFLATE
AddOutputFilterByType DEFLATE text/xml
答案2
至于为什么 If-Modified-Since 不起作用,我认为你应该发布配置的相关部分(我假设你已经重新启动了 Apache)。你可能还想快速解析日志以查看同一 IP(可能是同一用户)是否多次获取该 XML 文件。如果每次总是或大部分都是新用户,则客户端缓存将无助于减少服务器的负载。
对于压缩,您需要研究mod_deflate 和/或 mod_gzip。 这里是 Linux Journal 上的一个较旧的比较版。
对于内存缓存,我认为如果访问量足够大,值得缓存,那么操作系统可能已经缓存了它。如果你没有 IO 问题或文件延迟严重,我会相信操作系统会做好它的工作。