我们用卡皮斯特拉诺用于网站部署,我们的 Apache 文档根目录是指向特定代码版本的符号链接。部署过程将符号链接从旧版本切换到新版本,这是部署的最后一步。
我们正在将我们的 Web 服务器从运行 RHEL 5.6 的真实服务器迁移到运行 Ubuntu 11.10 的 Amazon EC2 虚拟机,新服务器遇到了一个问题,即切换符号链接时 Apache 无法立即注意到其文档根目录的更改。这可能需要一秒钟左右的时间(我想我甚至见过它需要几分钟)这有点像 Apache 已经缓存了符号链接的物理路径一段时间。
是否有人知道我可以查看的一些 Apache 设置,以使其更快地“扫描”其所提供文件的更改。
想法:
- 我读到虚拟机上的磁盘是很多速度较慢(因为它们是网络附加存储)。也许文件系统缓存的工作方式也不同?如果是这样,有什么可以做的吗?
- 该网站运行 PHP 代码。也许 RHEL 和 Ubuntu 之间的 PHP 配置存在一些差异?我检查了一下
realpath_cache_ttl
,但两个服务器都将其注释掉了:
例如
; Duration of time, in seconds for which to cache realpath information for a given
; file or directory. For systems with rarely changing files, consider increasing this
; value.
; http://www.php.net/manual/en/ini.core.php#ini.realpath-cache-ttl
;realpath_cache_ttl = 120
- 我们确实使用了 APC 操作码缓存,但经过实验,我们认为这不是问题所在。PHP 代码在每个部署中位于不同的文件路径中,我们确保
stat=1
。 - 这是一个类似的问题,非常有趣:294107- 但没有给我提供答案。
- 一种解决方案是每次修改文档根符号链接时重新加载 Apache。如果我们找不到其他解决方案,我会这样做。
答案1
如果是 EBS 支持的图像,请注意 Amazon 在后台使用了一些非常激进的缓存(即您的设置毫无意义),以使 EBS 性能大致达到常见读取任务的水平。写入磁盘的速度较慢。
我已经取得了一些成功<command to modify disk> && sync
。因此,亚马逊可能正在捕获同步系统调用并强制 EBS 也进行同步。或者可能是同步的自然行为加速了该过程(即将内存中的更改推送到文件系统也会立即启动 EBS)。不幸的是,亚马逊并没有特别公开他们的 EBS 技术。
如果问题确实出在 Apache 上,则您无需指定是否正在采取任何措施来提醒 Apache 注意……“apachectl -k graceful”将告诉每个工作线程完成其正在执行的操作并退出,然后启动一个新线程来替换它,理论上是没有缓存内容的线程。(我怀疑符号链接的目标是否由 Apache 缓存,它可能缓存在进程的文件描述符表中;sync
应该可以解决这个问题。)