2010-06-01 68 views
9

我们正在寻找一种方法将我们的Apache DocumentRoot指向符号链接。 例如的DocumentRoot在/ var/www/html等/ finalbuild将apache documentRoot设置为符号链接(便于部署)

finalbuild应指向一个文件夹类似的地方/家庭/用户/ build3中

当我们进入一个新的版本到/ home /用户/ build4中,我们想用一个shell脚本将符号链接“finalebuild”更改为这个新目录/ home/user/build4,并执行apache正常重启以启动并运行新的Web应用程序,风险很小。

什么是最好的方式来创建这个符号链接,并改变这个链接后使用shell脚本?

+1

我'm thinking“rm/var/www/html/finalbuild && ln -s/home/user/build4/var/www/html/finalbuild”。您甚至可能不需要重新启动Apache。 – barrycarter 2010-06-02 17:16:19

+0

谢谢,我已经改变了docroot,并指出它是一个符号链接,但Apache似乎没有听...我已经成功地重新启动了Apache,任何想法? – Jorre 2010-06-03 09:35:43

+0

我也一直在试图为此找到答案。 Apache只是给了我一个403错误。到目前为止没有运气。推测是因为在生产中这样做是不好的做法。只是想在我的开发盒上做到这一点。 – nedned 2010-09-22 05:39:34

回答

3

我已经使用符号链接作为生产中的apache DocumentRoot,并且不需要进行正常的重新启动。总的来说,这个想法应该起作用。 403错误可能表示与符号链接更改无关的权限错误。你想添加的一个额外的皱纹是making the symlink switch atomic,所以符号链接总是存在。也就是说,在任何时候,符号链接都不存在,即使是暂时的。

此问题的解决方案是通过创建新的符号链接,然后通过旧的符号链接重命名来实现更改。在类Unix系统上,重命名是一个原子操作,因此符号链接“change”也是原子操作。通过手,过程是这样的:

$ ln -s new current_tmp && mv -Tf current_tmp current 
+1

只是为了自相矛盾,我看到这个经历过问题的链接:http://www.mikebrittain.com/blog/2009/05/12/case-against-using-symlinks-for-code-promotion/ – defmikekoh 2010-11-17 01:58:04

7

我们使用Capistrano的采用类似的设置。然而,我们遇到了一些问题:

切换到设置后,事情似乎很好,但后来我们开始注意到,在运行cap deploy后,即使符号链接已被更改为指向头部即使经过多次刷新并附加了不同的GET参数,浏览器仍然会显示旧页面。首先,我们认为它是浏览器缓存,所以对于开发,我们通过HTTP头禁用了浏览器缓存,但是这并没有改变任何东西。然后我检查了一下,以确保我们没有进行整页缓存服务器端,而我们没有。但是我注意到,如果我删除了符号链接指向的修订版本中的文件,我们将得到一个404,所以Apache提供了新的页面,但它仍然遵循“旧符号链接”并从上面提供页面错误的目录。

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

最后,我发现,如果I:

  1. 除去现有符号链接(其删除或重命名它);
  2. 提出页面请求,从而导致Apache将试图解析符号链接,但发现它失踪(导致404)
  3. 然后创建一个新的符号链接到新目录

它会导致文档根目录到大部分时间都会更新。但是,即使这不是完美的,大约有2-5%的时间,当部署脚本运行wget在重命名旧符号链接后立即获取页面时,它将返回旧页面而不是404页面。

Apache似乎在缓存文件系统,或者当Apache从磁盘上的文件系统读取时(也许没有任何意义),mv命令可能只改变了内存中的文件系统。在任何情况下,我已经采取了别人的建议,运行符号链接更改后sync,它应该得到的文件系统上的磁盘同步记忆,也许是轻微的延迟也将有助于wget返回一个404

+2

如果有人理解这种行为背后的原因记录它会很棒。 – ThorSummoner 2014-11-20 00:11:56