【问题标题】:Laravel Storage Framework and Log File/Folder Permissions IssueLaravel 存储框架和日志文件/文件夹权限问题
【发布时间】:2018-02-03 20:37:55
【问题描述】:

当 Laravel 从不同来源生成文件/文件夹权限时,我遇到了问题。这可能有点啰嗦,但请耐心等待。

场景

1) 通过php artisan test:command 触发的名为TestCommand.phpartisan 命令具有以下代码:

public function handle(){
  \Log::info("Test Command Executed from Command Line");
}

2)TestController.php中的一个Contoller函数,在访问http://localhost/test时触发,代码如下:

public function test(){
  \Log::info("Test Command Executed from Web View");
}

这两个功能在单独触发时都能正常工作,但一旦触发,另一个将无法工作,因为storage/logs 中生成的日志文件现在具有不正确的权限、用户和/或团体。

情况1

如果我运行php artisan test:command,我会得到以下日志文​​件:

-rw-r--r-- | 1 | tim | wheel | 76B | 25 Aug 14:03 | laravel-2017-08-25.log

导航到http://localhost/test 会返回以下错误:

此页面无法正常工作

localhost 当前无法处理此请求。

HTTP 错误 500

没有显示 Laravel 堆栈跟踪(“糟糕,出了点问题”),因为只有在写入 Laravel 日志后才会出现这种情况。

情况2

如果我先导航到http://localhost/test,我会得到这个日志文件:

-rw-r--r-- | 1 | _www | wheel | 72B | 25 Aug 14:06 | laravel-2017-08-25.log

运行php artisan test:command 会返回以下内容:

PHP 致命错误:未捕获的异常 'UnexpectedValueException' 带有消息“无法打开流或文件“.../storage/logs/laravel-2017-08-25.log”:无法打开流:权限被拒绝' 在 .../vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:97 堆栈跟踪:...

结论

请注意,用户现在是_www 而不是tim,考虑到storage/logs 中文件的生成源,这是可以预期的。追溯,这可以通过运行很容易地修复:

sudo chmod -R 777 storage/logs

但这不是一个好的解决方案,原因有很多:

  • 777 对于生产网络服务器来说是个坏主意,而且 755 似乎不适用于我的配置。
  • 任何时候创建新文件(每天用于日志,任何时间用于storage/framework/* 中的文件等)都需要再次运行此命令。
  • 我无法直接访问该命令每天必须运行 x 次的网络服务器,这意味着我必须让其他人执行此操作。

鉴于这一切,我如何统一文件以允许任一来源创建文件,然后根据需要修改文件?

Webserver 是 apache,开发环境是 Mac,生产环境是 linux

更新

我认为一个好的解决方案是将tim_www 放在同一个组中,并使用

storage/logs 分配给该组
chgrp -R <user_group> storage

但接下来的问题是,默认情况下,Laravel 中任何生成的文件夹的权限都是644,这不允许group 进行写访问,只能读取。

如果可能的话,会考虑修改这个。

【问题讨论】:

    标签: php laravel permissions webserver


    【解决方案1】:

    找到了这个问题的解决方案; ACL!

    在 Mac 上,chmod +a ... 有一个选项,它将默认目录权限添加到您指定的任何文件夹。就我而言,我想使用允许tim_www 完全访问storage 下的文件/文件夹的ACL,因为它们都会不断地访问/写入它:

    chmod -R +a 'tim allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' storage
    chmod -R +a '_www allow read,write,delete,add_file,add_subdirectory,file_inherit,directory_inherit' storage
    

    递归地应用这个允许在存储目录中由 Laravel 生成的任何文件夹上设置 ACL,最重要的是那些是 storage/framework/cache

    在 Linux 上,ACL 似乎略有不同,但思路是一样的:

    chmod g+s storage
    setfacl -R -d -m u::rwx storage
    setfacl -R -d -m g::rx storage
    setfacl -R -d -m o::rx storage
    

    这将有效地将存储(和所有子文件夹)的文件权限设置为755,这似乎是我的配置需要允许正确写入。

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 1970-01-01
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多