症状
nginxでWebページにアクセスすると「403 Forbidden」が表示される。
結論:まずこれを確認
- ドキュメントルートのパーミッションが755以上か
- ファイルの所有者がnginxユーザーで読めるか
- 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 denied、directory index is forbidden、SELinux などのキーワードを探す
ステップ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 ok と test 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 directorynginx selinux httpd_sys_content_tnginx user www-data permission