我设置了一个小型的LAMP虚拟机用于PHP开发。
它工作正常,但当磁盘上已提供的图像被修改,然后再次请求时,仍会提供“旧”图像(我从 apache2 获得 304 Not Modified 答案)。这种缓存行为在服务器上是可取的,但在经常编辑文件的开发环境中却很麻烦。
我发现访问新文件内容的唯一(不方便的)方法是:
- 重新启动虚拟机,
- 或发出
sync; echo 3 > /proc/sys/vm/drop_caches
是否有一个 apache 指令可以用来确保 apache 每次请求时都会检查磁盘上的文件是否已更改?
更新:已加载 Apache 模块:
# apache2ctl -t -D DUMP_MODULES 已加载模块: core_module (静态) log_config_module (静态) logio_module (静态) mpm_prefork_module (静态) http_module (静态) so_module (静态) alias_module(共享) auth_basic_module(共享) authn_file_module(共享) authz_default_module(共享) authz_groupfile_module(共享) authz_host_module(共享) authz_user_module(共享) autoindex_module(共享) cgi_module(共享) deflate_module(共享) dir_module(共享) env_module(共享) mime_module(共享) negotiation_module(共享) php5_module(共享) setenvif_module(共享) status_module(共享) 语法正确
编辑:实际上,我的DocumentRoot
存储在共享的 VirtualBox 文件夹中。似乎当文件被覆盖时,virtualbox 模块不会通知 linux 使其缓存无效。因此出现了违反直觉的行为。当我在“常规”linux 目录上执行相同的覆盖操作时,没有发生这样的事情。
答案1
好的,我找到了解释VirtualBox 票证:vboxsf 模块似乎没有实现“sendfile”优化。
在修复此问题之前,一种解决方法是使用此 Apache 指令:
EnableSendfile Off
使用此功能,服务器端图像的变化会被立即考虑。
答案2
由于这只是一个开发服务器,文件经常更改,最简单的解决方案是完全禁用服务器的缓存(或至少禁用负责正在修改的网站的 VirtualHost 的缓存)。您可以使用缓存禁用指令指导mod_cache在 Apache 中处理这个问题。
CacheDisable 指令指示 mod_cache 不要缓存 url-string 或以下的 URL。
CacheDisable /local_files
其他选择包括查看修改磁盘缓存和修改缓存并使用它们来控制服务器上的缓存。您还可以运行缓存清理作为守护进程来控制/限制 mod_disk_cache 使用的磁盘缓存。
更新: 如果未启用 mod_cache,则上述指令将不起作用。这也意味着任何缓存都是在操作系统级别而不是 Apache 上进行的 - 据我所知,只有 mod_cache(使用 mod_mem_cache/mod_disk_cache)或 mod_file_cache 是实现 Apache 缓存的唯一两种方法。您可以通过阅读操作系统缓存部分来了解有关此内容的更多信息Apache 缓存指南。
您还可以查看此问题的答案(在 Linux 上禁用 apache2 的所有磁盘缓存) 也发布在 ServerFault 上。它没有提供在 Linux 级别禁用缓存的方法,但它确实表明您可以不断运行以下命令:
watch -n 1 `sync; echo 3 > /proc/sys/vm/drop_caches`
这可用于清除内存中缓存的所有内容。