写入日志文件时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 storage
echo "umask 000" | sudo tee -a /etc/resolv.conf
sudo 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】:出于明显的安全原因,storage
和 vendor
文件夹的权限应保持在 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
大多数情况下,groupName
是 www-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”:无法打开流:权限被拒绝” [重复]