Laravel Storage Framework和日志文件/文件夹权限问题

时间:2017-08-25 18:22:10

标签: php laravel permissions webserver

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

方案

1)通过artisan触发的名为TestCommand.php的{​​{1}}命令具有以下代码:

php artisan test:command

2)访问public function handle(){ \Log::info("Test Command Executed from Command Line"); } 时触发的TestController.php中的控制器功能,其中包含以下代码:

http://localhost/test

当单独触发时,两个函数都能正常工作,但是一触发一个,另一个不起作用,,因为public function test(){ \Log::info("Test Command Executed from Web View"); } 中生成的日志文件现在具有不正确的权限,用户和/或小组。

情况1

如果我运行storage/logs,我会收到以下日志文​​件:

php artisan test:command

导航到-rw-r--r-- | 1 | tim | wheel | 76B | 25 Aug 14:03 | laravel-2017-08-25.log 会返回以下错误:

  

此页面无效

     

localhost目前无法处理此请求。

     

HTTP ERROR 500

没有Laravel堆栈跟踪(" Woops,出错了"),因为只有在写入Laravel日志后才会发生。

情况2

如果我先导航到http://localhost/test,我会收到此日志文件:

http://localhost/test

运行-rw-r--r-- | 1 | _www | wheel | 72B | 25 Aug 14:06 | laravel-2017-08-25.log 会返回以下内容:

  

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

结论

请注意,用户现在是php artisan test:command而不是_www,这是tim中文件的生成源所期望的。追溯性地,通过运行可以很容易地解决这个问题:

storage/logs

但由于多种原因,这不是一个好的解决方案:

  • 777对于生产Web服务器来说是一个坏主意,755似乎不适用于我的配置。
  • 每次创建新文件时(每日日志,sudo chmod -R 777 storage/logs 中的文件等),此命令都需要再次运行。
  • 我没有直接访问网络服务器,这个命令每天必须运行x次,这意味着我不得不让别人做错。

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

Webserver是apache,dev环境是Mac,生产是linux

更新

我认为一个好的解决方案是让storage/framework/*tim在同一个群组中,然后使用

_www分配给该群组
storage/logs

但是接下来的问题是,默认情况下,Laravel中任何生成的文件夹的权限都是chgrp -R <user_group> storage ,它不允许644进行写访问,只能读取。

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

1 个答案:

答案 0 :(得分:0)

找到解决这个问题的方法;的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,这似乎是我的配置需要允许正确写入的内容。