症状
nginxのエラーログに Permission denied が記録される、または403 Forbiddenが表示される。
結論:まずこれを確認
- エラーログで具体的なファイルパスを特定する
- そのファイル・ディレクトリのパーミッションを確認する
- 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-data や nginx ユーザーで動作しているか確認
ステップ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 ok と test is successful が表示されれば設定に問題なし
NG行動(やってはいけないこと)
chmod 777を使う - セキュリティリスクが高い。必要最小限の権限に留める- SELinuxを無効化する - 根本解決にならない。コンテキスト設定で対応する
- rootでnginxを動作させる - workerプロセスをrootで動かすのは危険
- エラーログを見ずにパーミッション変更を試す - 対象ファイルを特定してから対処する
- 再帰的に全ファイルの所有者を変更する - 意図しないファイルの権限が変わる可能性がある
よくある質問(FAQ)
Q1: 403 Forbiddenとの関係は?
A: Permission deniedが原因で403 Forbiddenが返される。エラーログを確認すると具体的なパスが分かる。
Q2: ホームディレクトリ配下で公開したい場合は?
A: ホームディレクトリ自体に 711(chmod 711 /home/username)を設定し、公開ディレクトリとその中身に適切な権限を付与する。SELinux環境では httpd_enable_homedirs の有効化も必要。
Q3: 特定のファイルだけPermission deniedになる場合は?
A: namei -l /full/path/to/file で経路上のすべてのディレクトリ権限を確認する。途中のディレクトリに実行権限がないケースが多い。
関連するエラー・症状
解決しない場合
- nginx公式ドキュメント - Core functionality
- エラーログ:
/var/log/nginx/error.log - アクセスログ:
/var/log/nginx/access.log - 次に調べるキーワード:
nginx user directive,linux file permissions,SELinux httpd_sys_content_t