はじめに
Permission denied
Laravelを使用していると、以下のエラーが吐かれる場面に遭遇することがあると思います。
PHP Fatal error: Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/path/to/laravel_application/storage/logs/laravel-2018-xx-xx.log" could not be opened: failed to open stream: Permission denied'
あー、ログが書き込めてないのね。権限だね。はいはい。
加えて起こるミス
私は、ログの設定をdaily
にして使用することが多いので...
- 設定したその日は、書き込もうとしているファイルの権限まで直接変えてるから書き込める
- その結果、直したように思い込んでしまう
- 日付が変わった瞬間、新しく作成されたログファイルの権限が適切でなくて書き込めない
...のコンボをくらうことがよくあります。
「ファイルを作成したユーザーと、次に書き込みたいユーザーが異なる状態」という複雑な状況を作り出しているのが悪いんですけど(´・ω・`)
そんな私による、私のための、得する人が他にいるのか分からないような設定手順メモ。
設定方法
Laravel用にユーザーグループを作成する
# groupadd laravel
下の方でも書きますが、storage
とbootstrap/cache
の所有グループをこのlaravel
グループにします。
権限を与えたいユーザーをグループに追加する
必要なユーザーを適宜追加します。
# gpasswd -a hogehoge laravel
# gpasswd -a apache laravel
プロジェクトのディレクトリに移動
# cd /path/to/laravel_application
とりあえず綺麗にする
ディレクトリは755
に、ファイルは644
に全て変更。
(必要ない環境であれば飛ばしてください)
# find ./ -type d -exec chmod 755 {} \;
# find ./ -type f -exec chmod 644 {} \;
storage
とbootstrap/cache
の所有グループを変更
laravel
グループに属させます。
# chown -R :laravel ./storage
# chown -R :laravel ./bootstrap/cache
そして、既存のディレクトリ・ファイルに対して変更をかける
# find ./storage -type d -exec chmod 775 {} \;
# find ./storage -type f -exec chmod 664 {} \;
# find ./bootstrap/cache -type d -exec chmod 775 {} \;
# find ./bootstrap/cache -type f -exec chmod 664 {} \;
SGIDを設定する
これによって、誰がどう作成しようが、作成されたファイル・ディレクトリの所有グループはlaravel
になります。
# find ./storage -type d -exec chmod g+s {} \;
# find ./bootstrap/cache -type d -exec chmod g+s {} \;
ACLのデフォルト設定
storage
とbootstrap/cache
の配下に新規ファイルやディレクトリが作られるとき、ディレクトリは775
に、ファイルは664
に自動的に設定してくれるように設定します。
# setfacl -R -d -m g::rwx ./storage
# setfacl -R -d -m g::rwx ./bootstrap/cache
再起動
# shutdown -r now