【问题标题】:Prevent downtime using lftp mirror使用 lftp 镜像防止停机
【发布时间】:2016-11-26 03:32:26
【问题描述】:

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

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

它工作得很好,但我不喜欢因为我的网站上缺少文件而出现停机/临时 PHP 解析错误。解决该问题的最佳方法是什么?


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


我的第二种方法是使用“镜像构建临时”来使用临时文件夹,然后用它替换根目录。这里的问题是,我无法在删除 rm -rf * 等旧文件和文件夹时排除临时文件夹。

【问题讨论】:

  • 您尝试过 xfer:use-temp-file 设置吗?
  • 你有没有访问web根目录的父目录?
  • 临时文件设置不适用于目录。我无法访问父目录,我的想法是为每个 cronjob 单独访问 - 授予对父目录的访问权限可能会解决我的问题,但 ftp 用户确实可以访问其他项目。

标签: deployment lftp


【解决方案1】:

对于不涉及添加/删除 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

【讨论】:

    【解决方案2】:

    最后,

    我写了一个很小的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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 2012-03-25
      • 2012-12-17
      • 1970-01-01
      相关资源
      最近更新 更多