将apache documentRoot设置为symlink(便于部署)
我们正在寻找将Apache DocumentRoot指向符号链接的方法。 例如DocumentRoot/var/www/html/finalbuild finalbuild应该指向像/home/user/build3这样的文件夹 当我们将一个新的构建移动到/home/user/build4时,我们希望使用一个shell脚本,将符号链接“finalbuild”更改为这个新目录/home/user/build4,并进行apache优雅的重新启动,以使一个新的web应用程序版本在风险很小的情况下启动并运行将apache documentRoot设置为symlink(便于部署),apache,shell,symlink,Apache,Shell,Symlink,我们正在寻找将Apache DocumentRoot指向符号链接的方法。 例如DocumentRoot/var/www/html/finalbuild finalbuild应该指向像/home/user/build3这样的文件夹 当我们将一个新的构建移动到/home/user/build4时,我们希望使用一个shell脚本,将符号链接“finalbuild”更改为这个新目录/home/user/build4,并进行apache优雅的重新启动,以使一个新的web应用程序版本在风险很小的情况下启动并
创建此符号链接并在以后使用shell脚本更改此链接的最佳方法是什么?我在生产中使用了符号链接作为apache DocumentRoot,无需重新启动。总的来说,这个想法应该行得通。403错误可能表示与符号链接更改无关的权限错误。您希望添加的额外褶皱是,符号链接始终存在。也就是说,符号链接在任何时候都不存在,哪怕是一瞬间 此问题的解决方案是通过创建一个新的符号链接,然后在旧的符号链接上对其进行重命名来实现更改。在类Unix系统上,重命名是一种原子操作,因此符号链接“更改”也将是原子操作。手工操作的过程如下所示:
我们正在使用capistrano来采用类似的设置。但是,我们遇到了一些问题: 切换到设置后,事情似乎进展顺利,但我们开始注意到,在运行
cap deploy
后,即使符号链接已更改为指向头部修订,浏览器仍会显示旧页面,即使在多次刷新和附加不同的GET参数后也是如此
起初,我们认为这是浏览器缓存,所以在开发中我们禁用了通过HTTP头的浏览器缓存,但这并没有改变任何事情。然后我检查以确保我们没有在服务器端进行完整页面缓存,我们没有。但我随后注意到,如果我删除了符号链接所指向的版本中的一个文件,我们将得到一个404,因此Apache提供了新页面,但它仍然遵循“旧符号链接”,并从错误的目录提供页面
这是在共享主机上,所以我无法重新启动Apache。因此,我尝试删除符号链接并每次创建一个新的符号链接。这似乎有时奏效,但并不可靠。它可能在25~50%的时间内起作用
最终,我发现如果我:
wget
获取页面时,它会返回旧页面,而不是404
似乎Apache正在缓存文件系统,或者,
mv
命令仅在Apache从磁盘上的文件系统读取时更改了内存中的文件系统(实际上没有任何意义)。在任何一种情况下,我都接受了某人的建议,在符号链接更改后运行sync
,这将使磁盘上的文件系统与内存同步,也许稍微的延迟也会帮助wget
返回404。我在想“rm/var/www/html/finalbuild&&ln-s/home/user/build4/var/www/html/finalbuild”. 您甚至可能不需要重新启动Apache。谢谢,我已经更改了docroot并将其指向一个符号链接,但Apache似乎没有在侦听。。。我成功地重新启动了apache,有什么想法吗?我也一直在试图找到答案。Apache只是给了我一个403错误。到目前为止运气不好。大概是因为在生产中这样做是不好的做法。不过,我只是想在我的开发盒上做这件事。为了反驳我自己,我看到了这个链接,它遇到了一些问题:如果有人理解这种行为背后的原因,那么将其记录下来会很好。
$ ln -s new current_tmp && mv -Tf current_tmp current