症状

nginxのエラーログに Permission denied が記録される、または403 Forbiddenが表示される。

結論:まずこれを確認

  1. エラーログで具体的なファイルパスを特定する
  2. そのファイル・ディレクトリのパーミッションを確認する
  3. nginxの実行ユーザーを確認する

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

    flowchart TD
    A[Permission denied発生] --> B{エラーログを確認}
    B --> C[対象ファイルパスを特定]
    C --> D{ファイルは存在する?}
    D -->|No| E[パス設定を見直す]
    D -->|Yes| F{パーミッションを確認}
    F --> G{読み取り権限あり?}
    G -->|No| H[chmod/chownで修正]
    G -->|Yes| I{親ディレクトリの権限は?}
    I -->|問題あり| J[ディレクトリ権限を修正]
    I -->|問題なし| K{SELinuxは有効?}
    K -->|Yes| L[SELinuxコンテキストを確認]
    K -->|No| M[nginx実行ユーザーを確認]
  

よくある原因

  • ファイルのパーミッション不足 - nginxユーザーに読み取り権限がない
  • 親ディレクトリの実行権限不足 - ディレクトリに x 権限がない
  • ファイル所有者の不一致 - rootや別ユーザーが所有している
  • SELinux/AppArmorによる制限 - セキュリティモジュールがブロックしている
  • シンボリックリンクの権限問題 - リンク先のファイルに権限がない
  • nginx実行ユーザーの設定ミス - 設定ファイルのuserディレクティブが誤っている
  • ホームディレクトリ配下への配置 - /home/user/ 配下はデフォルトで制限される

確認手順

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

    sudo tail -50 /var/log/nginx/error.log | grep -i "permission denied"
  

🔍 チェックポイント: open() "/path/to/file" failed (13: Permission denied) の形式でパスが表示される

ステップ2: nginx実行ユーザーを確認する

    ps aux | grep nginx
# または
grep -E "^user" /etc/nginx/nginx.conf
  

🔍 チェックポイント: workerプロセスが www-datanginx ユーザーで動作しているか確認

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

    ls -la /path/to/target/file
namei -l /path/to/target/file
  

🔍 チェックポイント: namei コマンドで親ディレクトリも含めた全階層の権限を確認できる

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

    # ファイルに読み取り権限を付与
sudo chmod 644 /path/to/target/file

# ディレクトリに実行権限を付与
sudo chmod 755 /path/to/target/directory

# 所有者をnginxユーザーに変更(環境に応じて www-data や nginx)
sudo chown www-data:www-data /path/to/target/file
  

🔍 チェックポイント: 静的ファイルは 644、ディレクトリは 755 が一般的

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

    # SELinuxの状態を確認
getenforce

# ファイルのコンテキストを確認
ls -Z /path/to/target/file

# コンテキストを修正
sudo chcon -R -t httpd_sys_content_t /path/to/webroot
  

🔍 チェックポイント: Enforcing の場合はSELinuxが有効。httpd_sys_content_t タイプが必要

ステップ6: 設定をリロードして確認する

    sudo nginx -t && sudo systemctl reload nginx
  

🔍 チェックポイント: syntax is oktest is successful が表示されれば設定に問題なし

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

  • chmod 777 を使う - セキュリティリスクが高い。必要最小限の権限に留める
  • SELinuxを無効化する - 根本解決にならない。コンテキスト設定で対応する
  • rootでnginxを動作させる - workerプロセスをrootで動かすのは危険
  • エラーログを見ずにパーミッション変更を試す - 対象ファイルを特定してから対処する
  • 再帰的に全ファイルの所有者を変更する - 意図しないファイルの権限が変わる可能性がある

よくある質問(FAQ)

Q1: 403 Forbiddenとの関係は?

A: Permission deniedが原因で403 Forbiddenが返される。エラーログを確認すると具体的なパスが分かる。

Q2: ホームディレクトリ配下で公開したい場合は?

A: ホームディレクトリ自体に 711chmod 711 /home/username)を設定し、公開ディレクトリとその中身に適切な権限を付与する。SELinux環境では httpd_enable_homedirs の有効化も必要。

Q3: 特定のファイルだけPermission deniedになる場合は?

A: namei -l /full/path/to/file で経路上のすべてのディレクトリ権限を確認する。途中のディレクトリに実行権限がないケースが多い。

関連するエラー・症状

解決しない場合