新米エンジニアの失敗再発防止メモ

自分そしてこの世界の皆が、同じ失敗をしないためのメモ

Twitterやってます!@rakuton_t
欲しいものリストのブタメンを送ってくれた方、ありがとうございます!

【nginx】アクセス権限が正しいのにPermission deniedになるときの原因と対処

アクセス権限は、
ディレクトリには実行権限
・ファイルには読取り権限
を付与すれば大丈夫なはずですが、このようなエラーが出てしまいました。

[error] 4418#0: *9 open() "/home/ec2-user/www/index.html" failed (13: Permission denied)

ディレクトリ・ファイルの所有者やグループをrootに変更してもダメです。

とりあえずの解決案

基本的に、ルートディレクトリの場所がユーザーのホームディレクトリに設定されているとエラーになります。
(というのはちょっと語弊があります。エラーになる理由はこちら

✖ダメな例

        location / {
          root  /home/[ユーザー名]/www;
          index  index.html;
        }

※デフォルトだと「/home/[ユーザー名]/」のパーミッションが700なので、701に変更すれば上記でも大丈夫

〇大丈夫な例

        location / {
          root  /www;
          index  index.html;
        }

設定を変えたらnginxを再起動しましょう

sudo service nginx restart

仕組み(ホームディレクトリだとダメな理由)

ページにアクセスがあった時、nginxユーザーがドキュメントルートにアクセスし、指定のパスのファイルを読み込みます。
ちなみに、
アクセスに必要な権限は実行権限です。
読取りに必要な権限は読取り権限です。

つまりは、ルートディレクトリからドキュメントディレクトリまでのディレクトリ全てに実行権限が必要です。
index.htmlなどのファイルには読取り権限が必要です。
逆に言えば、それら権限のみあれば良いです。

nginxユーザーがドキュメントルートにアクセスするので、「その他のユーザー」にアクセス権限が必要です。

さて、何故「/home/[ユーザー名]/www;」だとダメなのかですが、
ユーザーのディレクトリ「/home/[ユーザー名]/」のパーミッションは基本的に700だからです。
基本的に、ドキュメントルートに辿り着くまでの全てのディレクトリで、「その他のユーザー」に実行権限がないといけません。
もし「/home/[ユーザー名]/www」にしても大丈夫なようにしたいとすれば、

sudo chmod 701 /home/[ユーザー名] 

とする必要があります。

私の記事が役に立ったら、どうぞ何か買ってください!→ Amazon欲しいものリスト