症状
nginxでファイルアップロード時に「413 Request Entity Too Large」エラーが表示される。
結論:まずこれを確認
client_max_body_sizeの現在値を確認する- アップロードしようとしているファイルサイズと比較する
- 設定値を適切な値に変更し、nginx を reload する
トラブルシューティングフロー
flowchart TD
A[413エラー発生] --> B{エラーログを確認}
B --> C[client intended to send too large body]
C --> D{client_max_body_size の設定場所を特定}
D --> E[http/server/location ブロックを確認]
E --> F{設定値は適切か?}
F -->|小さすぎる| G[値を増やして reload]
F -->|設定なし| H[デフォルト1MBが適用されている]
H --> G
G --> I[動作確認]
よくある原因
- client_max_body_size 未設定 - デフォルト値 1MB が適用されている
- 設定場所が間違っている - location ブロックに設定すべきところを http ブロックにのみ設定している
- 設定の優先順位の誤解 - より内側のブロックで上書きされている
- 複数の nginx.conf が存在 - include で読み込まれた別ファイルの設定が優先されている
- reload 忘れ - 設定変更後に nginx を再読み込みしていない
- リバースプロキシ先の制限 - nginx の後段(PHP-FPM、アプリケーション)にも制限がある
- 一時ファイル領域の容量不足 - client_body_temp_path のディスク容量が不足している
確認手順
ステップ1: エラーログを確認する
# エラーログの場所を確認(環境により異なる)
sudo tail -20 /var/log/nginx/error.log
🔍 チェックポイント: client intended to send too large body というメッセージがあれば、このRunbookの対象
ステップ2: 現在の client_max_body_size 設定を確認する
# 設定ファイル内の client_max_body_size を検索
sudo grep -r "client_max_body_size" /etc/nginx/
🔍 チェックポイント: 何も表示されなければデフォルト値(1MB)が適用されている
ステップ3: 設定が適用されるブロックを特定する
# メイン設定ファイルを確認
sudo cat /etc/nginx/nginx.conf
# サイト別設定を確認(環境により異なる)
sudo cat /etc/nginx/sites-enabled/*
# または
sudo cat /etc/nginx/conf.d/*.conf
🔍 チェックポイント: http, server, location の各ブロックを確認し、設定の継承関係を把握する
ステップ4: 設定を追加・変更する
# 該当する設定ファイルを編集
sudo vim /etc/nginx/nginx.conf
設定例(適用範囲に応じて配置場所を選択):
# http ブロック(全サイト共通)
http {
client_max_body_size 100M;
}
# server ブロック(特定サイトのみ)
server {
client_max_body_size 100M;
}
# location ブロック(特定パスのみ)
location /upload {
client_max_body_size 100M;
}
🔍 チェックポイント: 値は M(メガバイト)、K(キロバイト)、G(ギガバイト)で指定可能
ステップ5: 設定の文法を確認する
sudo nginx -t
🔍 チェックポイント: syntax is ok と test is successful が表示されれば正常
ステップ6: nginx を reload する
sudo systemctl reload nginx
# または
sudo nginx -s reload
🔍 チェックポイント: エラーが出なければ reload 完了
ステップ7: 動作確認する
# curl でテスト用ファイルをアップロード(エンドポイントは環境に合わせる)
curl -X POST -F "file=@/path/to/testfile" https://example.com/upload
🔍 チェックポイント: 413 エラーが発生しなくなれば解決
NG行動(やってはいけないこと)
- client_max_body_size 0; を設定する - 制限なしになり、DoS攻撃のリスクが高まる
- 設定変更後に restart する - reload で十分。restart は接続が切断される
- 必要以上に大きな値を設定する - メモリ・ディスクを圧迫する可能性がある
- 設定ファイルのバックアップを取らない - 問題発生時に戻せなくなる
よくある質問(FAQ)
Q1: client_max_body_size のデフォルト値は?
A: 1MB(1m)。明示的に設定しない場合、この値が適用される。
Q2: PHP側にも同様の設定が必要?
A: 必要な場合がある。PHP の場合は php.ini の upload_max_filesize と post_max_size も確認する。nginx の制限を通過しても、PHP側で拒否される場合がある。
Q3: location ブロックと server ブロック、どちらが優先される?
A: より内側(具体的)なブロックが優先される。location > server > http の順で上書きされる。
関連するエラー・症状
- (関連記事準備中)
- (関連記事準備中)
- (関連記事準備中)
解決しない場合
- nginx 公式ドキュメント: https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
- 確認すべきログファイル:
/var/log/nginx/error.log- アプリケーションのログ(PHP-FPM、アプリケーションサーバーなど)
- 次に調べるキーワード:
proxy_request_bufferingclient_body_buffer_sizeclient_body_temp_path