【发布时间】: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 文件,它明确阻止部署本地日志”)。问题是具有不同权限的不同进程正在尝试写入同一个日志文件。
标签: laravel amazon-web-services amazon-elastic-beanstalk