症状

nginxでWebページにアクセスすると「403 Forbidden」が表示される。

結論:まずこれを確認

  1. ドキュメントルートのパーミッションが755以上か
  2. ファイルの所有者がnginxユーザーで読めるか
  3. indexファイル(index.html等)が存在するか

トラブルシューティングフロー

    flowchart TD
    A[403 Forbidden 発生] --> B{エラーログを確認}
    B -->|Permission denied| C[パーミッション/所有者を確認]
    B -->|directory index is forbidden| D[index設定を確認]
    B -->|SELinux関連| E[SELinuxコンテキストを確認]
    C --> F[chmod/chownで修正]
    D --> G[indexファイル配置 or autoindex設定]
    E --> H[restorecon実行]
    F --> I[nginx再起動して確認]
    G --> I
    H --> I
  

よくある原因

  • ディレクトリのパーミッション不足 - nginxユーザーがディレクトリを読めない(755未満)
  • ファイルのパーミッション不足 - nginxユーザーがファイルを読めない(644未満)
  • indexファイルが存在しない - index.htmlやindex.phpがなく、autoindexも無効
  • 親ディレクトリの実行権限がない - 途中のディレクトリに+xがない
  • SELinuxによるブロック - CentOS/RHELでSELinuxがアクセスを拒否している
  • nginx.confのallow/deny設定 - IPベースのアクセス制限に引っかかっている
  • ファイル所有者の問題 - ファイルがrootのみ読める状態になっている

確認手順

ステップ1: エラーログを確認する

    sudo tail -50 /var/log/nginx/error.log
  

🔍 チェックポイント: Permission denieddirectory index is forbiddenSELinux などのキーワードを探す

ステップ2: ドキュメントルートを特定する

    grep -r "root" /etc/nginx/sites-enabled/ 2>/dev/null
# または
grep -r "root" /etc/nginx/conf.d/ 2>/dev/null
  

🔍 チェックポイント: root /var/www/html; のようなパスを確認

ステップ3: ディレクトリのパーミッションを確認する

    # ドキュメントルートまでの全パスを確認
namei -l /var/www/html/
  

🔍 チェックポイント: すべてのディレクトリに x(実行)権限があること

    # 各ディレクトリの詳細
ls -la /var/
ls -la /var/www/
ls -la /var/www/html/
  

🔍 チェックポイント: ディレクトリは drwxr-xr-x(755)以上が必要

ステップ4: ファイルのパーミッションを確認する

    ls -la /var/www/html/index.html
  

🔍 チェックポイント: ファイルは -rw-r--r--(644)以上が必要

ステップ5: ファイル所有者を確認する

    # nginxの実行ユーザーを確認
grep -E "^user" /etc/nginx/nginx.conf
# または ps で確認
ps aux | grep nginx
  
    # ファイル所有者を確認
ls -la /var/www/html/
  

🔍 チェックポイント: nginxユーザー(www-data、nginx等)が読めるか

ステップ6: indexファイルの存在を確認する

    ls -la /var/www/html/index.*
  

🔍 チェックポイント: index.html、index.htm、index.phpなどが存在するか

    # nginx設定のindex指定を確認
grep -r "index" /etc/nginx/sites-enabled/
  

ステップ7: SELinuxを確認する(CentOS/RHEL/Rocky)

    # SELinuxの状態確認
getenforce
  
    # SELinuxコンテキストを確認
ls -laZ /var/www/html/
  

🔍 チェックポイント: httpd_sys_content_t コンテキストがあるか

ステップ8: パーミッションを修正する

    # ディレクトリのパーミッション修正
sudo chmod 755 /var/www/html

# ファイルのパーミッション修正
sudo chmod 644 /var/www/html/index.html

# 所有者の修正(Debian/Ubuntu)
sudo chown -R www-data:www-data /var/www/html/

# 所有者の修正(CentOS/RHEL)
sudo chown -R nginx:nginx /var/www/html/
  

ステップ9: SELinuxコンテキストを修正する

    # コンテキストを正しく設定
sudo restorecon -Rv /var/www/html/

# または手動で設定
sudo chcon -R -t httpd_sys_content_t /var/www/html/
  

ステップ10: nginxを再起動して確認する

    sudo nginx -t && sudo systemctl reload nginx
  

🔍 チェックポイント: syntax is oktest is successful が表示される

NG行動(やってはいけないこと)

  • chmod 777 を使う - セキュリティリスクが極めて高い。777は絶対に避ける
  • SELinuxを無効化する - 根本解決ではなく、セキュリティが低下する
  • nginxをrootで実行する - 脆弱性があった場合にシステム全体が危険にさらされる
  • エラーログを見ずに設定を変更する - 原因特定が遅れる
  • 親ディレクトリの確認を怠る - /var/www は OK でも /var に問題があるケースがある

よくある質問(FAQ)

Q1: 特定のファイルだけ403になる場合は?

A: そのファイル個別のパーミッションを確認する。ls -la /path/to/file で644以上あるか、SELinuxコンテキストが正しいか確認。

Q2: autoindexを有効にしても403のままの場合は?

A: ディレクトリ自体のパーミッションを確認する。autoindexはディレクトリの読み取り権限がないと機能しない。

Q3: 設定を変更したのに反映されない場合は?

A: sudo nginx -t で設定チェック後、sudo systemctl reload nginx を実行。reloadではなくrestartが必要な場合もある。

関連するエラー・症状

  • (関連記事準備中)
  • (関連記事準備中)
  • (関連記事準備中)

解決しない場合

公式ドキュメント

確認すべきログファイル

    /var/log/nginx/error.log
/var/log/audit/audit.log  # SELinux関連(CentOS/RHEL)
  

次に調べるキーワード

  • nginx permission denied parent directory
  • nginx selinux httpd_sys_content_t
  • nginx user www-data permission