将 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