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