设置细节:
我有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
之后,我不做任何reload或restart的Apache。
今天就是我刚刚经历的另一个版本:
1.2.42版本升级到1.2.43 42 F5 – 仍然是42 。 42和43随机出现。 大约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。 这是一个很小的脚本,可以执行以下操作:
KeepAlive apache reload KeepAlive并再次重新加载apache