我们正在寻找一种方法将Apache DocumentRoot指向符号链接。 例如。 DocumentRoot / var / www / html / finalbuild
finalbuild应该指向某个文件夹,例如/ home / user / build3
当我们将新构建移动到/ home / user / build4时,我们想要使用一个shell脚本将符号链接“finalebuild”更改为这个新目录/ home / user / build4并执行apache graceful restart以获得新的Web应用程序版本启动并运行时风险很小。
创建此符号链接以及之后使用shell脚本更改此链接的最佳方法是什么?
答案 0 :(得分:7)
我们正在使用capistrano采用类似的设置。但是,我们遇到了一些问题:
切换到设置后,事情看起来很顺利,但后来我们开始注意到在运行cap deploy
之后,即使符号链接已经更改为指向头版本,浏览器仍会显示旧页面,即使经过多次刷新并附加不同的GET参数。
起初,我们认为这是浏览器缓存,因此对于开发,我们通过HTTP标头禁用了浏览器缓存,但这并没有改变任何东西。然后我检查确保我们没有在服务器端进行整页缓存,而我们没有。但后来我注意到,如果我删除了修订版中的符号链接指向的文件,我们会得到一个404,所以Apache正在提供新的页面,但它仍然遵循“旧的符号链接”并提供从错误的目录。
这是在共享主机上,所以我无法重启Apache。所以我尝试删除符号链接并每次创建一个新符号链接。这似乎有时,但不可靠。它的工作时间大概是25%到50%。
最终,我发现如果我:
它会导致docroot在大多数情况下正确更新。然而,即使这不是完美的,并且大约2-5%的时间,当部署脚本在重命名旧的符号链接后立即运行wget
来获取页面时,它将返回旧页面而不是404
似乎Apache正在缓存文件系统,或者mv
命令只是在Apache从磁盘上的文件系统读取时才改变了内存中的文件系统(实际上没有任何意义)。在任何一种情况下,我都会建议在符号链接更改后运行sync
,这应该让磁盘上的文件系统与内存同步,也许稍微延迟也会帮助wget
返回404。
答案 1 :(得分:3)
我在生产中使用了符号链接作为apache DocumentRoot,无需正常重启。一般来说,这个想法应该有效。 403错误可能表示与符号链接更改无关的权限错误。您想要添加的附加皱纹是making the symlink switch atomic,因此符号链接始终存在。也就是说,在任何时候,符号链接都不存在,即使是片刻。
此问题的解决方案是通过创建新的符号链接然后在旧的符号链接上重命名来实现更改。在类Unix系统上,重命名是一种原子操作,因此符号链接“更改”也是原子操作。手动,过程如下:
$ ln -s new current_tmp && mv -Tf current_tmp current