如何修复错误:laravel.log无法打开?


183

实际上,我在laravel中是个新手,我正在尝试创建我的第一个项目。由于某种原因,我不断收到此错误(我什至尚未开始编码)

Error in exception handler: The stream or file "/var/www/laravel/app/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /var/www/laravel/bootstrap/compiled.php:8423

我读过这与权限有关,但chmod -R 775 storage完全没有帮助。

权限


运行该chmod命令时,您确定您在正确的目录中吗?尝试使用chmod -R 755 / var / www / laravel / app / storage。另外,用户和组设置为什么?试试ls -al / var / www / laravel / app / storage
Ryan LaBarre 2014年

相同的结果(我更新了原始帖子以显示该文件夹的权限)
FRR 2014年

:/由于某种原因,它仍然不起作用。我之前没有提到,但我正在使用无业游民。所以我的www文件夹在VM(apache,php和其他所有正在运行的文件夹)上。我不确定这是否与任何事情有关,但我想我只是为了以防万一。(我正在使用composer与vm一起创建项目)
FRR 2014年

12
那些建议777的人,请在Google上搜索以下短语:“ production db_password filetype:env inurl:com”
Tarasovych

1
禁用SELINUX对我有用。
Prakash P

Answers:


301

切勿将目录设置为777。您应该更改目录所有权。因此,将您当前的用户(以所有者身份登录)和Web服务器用户(www-data,apache等)作为组进行设置。您可以尝试以下方法:

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

然后设置目录权限,请尝试以下操作:

chmod -R 775 storage
chmod -R 775 bootstrap/cache

更新:

Web服务器的用户和组取决于您的Web服务器和操作系统。要确定您的Web服务器用户和组是什么,请使用以下命令。供nginx使用:

ps aux|grep nginx|grep -v grep

用于apache:

ps aux | egrep '(apache|httpd)'


4
谢谢!简而言之,您还可以执行以下操作:sudo chown -R {your current user}:www-data storage bootstrap/cache
Ramesh Pareek

2
@RameshPareek你是对的,但我只是想更清楚;)
Hamid Parchami

1
这对我不起作用。我刚得到chown: www-data: illegal group name。将目录设置为777是唯一有效的方法
Matt D

3
@MattD我想Mac上的apache组就是_www试试这个sudo chgrp -R _www bootstrap/cache。看看这篇文章会有所帮助:stackoverflow.com/a/6419695/2125114
Hamid Parchami,

3
这应该是选择的答案,100%的人同意系统管理员不应该只允许访问所有内容,以避免解决实际问题。
HyperionX '18年

134

切勿将777用于实时服务器上的目录,但在您自己的计算机上,有时我们需要做的不仅仅是775,因为

chmod -R 775 storage

手段

7 - Owner can write
7 - Group can write
5 - Others cannot write!

如果您的网络服务器没有以Vagrant的身份运行,它将无法对其进行写入,因此您有两种选择:

chmod -R 777 storage

或将组更改为您的Web服务器用户,假设是www-data

chown -R vagrant:www-data storage

就我而言,不需要chmod,因为它已经设置好了,但是在Fedora 20上它需要:chown -R apache:apache laravelproject
misterjaytee 2014年

通过samba / vagrant挂载文件夹时遇到问题- chown -R vagrant:www-data storage谢谢,为我做到了。
刘易斯

1
chmod -R 777存储对我有用。我尝试过更改小组,但我一直努力www-data: illegal group name
Matt D

57

要解决此问题,您需要将目录的所有权更改为Web服务器使用的Unix用户。

  1. 脱离虚拟机
  2. 使用控制台转到已同步的文件夹(无用)
  3. sudo chown -R $ USER:www-数据存储
  4. chmod -R 775存储器

即使我使用VM用户在VM中创建了项目,该文件夹也属于真实计算机中的用户;因此,当尝试

现在可以了。

感谢所有帮助我弄清楚这件事的人

编辑:

实际上,它仍然无法正常工作,仍然给了我一个“权限被拒绝”的问题。

这是我所做的,我像这样修改了Vagrantfile:

config.vm.synced_folder "./app","/var/www/", create:true,
:owner => "vagrant",
:group => "www-data",
:mount_options => ["dmode=775","fmode=664"]

我做到了...我很高兴!仍然无法正常工作... laravel 5 ...重命名了日志文件,laravel创建了一个新文件...同样的错误
ied3vil

1
我没有config.vm.synced_folder,因为我正在使用宅基,如何解决此问题?
oleynikd

21
您不应该使用Willy Nilly的777。
IIllIIll 2015年

