title: “nginxでindexが効かない・index.htmlが表示されない” date: 2026-01-17 draft: true description: “nginxでindexディレクティブが効かず、ディレクトリアクセスでindex.htmlが表示されない場合の確認手順と対処法” categories: [“runbook”] tags: [“runbook”, “nginx”, “index”, “設定”, “403”, “404”, “ディレクトリ”]
症状
nginxでディレクトリにアクセスしてもindex.htmlが自動で表示されず、403 Forbiddenや404 Not Found、またはディレクトリ一覧が表示される。
結論:まずこれを確認
indexディレクティブが正しいコンテキスト(server/location)に書かれているか- 指定したファイル(index.html等)が実際に存在するか
- nginxがそのファイルを読み取る権限があるか
トラブルシューティングフロー
flowchart TD
A[ディレクトリアクセスで<br>indexが表示されない] --> B{エラーコードは?}
B -->|403 Forbidden| C[パーミッション確認へ]
B -->|404 Not Found| D[ファイル存在確認へ]
B -->|ディレクトリ一覧表示| E[autoindex確認へ]
B -->|別ファイルが表示| F[index順序確認へ]
C --> G[ステップ3へ]
D --> H[ステップ2へ]
E --> I[ステップ4へ]
F --> J[ステップ1へ]
よくある原因
- indexディレクティブの記述位置が不適切 - httpコンテキストのみに書いてlocationで上書きされている
- indexファイルが存在しない - ファイル名のtypoや配置ミス
- パーミッション不足 - nginxワーカーがファイルを読めない
- locationブロックでindexが上書きされている - 別のlocationで異なるindex設定がある
- try_filesとの競合 - try_filesが先にマッチして別の処理になる
- rootパスの設定ミス - 想定と異なるディレクトリを参照している
- シンボリックリンクの問題 - リンク先にアクセスできない
確認手順
ステップ1: 現在のindex設定を確認する
# nginx設定ファイルでindexディレクティブを検索
grep -rn "index" /etc/nginx/
# 設定の構文チェックと有効な設定を表示
nginx -T 2>/dev/null | grep -A5 "index"
🔍 チェックポイント: index index.html index.htm;のような行が、対象のserver/locationブロック内にあるか確認する
ステップ2: indexファイルの存在を確認する
# ドキュメントルートを確認(設定ファイルから)
nginx -T 2>/dev/null | grep "root"
# 実際にファイルが存在するか確認(パスは環境に合わせる)
ls -la /var/www/html/index.html
🔍 チェックポイント: ファイルが存在し、ファイル名が設定と完全一致しているか確認する(大文字小文字に注意)
ステップ3: パーミッションを確認する
# ディレクトリとファイルの権限を確認
ls -la /var/www/html/
# nginxの実行ユーザーを確認
ps aux | grep nginx
# 親ディレクトリすべてに実行権限があるか確認
namei -l /var/www/html/index.html
🔍 チェックポイント: nginxワーカー(通常www-data, nginx, nobodyのいずれか)がファイルを読み取れる権限(r–)と、親ディレクトリへの実行権限(–x)があるか確認する
ステップ4: locationブロックの競合を確認する
# 設定全体を確認
nginx -T
確認する設定例:
location / {
# ここにindexがあるか
index index.html index.htm;
# try_filesがある場合、indexより先に評価される
try_files $uri $uri/ =404;
}
🔍 チェックポイント: try_filesがある場合、$uri/が含まれているか確認する。これがないとディレクトリアクセス時にindexが参照されない
ステップ5: 設定を反映して動作確認する
# 設定の構文チェック
nginx -t
# 設定をリロード
systemctl reload nginx
# または
nginx -s reload
# 動作確認(ローカルから)
curl -I http://localhost/
🔍 チェックポイント: HTTP 200が返り、想定したindexファイルの内容が表示されるか確認する
NG行動(やってはいけないこと)
- chmod 777 で権限を緩くする - セキュリティリスクが高い。必要最小限の権限を設定する
- autoindex on を安易に設定する - ディレクトリ内容が公開され、情報漏洩につながる
- 設定変更後にリロードせず確認する - 古い設定のままテストしても意味がない
- SELinuxを無効化する - 無効化ではなく適切なコンテキストを設定する
よくある質問(FAQ)
Q1: index.phpを優先させたい場合はどうする?
A: indexディレクティブの順序を変更する。左から順に評価されるため、優先させたいファイルを先に書く。
index index.php index.html index.htm;
Q2: 特定のディレクトリだけ別のindexファイルを使いたい場合は?
A: そのディレクトリ用のlocationブロックを作成し、個別にindexを指定する。
location /app/ {
index app.html;
}
Q3: try_filesとindexを両方使う正しい書き方は?
A: try_filesに$uri/を含めることで、ディレクトリアクセス時にindexが評価される。
location / {
index index.html;
try_files $uri $uri/ =404;
}
関連するエラー・症状
解決しない場合
確認すべきログ
# エラーログを確認
tail -f /var/log/nginx/error.log
# アクセスログを確認
tail -f /var/log/nginx/access.log
公式ドキュメント
次に調べるキーワード
- nginx index directive not working
- nginx directory index forbidden
- nginx try_files index
- nginx location index priority