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)が設定され、権限グループを指定することができます。
まとめ
設定自体は簡単なのですが、それだけに忘れがち。やばいと思ったら記事を見ながらさくっとエラー解消しましょう。
セキュリティ的にはログファイル自体を別々にした方が良かったり、色々と他にも対応方法はあります。用途に応じて取捨選択していきましょう。