我在文件夹中使用777(我完全知道里面是什么)(虚拟样本项目)时没有看到问题
FRR

2
这绝对不是公认的答案。它是可怕的。永远不要设置777。
CGriffin

38

也可能是SELinux。(Centos,RedHat)

确定终端上SElinux的状态:

$ sestatus

如果状态为启用,请使用write命令禁用SElinux

$ setenforce Permissive

或者您可以执行此命令

$ sudo setenforce 0


6
这是唯一有效的方法,您能否解释一下它的作用?
hack4mer

2
@ hack4mer,您可以阅读有关seLinux的更多信息。en.wikipedia.org/wiki/Security-Enhanced_Linux
TuranZamanlı18-10-9

我见过的奇怪的事情,为什么它寻找6个多小时后,工作地狱
穆罕默德Yulianto

1
唯一对我有用的解决方案..谢谢。但是,每次服务器重新启动时问题都会再次出现,即使服务器重新启动,您是否知道如何使其适用?
胡安·安吉

1
@JuanAngel您必须永久禁用服务。用编辑器vim / etc / sysconfig / selinux打开,然后将SELinux = enforcing指令更改为SELinux = disabled
TuranZamanlı19-10-8

31

您需要调整的权限storagebootstrap/cache

  • cd 进入您的Laravel项目。
  • sudo chmod -R 755 storage
  • sudo chmod -R 755 bootstrap/cache

如果755不起作用,您可以尝试777。777是不安全的!

根据您的Web服务器的设置方式,您也许可以更具体地设置自己的权限,而仅将其授予您的Web服务器用户。谷歌WEB SERVER NAME Laravel file permissions获取更多信息。

在撰写本文时,这是针对Laravel 5.4的



12

运行以下命令,您可以sudo在命令开头添加该命令,具体取决于您的系统:

chmod -R 775 storage/framework
chmod -R 775 storage/logs
chmod -R 775 bootstrap/cache 

1
永远不要使用777。有了777权限,您就可以为具有连接权限的任何人授予具有这些权限的文件或目录的完全访问权限。他们可能会以自己选择的任何方式(包括恶意地)对其进行更改。许多帐户黑客事件源于777权限。
奥德赛(Odyssee)'18年

8

对于Laravel上下文中的所有Centos 7用户,无需禁用Selinux,只需运行以下命令:

yum install policycoreutils-python -y # might not be necessary, try the below first

semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/storage(/.*)?" # add a new httpd read write content to sellinux for the specific folder, -m for modify
semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/laravel/bootstrap/cache(/.*)?" # same as the above for b/cache

restorecon -Rv /var/www/html/ # this command is very important to, it's like a restart to apply the new rules

最后,请确保您的主机,ip和虚拟主机均正确可用于远程访问。

Selinux旨在限制访问权限,即使是root用户也是如此,因此只能访问必要的内容,至少在通论上来说,这是额外的安全性,禁用它不是一个好习惯,学习Selinux的链接很多,但是为此甚至不需要。


尽管此链接可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能会失效。- 来自评论
Patrick Mevzek '18年

链接是超级明确的,不需要这种机制,甚至有专门针对Laravel SELinux上下文的部分。我认为,您的观点应该比简单的经验法则多一些逻辑依据。同时,您对答案的投票否决了,很可能有99%的人在不遵循禁用Selinux之类的不良做法的情况下解决了问题。
丹尼尔·桑托斯

明确与否都不是问题。该站点的想法是它包含所有相关信息,因此,通过阅读答案,我们可以获取所有信息。外部链接可能会腐烂,然后答案变得一文不值。在stackoverflow.com/help/how-to-answer的帮助中心中对此进行了说明:“鼓励链接到外部资源,但是请在链接周围添加上下文,以便您的其他用户会知道它是什么以及为什么在那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久脱机。
Patrick Mevzek,

您的问题已标记为供审核,仅此而已。它与我引用的“帮助中心”中的内容相矛盾。所有带有链接但没有描述的答案均被否决,甚至被删除。随时编辑您的答案以在此处提供解释的相关部分。这样您就可以放心地投票反对您认为不好的所有答案。您可以从评论链接中看到,我并不孤单地建议您关闭答案。没有技术上的优点,只是因为链接不够。
Patrick Mevzek '18年

感谢您的澄清,我不知道这些指南的存在,或者即使在注册过程中您获得阅读资源的提示,我也不记得了。您所说的可能是正确的,链接可能会烂掉,但是无论如何,我都会对其进行编辑,而无需任何努力即可获得答案。
丹尼尔·桑托斯

6

如果您使用cmd

