使用lftp镜像防止停机

时间:2016-11-26 03:32:27

标签: deployment lftp

我使用lftp通过Travis CI部署网站。在部署之前有一个构建过程,因此存在构建目录并将其推送到ftp服务器的根目录。

lftp $FTP_URL -e "glob -d mirror build . --reverse --delete-first --parallel=10 && exit"

它工作得很好,但由于我的网站上缺少文件,我不喜欢有停机/临时PHP解析错误。解决这个问题的最佳方法是什么?

我的第一种方法是设置临时目录的选项,但是lftp手册页说明只有临时文件的选项。我仍然尝试了这个选项,但它没有帮助。

我的第二种方法是使用"镜像构建温度"使用临时文件夹,然后用它替换root。这里的问题是,在删除旧文件和文件夹(如rm -rf *)时,我无法排除临时文件夹。

2 个答案:

答案 0 :(得分:2)

对于不涉及添加/删除php文件的小更改set xfer:use-temp-file应该足够了。也不要使用--remove-first,因为它会导致lftp在上传之前删除过时的文件。

对于更大的更改,我为网站的每个版本创建一个单独的目录,并使用.htaccess mod_rewrite或其他配置文件将Web服务器重定向到目录。这种技术将允许原子切换到新版本(如果需要,可以返回)。此外,如果您根据您的IP地址或使用其他规则有条件地重定向到新版本,您将能够对新版本进行最终的预生产测试。

如果您不想为每个新版本重新上传整个网站,并且FTP服务器支持FXP,那么您可以使用mirror old_directory ftp://user@example.com/new_directory将旧版本复制到新目录,然后使用mirror -eR local_dir new_directory更新新目录。

答案 1 :(得分:0)

最后,

我写了一个很小的Grunt plugin,可以很好地处理lftp操作,并有助于处理文件和目录。

这是一个零市中心模式-每个占位符将被自动替换:

command:
[
    'mirror {SOURCE} {TARGET}-new-{TIMESTAMP} --reverse --delete-first',
    'mv {TARGET} {TARGET}-old-{TIMESTAMP}',
    'mv {TARGET}-new-{TIMESTAMP} {TARGET}',
    'rm -rf {TARGET}-old-{TIMESTAMP}',
    'exit'
]

这将是Vanilla lftp命令-记住手动替换每个占位符:

lftp $FTP_URL -e "mirror {SOURCE} {TARGET}-new-{TIMESTAMP} --reverse --delete-first; mv {TARGET} {TARGET}-old-{TIMESTAMP}; mv {TARGET}-new-{TIMESTAMP} {TARGET}; rm -rf {TARGET}-old-{TIMESTAMP}; exit"
相关问题