Laravel 5.* で ログとかキャッシュが書き込まれるときに「Permission denied 」のエラーが出る
確認環境: php7.3 Laravel 5.8
Laravel が 書き込む storage/logs/ ディレクトリを見てみる
ls -al storage/logs/ -rw-r--r-- 1 www-data www-data 2258 Mar 5 13:31 laravel-2019-03-05.log
どうも 644 で書かれている模様
/lib/systemd/system/php7.3-fpm.service に umask が書けるみたい
[Service] UMask=0002
こんな感じに書けばいいらしいが、
めんどい
設定ファイルでどうにかする
設定ファイルを修正すればよいらしい
config/ logging.php
'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'permission' => 0664, ], 'daily' => [ 'driver' => 'daily', 'path' => storage_path('logs/laravel.log'), 'level' => 'debug', 'days' => 14, 'permission' => 0664, ],
rm storage/logs/* とかで
一旦ログを消して エラーを出してログを書き込みさせてみる
ls -al storage/log/ -rw-rw-r-- 1 www-data www-data 2258 Mar 5 13:33 laravel-2019-03-05.log
できたっぽい
手っ取り早くやる場合
AppServiceProvide.php とかに umask を 書く
ちょっと怖いので本番環境では工夫したほうがいいかも
app/Providers/ AppServiceProvide.php
public function boot() { umask(0002); }
こんな感じ
Storageファサード を 使ってる書き込みの場合
Laravel は Flysystem という PHPパッケージを使用しているらしいので、見てみる
https://flysystem.thephpleague.com/docs/adapter/local/
$adapter = new Local( __DIR__.'/path/to/too', LOCK_EX, Local::DISALLOW_LINKS, [ 'file' => [ 'public' => 0744, 'private' => 0700, ], 'dir' => [ 'public' => 0755, 'private' => 0700, ] ] );
こんな感じに書けばいいらしい
vendor/laravel/framework/src/Illuminate/Filesystem/FilesystemManager.php の createLocalDriver メソッドに permissions がつっ込まれてるので以下のようにする
config/filesystems.php
'local' => [ 'driver' => 'local', 'root' => storage_path('app'), 'permissions' => [ 'file' => [ 'public' => 0744, 'private' => 0744, ], 'dir' => [ 'public' => 0755, 'private' => 0755, ] ] ],
こんな感じにしてみる
あんまりまとまってないけど飽きてきたので公開
Categorised in: PHP