sudo chown -R $USER:www-data storage
sudo chown -R $USER:www-data bootstrap/cache

如果使用GUI

首先转到项目,然后右键单击存储并检查属性,然后转到“权限”选项卡

在此处输入图片说明

使用以下代码更改权限

sudo chmod -R 777 storage

然后,您的文件属性可能是

在此处输入图片说明

然后检查您的设置并执行laravel命令,它将起作用:)


感谢yoouuuuuu
viniciussvl

5

在Laravel中,您应该在storagecache目录上设置ACL,以便Web服务器用户可以在目录上进行读写。打开一个新终端并运行以下命令:

HTTPDUSER=$(ps axo user,comm | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1)

sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:$(whoami):rwX bootstrap/cache storage/

参考文献:

https://symfony.com/doc/3.4/setup/file_permissions.html#using-acl-on-a-system-that-supports-setfacl-linux-bsd

https://linux.die.net/man/1/setfacl


5

可能为时已晚,但可能对某人有所帮助,更改目录权限对我有用。

假设您的Laravel项目在/var/www/html/目录中。

cd /var/www/html/

然后更改storage/bootstrap/cache/目录的权限。

sudo chmod -R gu+w storage/
sudo chmod -R guo+w storage/
sudo chmod -R gu+w bootstrap/cache/
sudo chmod -R guo+w bootstrap/cache/

2

此解决方案特定于laravel 5.5

您必须将权限更改为几个文件夹:上面的文件夹775或765的chmod -R -777存储/日志chmod -R -777存储/框架不适用于我的项目

chmod -R 775 bootstrap/cache 

项目文件夹的所有权也应如下所示(当前用户):( Web服务器用户)



1

我不太想将文件夹权限更改为777。这是解决此问题的方法。

首先,我更改了在本地计算机上运行Web服务器的用户(我运行nginx,但是原理适用于所有地方):

$> sudo vim /etc/nginx/nginx.conf
user <my_user> #inside nginx.conf
service nginx reload

之后,我index.php在该public/文件夹下创建了另一个文件,以找出谁在运行我的php-fpm版本以及在哪里进行更改:

<?php
phpinfo();
?>

重新加载页面后,我发现www-data是用户(在“环境”部分下)。我还发现我正在运行php 7.1。我着手更改用户:

$> sudo vim /etc/php/7.0/fpm/pool.d/www.conf 
#Look for www-data or the following variables: user, group, listen.user, listen.group.

最后,我授予了文件夹以下权限:

sudo chmod -R 775 ./storage/

现在,通过使用以下简单方法,确保我是文件夹的所有者:

ls -al

如果您将服务器和php-fpm用户设置为您自己,并且文件夹由例如root拥有,那么您将继续遇到此问题。如果您sudo laravel new <project>以root用户身份进行,则可能会发生这种情况。在这种情况下,请确保chown在项目上使用递归命令来更改user:group设置。在大多数默认情况下,这www-data是服务器和php的主要设置,在这种情况下,要确保文件夹不会超出www-data范围。

我的项目在我的主目录中设置。在Ubuntu 16.04和Laravel 5.5上。



0

在我的特定情况下,我生成了一个配置文件并将其缓存到bootstrap/cache/目录中,因此我的步骤如下:

  1. 删除所有生成的缓存文件: rm bootstrap/cache/*.php
  2. 创建一个新laravel.log文件,并使用以下命令在文件上应用权限更新:

    • chmod -R 775 storage

0

(在Ubuntu上):可以通过2个简单的步骤解决:

$ sudo chmod -R 777 storage 

$ sudo service apache2 restart

第3步:因为您已经向世界公开了文件,所以您的服务器和/或用户遭到黑客攻击。
miken32 '19

0

删除并重"/var/www/laravel/app/storage/logs/laravel.log"试:

rm storage/logs/laravel.log



-1

可以通过禁用Linux来修复此错误。

检查是否已启用

塞斯塔图斯

你试试..

setenforce 0


5
“通过禁用Linux ”?那太严重了:-)!
Patrick Mevzek '18年

-1

对于此错误:

异常处理程序中的错误:无法打开流或文件“ /var/www/laravel/app/storage/logs/laravel.log”:打开流失败:在/ var / www / laravel / bootstrap / compiled中的权限被拒绝.php:8423

在终端中使用以下命令:

sudo chmod -R 777 storage

2
对于生产环境来说太糟糕了
Ariful Haque

-1

修复了centos 7.6 Server中此命令的问题

chcon -R -t httpd_sys_content_t $SITE_PATH

chcon -R -t httpd_sys_rw_content_t $SITE_PATH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.