【问题标题】:Amazon EFS: Changing Wordpress upload directory to outside rootAmazon EFS:将 Wordpress 上传目录更改为外部根目录
【发布时间】:2018-01-30 05:47:32
【问题描述】:

我有多个 AWS EC2 实例,这些实例是通过 CodeDeploy 从 Git 存储库更新的。但是,由于将 wp-content/uploads 文件夹保存在 Git 中很麻烦且难以维护,因此我尝试将所有上传内容移至已作为 EFS 文件系统挂载的目录。这样我应该能够在多个 EC2 实例之间共享上传。

但是,现在我遇到了一个新问题;我无法将 WP 上传文件夹设置在 WP 根目录之外。

WordPress 位于/opt/bitnami/apps/wordpress/htdocs,这也是我们的域指向的地方。 EFS 系统挂载到/home/bitnami/efs。由于 EFS 目录位于 WP 根目录之外,因此我无法链接到它。

我已经使用符号链接将默认的wp-content/uploads 文件夹指向我想要的路径来实现这一点;但是,这并不能真正解决我的问题,因为我不能依赖符号链接在 CodeDeploy 部署期间不被覆盖。

所以我的问题如下:

  1. 是否可以在不使用符号链接的情况下进行此设置,这样我就可以进行部署而不用担心上传会受到影响?

  2. 如果符号链接是完成这项工作的唯一/最佳方法,是否有任何方法可以将符号链接添加到 git 存储库,或任何其他方法来确保它在 CodeDeploy 部署期间持续存在?

【问题讨论】:

    标签: wordpress amazon-ec2 aws-code-deploy amazon-efs


    【解决方案1】:

    您可以直接将 EFS 挂载到 /opt/bitnami/apps/wordpress/htdocs/wp-content/uploads 以避免符号链接。

    在你的appspec.yml 添加两个钩子:

    hooks:
        BeforeInstall:
          - location: /deploy/BeforeInstall.sh
            timeout: 3000
            runas: root
        AfterInstall:
          - location: /deploy/AfterInstall.sh
            timeout: 3000
            runas: root
    

    然后创建目录deploy并在其中创建两个文件BeforeInstall.shAfterInstall.sh

    BeforeInstall.sh 卸载 EFS(如果已安装)

    #!/bin/bash
    if mount | grep /opt/bitnami/apps/wordpress/htdocs/wp-content/uploads > /dev/null; then
        sudo umount /opt/bitnami/apps/wordpress/htdocs/wp-content/uploads
    fi
    

    然后部署后通过AfterInstall.sh再次挂载EFS

    #!/bin/bash
    sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-fxxxxxx.efs.us-west-2.amazonaws.com:/ /opt/bitnami/apps/wordpress/htdocs/wp-content/uploads
    

    注意:您还可以挂载整个wp-contents 目录,而不仅仅是uploads 文件夹,这样themesplugins 中的更新也会自动反映在其他EC2 中。

    此外,符号链接是一个更好的解决方案,因此如果umount 失败,您不必担心在部署期间意外删除 EFS 挂载。您可以在部署后使用 AfterInstall 钩子再次重新创建符号链接,并在文件 AfterInstall.sh 中添加代码

    #!/bin/bash
    ln -s /home/bitnami/efs /opt/bitnami/apps/wordpress/htdocs/wp-content/uploads
    

    【讨论】:

    • 谢谢!您的最后一个代码示例实际上与我最终所做的非常接近。出于某种原因,CodeDeploy 似乎有时会在部署前清空目录,有时会跳过该步骤。因此,如果在尝试部署期间符号链接仍然存在,AfterInstall.sh 脚本将失败。我通过在创建符号链接时将 -s 标志更改为 -sfn 来解决此问题 - 这样,如果符号链接已经存在,它将简单地重新创建,而不是导致整个部署失败。现在看来我的部署非常安全。感谢您的帮助!
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 2010-11-16
    • 2011-08-24
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-29
    相关资源
    最近更新 更多