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、またはディレクトリ一覧が表示される。

結論:まずこれを確認

  1. indexディレクティブが正しいコンテキスト(server/location)に書かれているか
  2. 指定したファイル(index.html等)が実際に存在するか
  3. 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