Apache在某个地方cachingpath,请求以前的文档根目录中的脚本

设置细节:

我有Apache 2.2.14在Ubuntu 10.04下运行。 虚拟主机的文档根目录设置为符号链接。

请求的脚本一目了然:

<?php // other useful stuff here echo 'v1.2.42'; 

所以除了做有用的工作之外,脚本还在页脚中输出它的版本。 该版本在脚本中被硬编码,并被构build脚本修改。

在部署新版本时,文档根目录将使用非常标准的方法切换到新版本:

 ln -s /path/to/app-1.2.43 app-new mv -Tf app-new app # where `app` is the document root 

之后,我不做任何reloadrestart的Apache。

今天就是我刚刚经历的另一个版本:

  1. 我将1.2.42版本升级到1.2.43
  2. 在浏览器中打开应用程序
  3. 底部是42
  4. F5 – 仍然是42
  5. 然后4243随机出现。 大约30秒后,预期的43开始持续显示。

另一台具有类似configuration的服务器的行为完全相同。 似乎有一些不断的超时,直到开始工作正常:-S

更多configuration细节:

apacheconfiguration为通过mpm-prefork运行。 PHP的版本是5.3.2,它被安装为mod_php 。 没有安装任何操作码caching。

任何想法,它可以caching它? apache2 reload 保证这不会发生?

PS:我已经certificate(对我自己), apache reload不会重置该状态和未定义的行为继续。

更新

我发现每个apache工作者都将符号链接扩展到一个文档根目录,成为一个真正的path。

当你执行一个正常的reload命令时,只有备用的工作人员才能重新启动,而忙碌的人员,包括正在进行保持连接的人员,一直保留着,直到他们闲置。 我可以用1名工作人员复制它,它完美地解释了我的观察。

现在的问题是:如何优雅地中断keepalive连接?

有趣的文章阅读主题: https : //blogs.oracle.com/oswald/entry/apache_s_graceful_restart_reprise

这看起来好像是Apache进程正在caching符号链接的结果。 即使是apache重新加载也不能解决您的问题,因为重新加载只是重新读取configuration文件并重新应用新的设置。 它并不实际终止正在运行的进程。

我在想,处理这种情况的最好方法是apache2 restart 。 这可能比您想象的更安全,因为它会阻止新的连接,并允许旧的连接在重新启动之前完整地完成。 在一个温和的Web服务器上,这应该发生在一秒钟之内。 而且由于HTTP是无状态的,用户甚至不会注意到。 如果在重新启动期间尝试启动新连接,则可能半秒钟挂起。

另一种可能是实际上改变你的configuration文件的根目录和你的符号链接的名字,然后做一个apache2 reload 。 然后,它应该检测到新的文档根目录,并强制重新parsing符号链接的引用目录。

我能想到的最后一件事是尝试硬链接。 这将需要不同的工作stream程,以防止覆盖新的应用程序版本。

当设置了Options FollowSymlinks (按devise)时,Apachecachingpath组件中的符号链接( lstat系统调用)。

为了避免caching,你可以尝试保证不cachinglstat调用的Option SymLinksIfOwnerMatch

但是,这需要进行适当的configuration,并且需要测量性能影响。 看到这里

那么,我find了一个适合我的解决scheme。 这是一个很小的脚本,可以执行以下操作:

  1. closuresApacheconfiguration中的KeepAlive
  2. 获取当前工人的PID
  3. 运行apache reload
  4. 等待#2的所有工人退出
  5. 切换符号链接
  6. 打开KeepAlive并再次重新加载apache