我们正在寻找一种将Apache DocumentRoot指向符号链接的方法。例如DocumentRoot /var/www/html/finalbuild
finalbuild应该指向/home/user/build3 3这样的文件夹。
当我们将一个新构建移动到/home/user/ build 4时,我们希望使用一个shell脚本,该脚本将符号链接"finalebuild“更改为这个新目录/home/user/build 4,并进行apache优雅的重新启动,使一个新的web应用程序版本启动和运行时风险很小。
创建此符号链接并在使用shell脚本之后更改该链接的最佳方法是什么?
发布于 2012-01-12 06:22:43
我们用卡皮斯特拉诺来使用类似的装置。然而,我们遇到了一些问题:
切换到安装之后,事情似乎进展顺利,但是我们开始注意到,在运行cap deploy之后,即使符号链接被更改为指向头版本,浏览器仍然会显示旧页面,即使经过多次刷新和附加不同的GET参数。
起初,我们认为这是浏览器缓存,所以在开发中,我们通过HTTP头禁用了浏览器缓存,但这并没有改变任何事情。然后我检查了一下,以确保我们没有做全页缓存服务器端,但是我注意到,如果我删除了符号链接所指向的修订版中的一个文件,我们就会得到404,所以Apache提供了新的页面,但是它仍然遵循“旧符号链接”,并从错误的目录中为页面提供服务。
这是在共享主机上,所以我无法重新启动Apache。所以我试着删除符号链接,每次创建一个新的链接。这似乎有时起作用,但不可靠。它可能在25%~50%的时间内起作用。
最后,我发现如果我:
它将使docroot大部分时间都被正确地更新。但是,即使这样也不完美,而且大约有2-5%的时间,当部署脚本在重命名旧符号链接后立即运行wget来获取页面时,它将返回旧页而不是404。
看起来,Apache不是在缓存文件系统,就是在Apache从磁盘上的文件系统读取时,mv命令只改变了内存中的文件系统(实际上没有任何意义)。在这两种情况下,我都建议在符号链接更改后运行sync,这将使磁盘上的文件系统与内存保持同步,也许轻微的延迟也会帮助wget返回404。
发布于 2010-11-17 01:54:07
我在生产中使用过符号链接作为,不需要优雅地重新启动。一般来说,这个想法应该可行。403错误可能表示与符号链接更改无关的权限错误。您想要添加的一个额外的皱纹是使符号开关原子化,因此符号链接始终存在。也就是说,在任何时候,符号联系都是不存在的,哪怕是一瞬间。
这个问题的解决方案是通过创建一个新的符号链接,然后在旧的符号链接上重命名它来实现更改。在类似Unix的系统上,重命名是一种原子操作,因此符号“change”也是原子的。手工操作的过程如下:
$ ln -s new current_tmp && mv -Tf current_tmp currenthttps://stackoverflow.com/questions/2953517
复制相似问题