Laravelで開発したことある人はよく見かける下記のエラー
The stream or file "/hogehoge/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied
起こる度に
あれ?どうやるんだっけ?と検索しており備忘録として残します。
まずはじめに
よくサイトでsudo chmod 777
にすれば解決!
と見かけるのですが辞めましょう。
実際にエラーは解決されますが別の問題が発生します。
777
は全てのユーザーに「読み取り」「書き込み」「実行」の権限を渡すということになります。
不正に侵入できたりファイルの編集や実行されてしまいます。
じゃどうしたらいいの?
問題ないであろう権限付与が下記になります。
今回はEC2にデプロイしWebサーバをapache
を使用した想定で書いています。
各々でnginx
(もしくはwww-data
)に変更してください。
#該当のディレクトリに移動
$ cd /var/www/[プロジェクト名]
#任意のユーザーをApacheグループに追加
$ sudo usermod -a -G apache ec2-user(任意のユーザー)
#ディレクトリの所有者を任意のユーザー、グループをapacheに変更
$ sudo chown -R ec2-user(任意のユーザー):apache .
-
usermod
ユーザーの情報を変更するコマンドです。 -
-a
既存のグループを維持しながら、ユーザーを新しいグループに追加します。 -
-G apache
該当ユーザーを apache グループに追加します。 -
ec2-user(任意のユーザー)
対象のユーザー名です。
現在ログインしているユーザーをグループに追加したい場合は
$USER
もしくは上記のように直接指定してください。
-a を省略すると、ユーザー(今回だとec2-user) の既存グループ情報が上書きされ、apache グループ以外のグループから外れてしまいます。
# プロジェクトの権限を設定
$ sudo find . -type f -exec chmod 664 {} \;
$ sudo find . -type d -exec chmod 775 {} \;
-
find .
現在のディレクトリ「.」以下の全てのファイルやディレクトリを検索します。 -
-type f
検索結果をファイルのみに限定します。 -
-exec chmod 664 {} ;
見つかったファイルに対して、chmod 664 コマンドを実行します。
{} は、find コマンドで見つかった各ファイル名を指します。
; は、-exec オプションの終了を意味します。 -
664
所有者とグループは読み取りと書き込みが可能になり、その他のユーザーは読み取りのみが可能となります。
# ストレージとキャッシュへの読み取りと書き込みの権限を設定
$ sudo chgrp -R apache storage bootstrap/cache
$ sudo chmod -R 770 storage bootstrap/cache
- chgrp
ファイルやディレクトリのグループ所有権を変更するコマンドです。 - -R
再帰的に操作を行い、指定したファイルやディレクトリが対象になります。 - 770
所有者とグループにフルのアクセスを許可しますが、その他のユーザーはアクセスできません。
コマンドまとめ
#該当のディレクトリに移動
$ cd /var/www/[プロジェクト名]
#任意のユーザーをApacheグループに追加
$ sudo usermod -a -G apache ec2-user(任意のユーザー)
#ディレクトリの所有者を任意のユーザー、グループをapacheに変更
$ sudo chown -R ec2-user(任意のユーザー):apache .
# プロジェクトの権限を設定
$ sudo find . -type f -exec chmod 664 {} \;
$ sudo find . -type d -exec chmod 775 {} \;
# ストレージとキャッシュへの読み取りと書き込みの権限を設定
$ sudo chgrp -R apache storage bootstrap/cache
$ sudo chmod -R 770 storage bootstrap/cache
最後に
権限周りの知見が浅いので
「こうした方がいいよ!」「ここ間違っているよ!」等ありましたら
ご指摘いただけると助かります。
追記 2024/11/21
composer install前に上記を行うとPermission deniedが発生します。
後に行ってください。。