写入日志文件时Laravel 5权限被拒绝

Posted

技术标签:

【中文标题】写入日志文件时Laravel 5权限被拒绝【英文标题】:Laravel 5 permission denied when writing in log file 【发布时间】:2015-08-02 10:55:49 【问题描述】:

我有 Ubuntu 和 Laravel 5 框架,我在浏览器中看到白屏。 当我更改storage/logs 目录权限时,它会有所帮助,但由于“每日”日志配置,我必须每天都这样做。

【问题讨论】:

【参考方案1】:

简答:

sudo chmod -R 777 vendor storageecho "umask 000" | sudo tee -a /etc/resolv.confsudo service apache2 restart

广泛回答:

当您在 Apache 服务器上启动 Laravel 5 框架并默认启用“每日”选项来创建日志文件时,有时您会面临由于文件权限而禁止写入日志文件的情况。 通常,当您拥有 php 项目时,所有文件都属于 www-data 用户,您当前的用户无需写入日志文件。 关于 Laravel,两个不同的进程需要写入您的日志文件: 1) Apache 服务器(用户www-data)当您在浏览器中执行某些操作时; 2) 在命令行中执行php artisan something 时的Php 进程(您的用户)。

当然,每次你想使用artisan的时候都可以执行sudo -u www-data php artisan your_command(就像建议的here一样),但是有点烦。 首先,您需要授予 Apache 用户对供应商和存储目录的权限。 最简单的方法(但不是最好的方法)是执行: sudo chmod -R 777 vendor storage

现在,让我们看看在这两种情况下创建日志文件时会发生什么。

如果最初的日志文件 storage/logs/laravel-2015-mm-dd.log 是通过引发的错误创建的 php artisan something命令(案例2),日志文件会有

`-rw-rw-r-- your_user:your_user` 

权限。 如果它是由您的 apache 服务器创建的(案例 1),通常在 www-data 用户下启动,权限将如下所示:

-rw-r-r-- www-data:www-data

所以,我的建议是更改 apache 新创建文件的许可。 让我们将umask 000 行添加到/etc/resolv.conf 文件中。

echo "umask 000" | sudo tee -a /etc/resolv.conf

现在,

sudo service apache2 restart

就是这样。 请注意,由于可能存在安全风险,此解决方案仅适用于开发环境

【讨论】:

tbh,你永远都不想 chmod 777。 生产环境怎么办?例如,在 DigitalOcean 上?为 nginx 做些什么?例如,在 DigitalOcean LEMP 上? 关于如何使用生产服务器完成此任务的任何更新? 这是非常糟糕的建议。不要遵循这一点。首先,/etc/resolv.conf 与文件权限无关。如果你疯了,你可以在 /etc/login.defs 中使用 pam_umask 为常见的 Linux 系统设置默认的 umask。另一个常见的放置位置是 /etc/profile,甚至 /etc/rc.local。不过,您应该这样做。安全性很重要,即使在开发系统上也是如此。 有些海报对你很粗鲁。您提出了一个其他发帖人没有想到的关键概念,即 Artisan 和网络流量可以来自不同的用户。这在我的情况下造成了巨大的问题。我的调度程序每五分钟运行一次 Artistan ......但以 root 身份运行。所以我的日志文件会旋转到根目录,然后当一个网络请求试图写入日志时,它会导致系统崩溃。我通过确保我的艺术家调度程序的 crontab 命令以 Web 用户...而不是 root 身份执行来解决此问题。谢谢!【参考方案2】:

出于明显的安全原因,storagevendor 文件夹的权限应保持在 775

但是,您的计算机和服务器 Apache 都需要能够写入这些文件夹。例如:当你运行php artisan之类的命令时,你的电脑需要写入storage的日志文件。

您需要做的就是将文件夹的所有权交给 Apache:

sudo chown www-data:www-data /path/to/your/project/vendor
sudo chown www-data:www-data /path/to/your/project/storage

然后您需要将您的计算机(引用为username)添加到服务器Apache 所属的组中。像这样:

sudo usermod -a -G www-data userName

大多数情况下,groupNamewww-data,但您可能希望将其替换为正确的组。

【讨论】:

不幸的是,您的方法无济于事。默认情况下,Apache 创建具有权限 644 (-rw-r--r--) 的新文件。这意味着 artisan 不能写入同一个文件,无论它是否属于 www-data 组。 你是对的。我将删除我的答案。但是,您应该考虑将用户添加到 www-data 组并保留 775,而不是 777 所有文件夹。我们需要一个也适用于生产的解决方案。【参考方案3】: chmod 777 通常是一个非常危险的安全风险。

存储文件夹的 chmod 775 也可以考虑用户 属于网络服务器组。

使用 -R 非常危险,因为对于文件,执行权限根本不需要。

chmod 664 用于存储内的文件。 chmod 775 里面的文件夹

【讨论】:

【参考方案4】:

我遇到了同样的错误。通过使用以下命令,我可以解决它。出于某种原因,这与日志文件无关。

sudo chgrp -R www-data storage bootstrap/cache
sudo chmod -R ug+rwx storage bootstrap/cache

【讨论】:

就在这里,对我来说这是最好的答案——简洁明了。 你能解释一下为什么这些命令解决了这个问题吗?它也对我有用。【参考方案5】:

config/login.php中,设置了检查权限:

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

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于写入日志文件时Laravel 5权限被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

我收到错误日志文件的消息“无法打开流或文件“.../laravel.log”:无法打开流:权限被拒绝” [重复]

无法在本地主机(XAMPP)上打开 Laravel 日志(权限被拒绝)

text 修复Laravel日志权限被拒绝

无法打开流或文件:无法打开流:权限被拒绝

记一次Laravel定时任务导致日志没有写入权限的坑

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