【问题标题】:Laravel - AWS Beanstalk - Storage symlink not working (403 error)Laravel - AWS Beanstalk - 存储符号链接不起作用(403 错误)
【发布时间】:2019-09-11 01:14:41
【问题描述】:

我正在使用弹性 beanstalk 来部署我的 laravel 应用程序。除了我的图像之外,一切都运行良好,因为我需要创建一个带有存储的符号链接才能公开访问它。

附注在我的本地工作正常

我的 .ebextensions 文件如下 -

commands:
  composer_update:
    command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update

option_settings:
  - namespace: aws:elasticbeanstalk:application:environment
    option_name: COMPOSER_HOME
    value: /root

container_commands:
  01-install_dependencies:
    command: "php /usr/bin/composer.phar install"
    cwd: "/var/app/ondeck"
  02_storage_sym_link:
    command: "php artisan storage:link"
    cwd: "/var/app/ondeck"
    leader_only: true

以下是我的 ec2 实例的日志,用于确认该命令运行正常且链接已成功创建。

[2019-04-21T15:47:16.899Z] INFO  [21538] - [Application update symlink alt2@208/AppDeployStage0/EbExtensionPostBuild/Infra-EmbeddedPostBuild/postbuild_0_Synchro/Test for Command 02_storage_sym_link] : Starting activity...
[2019-04-21T15:47:16.903Z] INFO  [21538] - [Application update symlink alt2@208/AppDeployStage0/EbExtensionPostBuild/Infra-EmbeddedPostBuild/postbuild_0_Synchro/Test for Command 02_storage_sym_link] : Completed activity. Result:

  Completed successfully.
[2019-04-21T15:47:16.903Z] INFO  [21538] - [Application update symlink alt2@208/AppDeployStage0/EbExtensionPostBuild/Infra-EmbeddedPostBuild/postbuild_0_Synchro/Command 02_storage_sym_link] : Starting activity...
[2019-04-21T15:47:17.014Z] INFO  [21538] - [Application update symlink alt2@208/AppDeployStage0/EbExtensionPostBuild/Infra-EmbeddedPostBuild/postbuild_0_Synchro/Command 02_storage_sym_link] : Completed activity. Result:
  The [public/storage] directory has been linked.

我得到的错误如下,这使得图像无法供公众访问。

Forbidden
You don't have permission to access /storage/blog/images/8Yhb4OZJQIKwlMGaGE803niTxyjfzNSVTj2BiPaP.gif on this server.

感谢任何帮助引导我走上正确道路的人。干杯!


编辑 1:

container_commands:
  01-install_dependencies:
    command: "php /usr/bin/composer.phar install"
    cwd: "/var/app/ondeck"
  02_storage_sym_link:
    command: "ln -s storage/app/public public/storage"
    cwd: "/var/app/ondeck"
  03_give_ec2_user_perm_1:
    command: "sudo chown -R ec2-user /var/app/current"
  03_give_ec2_user_perm_2:
    command: "sudo chmod -R 777 /var/app/current"

尝试手动创建符号链接并授予 ec2 用户权限。 但还是没有运气:(

【问题讨论】:

  • 您是否要检索上传的图片?
  • 是的,我是。我的最终目标是创建一个与存储文件夹的符号链接,以便我可以公开访问我视图中的这些图像。
  • 检查我的答案,这可能会给你一些想法,我以前曾经遇到过,我通过参考文档解决了它,我也添加了链接。
  • @thebrownkid 在 beanstalk 中,您不能更好地使用 S3 来存储文件以及用于存储和图像支持的项目。
  • @PranavanSp 感谢您提出替代解决方法。它完成了工作! 我没有解决 beanstalk 上的 webapp 用户权限问题,而是使用 S3 进行存储。它完成了工作,所以我现在可以跳过符号链接问题。 仍然对我们如何解决与 beanstalk 上的符号链接权限相关的问题感到好奇。如果您对此有任何经验,请分享。

标签: laravel amazon-web-services laravel-5 amazon-ec2 amazon-elastic-beanstalk


【解决方案1】:

放下一个替代选项,它可以为那些/可能有类似问题的人完成这项工作 -

在您的 Laravel 应用程序中使用 S3 进行文件存储。

为了实现它——

  1. 创建一个公共 S3 存储桶。
  2. 创建一个具有完全访问权限的 IAM 用户 S3 存储桶。 (使用访问密钥,应用程序将拥有 在 S3 存储桶中读取和写入的权限。)
  3. 更新配置文件 filesystems.php 以使用 S3 存储桶。 (此配置处理应用程序的存储配置。)

请参阅Laravel Doc 了解更多信息。

感谢@PranavanSp 的建议。

【讨论】:

    【解决方案2】:

    容器命令以 root 身份运行,这就是为什么当您尝试以 ec2-user 身份运行它时无法运行的原因。 ec2-user 不在 root 用户组中。

    然后,当您创建符号链接时,尝试在实际的应用程序目录(当前)中进行:

    container_commands:
      01-install_dependencies:
        command: "php /usr/bin/composer.phar install"
        cwd: "/var/app/ondeck"
      02_storage_sym_link:
        command: "ln -s storage/app/public public/storage"
        cwd: "/var/app/current"
    

    或者尝试直接这样链接:

    container_commands:
      01-install_dependencies:
        command: "php /usr/bin/composer.phar install"
        cwd: "/var/app/ondeck"
      02_storage_sym_link:
        command: "ln -s /var/app/ondeck/storage/app/public  /var/app/current/public/storage"
    

    EBS 文件一开始可能会很烦人,但最终还是值得的。如果这仍然不起作用,则运行服务器的用户(我假设是应用程序)可能无权访问该文件夹。要快速验证这一点,只需执行以下操作:

    sudo chmod -R 755  /var/app/ondeck/storage/app/public
    

    【讨论】:

    • 没错,我也相信相同,但找不到覆盖权限的方法。顺便说一句,我们非常感谢您的帮助,而我在猛烈抨击这一点后得出的结论是,当我们部署应用程序时,首先要在 /var/app/ondeck 上完成,然后我们的所有容器命令都在其上运行。只有在一切准备就绪后,文件才会移动到/var/app/current。因此,基本上在当前运行命令在此阶段根本无济于事,因为该文件夹包含应用程序的先前版本。
    • 嗯,好吧。试一试部署后挂钩,它基本上是一个 bash 脚本,在容器命令和应用程序被复制后运行。我发现这个deliciousbrains.com/… 可能会有所帮助,他们专门为 Laravel 和 AWS EB 做了一个
    • 但是先尝试使用容器命令的权限,找到了 Laravel 和 EB 的示例:github.com/TheDMSGroup/laravel-eb/blob/master/.ebextensions/… 但这可能有点旧
    • 谢谢@DR.,稍后会尝试并更新您。干杯!
    • 当然,我说首先尝试权限的唯一原因是错误 403 表示权限,因此服务器用户可能无法从它尝试读取的文件中读取。如果 403 消失而您得到 404,则可能意味着符号链接不起作用。我就是这样解决这个问题的。
    猜你喜欢
    • 2021-01-28
    • 2018-07-16
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多