Laravel logのPermission denied対応

アプリケーションを本番環境にデプロイし、いざテストしてみると当日は問題なく動く。

しかし翌日になってエラーが

The stream or file "/home/laravel_application/storage/logs/laravel-2022-01-31.log" could not be opened: failed to open stream: Permission denied

ああ、ログのパーミッションが違うのか。前もやったな、、

同じミスを繰り返す私のような方にも参考になるように、対応方法をメモしていきます。

何が問題か

例えばLaravelのユーザが「apache」、サーバのユーザが「root」のままだったとしましょう。

こういうことが起こります。

ログファイルについてのパーミッションエラーの原因

このままサイトを開くとエラー画面に遭遇します。

エラーメッセージ

対応方法

ユーザグループ作成

まずはLaravel用のユーザグループを作成します。


groupadd laravel

ユーザグループへの追加

次に、必要なユーザを作成したユーザグループに追加します。

今回はrootユーザとapacheユーザを追加します。


gpasswd -a root laravel
gpasswd -a apache laravel

ディレクトリ権限変更

追加が完了したら、対象ディレクトリの権限を変更します。


chown -R :laravel ./storage
chown -R :laravel ./bootstrap/cache

出力されるログファイルのパーミッション変更

ログファイルのデフォルトパーミッションは「0644」となっており、所有者しか書き込みができません。

パーミッションは設定ファイルから変更可能です。

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,
	    'permission' => 0664,  /****追加***/
        ],

これでapacheさんも書き込めるログファイルが出力されます。

出力されるファイルのグループ変更

ファイルのパーミッションは変更しましたが、作成したrootさんとapacheさんの権限グループが異なるとやはり編集できません。

そこで、特定のディレクトリに対しては新規作成されたファイルのグループをディレクトリの設定を継承するようにします。

chmod 2755 storage

これを必要なフォルダにそれぞれ設定していきます。

パーミッションの「755」の前に「2」を付与することで、Set Group ID(SGID)が設定され、権限グループを指定することができます。

まとめ

設定自体は簡単なのですが、それだけに忘れがち。やばいと思ったら記事を見ながらさくっとエラー解消しましょう。

セキュリティ的にはログファイル自体を別々にした方が良かったり、色々と他にも対応方法はあります。用途に応じて取捨選択していきましょう。

コメントを残す