Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将apache documentRoot设置为symlink(便于部署)_Apache_Shell_Symlink - Fatal编程技术网

将apache documentRoot设置为symlink(便于部署)

将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应用程序版本在风险很小的情况下启动并

我们正在寻找将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%的时间内起作用

最终,我发现如果我:

  • 删除现有符号链接(删除或重命名)
  • 发出页面请求,导致Apache尝试解析符号链接,但发现它丢失(导致404错误)
  • 然后创建一个指向新目录的新符号链接
  • 这将导致docroot在大多数情况下得到正确更新。然而,即使这样也不是完美的,大约有2-5%的时间,当部署脚本在重命名旧符号链接后立即运行
    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