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: