Laravel 5: laravel.log文件无法打开:权限被拒绝

15
为了防止你从一开始就产生误解,这里并没有权限问题。/storage已经递归的被chmod到777,并且整个项目文件夹被chowned为apache:apache。 甚至将日志文件重命名为...-old,apache也创建了一个新的日志文件...如果它没有实际的写入权限,就不会允许创建它。 在CentOS release 6.6(Final)下运行。 从git部署了该项目,homestead对我的同事有效。 完整错误信息: PHP致命错误:UnexpectedValueException异常,消息为“流或文件“/var/www/vhosts/mapper.pavementlayers.com/storage/logs/laravel-2015-05-18.log”无法打开:无法打开流:拒绝访问” /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:84\nStack跟踪:\n#0 /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php(88): Monolog\Handler\StreamHandler->write(Array)\n#1 /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\Handler\RotatingFileHandler->write(Array)\n#2 /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Logger.php(265): Monolog\Handler\AbstractProcessingHandler->handle(Array)\n#3 /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Logger.php(543): Monolog\Logger->addRecord(400, 'exception 'Symf...', Array)\n#4 /var/www/vhosts/mapper.pavementl

位于第84行的 /var/www/vhosts/mapper.pavementlayers.com/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php 文件中。

7个回答

50

可能是SElinux阻止了Apache创建此文件。

为了测试这一点,您可以使用以下命令暂时禁用SElinux:

setenforce 0

这将把SElinux置于宽容模式。这意味着您仍会在SElinux日志文件中收到错误消息,但SElinux不会阻止命令。

要重新激活SElinux,您可以输入:

setenforce 1

或重新启动您的CentOS服务器。

不幸的是,我也在CentOS上使用Laravel 5时遇到了问题,原因是SElinux。 最终我禁用了SElinux。我知道这不是正确的做法,但我还没有时间让它们一起工作!


更新

所以我最终有时间进一步调查了这个问题,并且我让SELinux与Laravel 5一起正常工作了。我刚刚更新了这篇文章,为可能遇到此问题的人提供帮助。禁用SELinux不是最佳策略,如上所述。

需要完成三件事:

  1. The folders Storage and Bootstrap/Cache need to have the right SELinux context. This can be achieved via the following commands:

    semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/<Laravel Site>/storage(/.*)?"
    
    semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/<Laravel Site>/bootstrap/cache(/.*)?"
    
  2. The SELinux context needs to be applied on the directories:

    restorecon -Rv "/var/www/<Laravel Site>/storage"
    
    restorecon -Rv "/var/www/<Laravel Site>/bootstrap/cache"
    
  3. The Apache user needs to have the rights to create files in both directories. This can be achieved via a ACL in CentOS 7:

    setfacl -R -m u:apache:rwX storage/
    
    setfacl -R -m u:apache:rwX bootstrap/cache/
    

最后一件要做的事情是重新启用SELinux。


1
这在Centos 7.5上对我有效,8个小时的努力都白费了,谢谢Thomas你救了我的命。 - elporfirio
大多数系统管理员在新安装的系统上都会直接禁用SELinux,这是一种常见做法。 - ied3vil
2
完美,很高兴在这些“让所有文件夹都是777权限”的大海中找到这个。 - kerrin
谢谢您!我的EC2 Centos 7实例今年三月至九月一直处于关闭状态,因为我没有时间。显然有些东西已经更新和改变了。我很想知道是什么。在三月份它还好好的,一直在愉快地写日志! - KevinY
我花了8个小时才找到这个答案。谢谢! - hjchin

12

尝试使用这些命令来操作Laravel 5

$ php artisan cache:clear 

$ sudo chmod -R 777 app/storage 

$ composer.phar dump-autoload

这是因为对于我的情况,Laravel没有权限写入日志文件。


3
这对我有效,适用于Laravel 5.4及以上版本。
$ sudo chmod -R 755 storage/

$ sudo chown -R www-data storage/

$ sudo chgrp -R www-data storage/

$ php artisan cache:clear

$ php artisan config:cache

$ composer dumpautoload

不是所有步骤都是必要的。


0

你必须确保 storage 文件夹存在。如果你是从 git 部署的,确保 storage 文件夹本身被跟踪并自动创建。


0

关于Laravel 5.7

$ cd /var/www/html/ $ php artisan cache:clear 应用程序缓存已清除!


0

适用于CentOS 7

   # ausearch -c 'httpd' --raw | audit2allow -M my-httpd
   # semodule -i my-httpd.pp

0

由于 laravel.log 文件位于 storage 文件夹中,因此我建议您在 Mac 终端上运行此命令。

chmod -Rf 0777 storage 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接