nginxで403が返されるときに対応したこと
サーバー上に新しくディレクトリを作成し、そこを起点にgithubからpullを行いデプロイした際にうまく作動しなかった。
環境
centos7 nginx porstgresql django
症状:
- home画面のhtmlはサーバーから配信される。
- home画面の静的ファイルの配信がうまく行っていない。
- 配信がうまく行かなかった静的ファイルに直接アクセスする(新しいタブで画像を開く)場合403が返される。
判断:
home画面のhtmlはサーバーから配信される。 -->
webサーバーとWebApplicationSerer(django)は正常に作動していると可能性が高い。
home画面の静的ファイルの配信がうまく行っていない。 -->
webサーバー(nginx)から静的ファイルを送信する際に問題がある。
(新しいタブで画像を開く)場合403が返される。-->
nginxが静的ファイルにアクセスするが権限に関して問題がある可能性を示唆している。
対応したこと
- "nginx 403"で検索をかけ、以下の記事を探し当てた。 Nginx で 403 Forbidden エラーが出るときのチェック項目|まくろぐ
- ドキュメントルートまでに実行権限があるかチェックした。
- うまく配信されなかった静的ファイルの読み取り権限があるかチェックした。
なお、権限チェックに関してはlsコマンドを使った。
ls -l (対象ディレクトリ)
ドキュメントルート(静的ファイルを配信するために静的ファイルを集めたディレクトリ)までの実行権限を調べたところ見事に実行権限がなかった。具体的にはドキュメントリート自体には実行権限xが存在していたが、親のディレクトリとその親ディレクトリにはxの権限が欠如していた。 rootからドキュメントルートまで下記のコマンドを実行した。
chmod +x (対象のディレクトリ)
問題のあった静的ファイルの読み取り権限rはあったのでこれに関して特に行うことはなかった。
そして再度nginxの起動を行った。
systemctl restart nginx
結果として正常に静的ファイルを表示させることができた。
この件から得られた知見
nginxがファイルを配信する前提としてドキュメントルートまでの実行権限が必要なこと、配信する静的ファイルに読み取り権限が必要なことを学んだ。またnginxで403が出る場合とその他のエラーが出る場合を経験したけど、そもそもhome画面が表示されない場面に出くわした。このときは静的ファイルがドキュメントルートに存在していない場合があった。
だからnginxの配信するファイルの存在があるかないか ?
無い --> 画面自体が表示されない。
ある --> 権限に問題がある。
今の所こんな感じの原因を推測できる