我如何防止lighttpd缓存静态文件,即使在磁盘上进行了修改也是如此?


10

我正在使用lighttpd提供静态文件。我在定期更新的目录中有一堆图像。这将更改文件内容(和文件大小)以及修改日期,但不会更改文件名。

当我通过http访问文件时,不会考虑更新,因此lighty服务于旧文件。我可以手动将文件重命名为其他名称,然后lighttpd将返回404错误,如果重新命名文件,则将获得正确的更新版本。似乎lightty正在使用自己的某种缓存机制(很好)来返回静态文件。不幸的是,似乎在修改文件时该机制不会自我更新。

我通过Wireshark进行了检查,并且我的浏览器确实在对文件进行请求,这不是浏览器缓存问题。从空缓存中请求时,它返回200 OK,否则按预期返回304 Not Modified。但是,该文件返回的错误的Last-Modified标头不能反映实际的最后修改日期。

也许有一些我不知道的配置指令?

我希望lighty返回的文件能够直接反映磁盘上所做的更改,或者至少能够使其缓存无效。

以下问题的任何人的更新:我找到了罪魁祸首。如果我更新静态文件,Lighty不会返回新内容,但是会在其标头中返回新的Content-Length,从而导致显示垃圾内容。如果我使用mod_compress压缩文件,则问题会消失,因为mod_compress使用其自己的缓存系统。不幸的是,我无法压缩所有文件(例如图像文件)。因此,这只是部分修复,但我稍后会再进行讨论,并乐于找到解决方案。

Answers:


6

我终于找到了问题。它来自VirtualBox。

在主机(Win)中编辑文件时,来宾(Linux)中的lighttpd不能正确更新文件内容(但可以正确更新文件大小),因此返回裁剪或乱码的内容。

卸载共享驱动器并重新安装它们,或直接在guest虚拟机中编辑文件,解决了此问题。

我花了6个月才终于弄清楚这一点。


3

您没有提到是否已安装mod_cache?安装后,该模块默认为“已启用”。

我不愿意提出建议,但是启用Etags是否有帮助?


未安装mod_cache。启用了ETag(但不使用inode来生成ETag)。我尝试启用inode或禁用ETag,但无济于事。
Pixelastic 2011年

2

尝试将统计引擎缓存设置为“禁用”:

server.stat-cache-engine = "disable'

谢谢,但这没有效果。但是,我不知道该指令,以后可能会派上用场。
Pixelastic 2011年

您和服务器之间可能存在中间人代理?尝试重新启动服务器并访问相同的文件。您在使用mod_compress吗?
Aleksey Korzun

我正在Windows 7主机中运行Ubuntu VM。Lighty在VM中。我认为这里可能没有代理问题。我已经重新启动了服务器,但这不能清除轻微的缓存。我正在使用mod_compress,但未在这些文件上使用。我将尝试重新启动整个VM并禁用mod_compress,以查看它是否有任何更改。感谢您的想法。
Pixelastic 2011年

嗯,我这里可能有东西。如果将文件更改为较小的文件(但保持相同的名称),则只会得到文件的前半部分。似乎旧文件显示的是当前文件的内容长度。如果我替换为更大的文件,则会显示整个(旧)文件。似乎考虑了文件大小更改,但未考虑文件内容。
Pixelastic 2011年

很抱歉发送垃圾短信:禁用mod_compress不会更改任何内容,也不会重新启动整个VM。
Pixelastic 2011年

2

这个lighttpd选项对我有用

server.network-backend = "writev" 

在Debian桌面上的Debian VM上,对我而言就像是一种魅力。谢谢!
伊万2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.