将apache documentRoot设置为符号链接(以便于部署)

Jor*_*rre 10 apache shell symlink

我们正在寻找一种方法将Apache DocumentRoot指向符号链接.例如DocumentRoot/var/www/html/finalbuild

finalbuild应指向某个文件夹,如/ home/user/build3

当我们将一个新的构建移动到/ home/user/build4时,我们想要使用一个shell脚本将符号链接"finalebuild"更改为这个新目录/ home/user/build4并执行apache graceful restart以获得一个新的Web应用程序版本启动并运行风险很小.

创建此符号链接以及之后使用shell脚本更改此链接的最佳方法是什么?

Lès*_*sté 7

我们使用capistrano采用类似的设置.但是,我们遇到了一些问题:

切换到设置后,事情看起来很顺利,但后来我们开始注意到,在运行之后cap deploy,即使符号链接已经更改为指向头版本,浏览器仍会显示旧页面,即使在多次刷新和附加不同的GET参数.

起初,我们认为这是浏览器缓存,因此对于开发,我们通过HTTP标头禁用浏览器缓存,但这并没有改变任何东西.然后我检查确保我们没有在服务器端进行整页缓存,而我们没有.但后来我注意到,如果我删除了修订版中的符号链接指向的文件,我们会得到一个404,所以Apache正在提供新的页面,但它仍然遵循"旧的符号链接"并提供从错误的目录.

这是在共享主机上,所以我无法重启Apache.所以我尝试删除符号链接并每次创建一个新符号链接.这似乎有时起作用,但不可靠.它的工作时间大概是25%到50%.

最后,我发现如果我:

  1. 删除了现有的符号链接(删除或重命名);
  2. 发出了页面请求,导致Apache尝试解析符号链接但发现它丢失(导致404)
  3. 然后为新目录创建了一个新的符号链接

它会导致docroot在大多数情况下正确更新.然而,即使这并不完美,大约2-5%的时间,当部署脚本wget在重命名旧的符号链接后立即运行以获取页面时,它将返回旧页面而不是404.

看起来Apache正在缓存文件系统,或者mv当Apache从磁盘上的文件系统读取时,命令可能只更改了内存中的文件系统(实际上没有任何意义).在任何一种情况下,我已经接受了某人建议sync在符号链接更改后运行,这应该使磁盘上的文件系统与内存同步,并且可能稍微延迟也将有助于wget返回404.

  • 如果有人理解这种行为背后的原因那么记录它会很棒. (3认同)

小智 2

我在生产中使用符号链接作为 apache DocumentRoot,无需正常重启。一般来说,这个想法应该可行。403 错误可能表示与符号链接更改无关的权限错误。您想要添加的一个额外问题是使符号链接开关成为原子的,以便符号链接始终存在。也就是说,符号链接在任何时候都不会不存在,哪怕只是片刻。

\n\n
\n

此问题的解决方案是通过创建新的符号链接然后将其重命名为旧的符号链接来实现更改。在类 Unix 系统上,重命名是一个原子操作,因此符号链接 \xe2\x80\x9cchange\xe2\x80\x9d 也将是原子操作。手动来说,该过程如下所示:

\n
\n\n
$ ln -s new current_tmp && mv -Tf current_tmp current\n
Run Code Online (Sandbox Code Playgroud)\n