将 Laravel 部署到 Elastic Beanstalk:“无法打开流:权限被拒绝”

Posted

技术标签:

【中文标题】将 Laravel 部署到 Elastic Beanstalk:“无法打开流:权限被拒绝”【英文标题】:Deploying Laravel to Elastic Beanstalk: "failed to open stream: Permission denied" 【发布时间】:2021-02-04 20:49:36 【问题描述】:

有时当我将 Laravel 项目部署到 AWS Elastic Beanstalk 时,我会遇到一个恼人的错误,提示无法打开日志文件:

The stream or file "/var/app/current/storage/logs/laravel-2020-10-21.log" could not be opened: failed to open stream: Permission denied

在我的 eb deploy.config 文件中,我有一个声明,理论上应该可以解决问题,但没有:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/99_make_storage_writable.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      echo "Making /storage writeable..."
      chmod -R 755 /var/app/current/storage

      if [ ! -f /var/app/current/storage/logs/laravel.log ]; then
          echo "Creating /storage/logs/laravel.log..."
          touch /var/app/current/storage/logs/laravel.log
          chown webapp:webapp /var/app/current/storage/logs/laravel.log
      fi

这是因为它没有引用每日日志文件。

我有一个 .ebignore 文件,它明确阻止部署本地日志,因此导致问题的不是现有日志文件的存在:

/storage/logs/*

问题是 Laravel 将每日日志创建为 root,因此普通用户 (webapp) 无法写入。

我只是不知道它为什么这样做?

【问题讨论】:

不同的所有权通常可以归因于如何原始生成日志文件。如果您有一个运行调度程序的CRON,并且它遇到错误,则.log 文件将被创建为root。如果网络服务器遇到记录的错误,它将使用webapp(或基于您的配置的类似名称)创建。如果您可以使用相同或兼容的用户/组/权限集来获取这两个进程,那么就不会有冲突。 (至少这是我以前遇到过的;不确定它是否适用于 EB) 另一种解决方案是在部署到 EB 时删除日志文件和目录,并在已部署时让它创建它吗? @FabricioG 没有部署日志文件(引用:“我有一个 .ebignore 文件,它明确阻止部署本地日志”)。问题是具有不同权限的不同进程正在尝试写入同一个日志文件。 【参考方案1】:

解决方案是让每个进程创建自己的日志文件。这样每个进程都将拥有正确的写入权限。

您可以在 config/logging.php 文件中执行此操作,并将进程名称 (php_sapi_name()) 添加到文件名中:

    'daily' => [
        'driver' => 'daily',
        'path' => storage_path('logs/' . php_sapi_name() . '-laravel.log'),
        'level' => 'debug',
        'days' => 14,
    ],

现在每个进程都可以写入自己的文件,不会出现权限问题。

【讨论】:

【参考方案2】:

尝试为此设置存储文件夹权限

chmod -R gu+w storage/
chmod -R guo+w storage/

【讨论】:

这本身并不能解决问题。这是一个 CD 环境。

以上是关于将 Laravel 部署到 Elastic Beanstalk:“无法打开流:权限被拒绝”的主要内容,如果未能解决你的问题,请参考以下文章

将 Laravel 应用程序从 GitHub 分支自动部署到 AWS EC2 或 Elastic Beanstalk

部署在 CodePipeline 中的 Laravel Elastic Beanstalk 应用程序给出 500 SERVER ERROR

AWS Elastic Beanstalk 中的 Laravel .env

使用 EbCommands 部署 Laravel Aws Elastic-Beanstalk

Laravel AWS Elastic Beanslack 部署错误 - 内存不足错误

“数据库主机数组为空。”在 AWS Elastic Beanstalk 上部署 Laravel 项目后