症状

nginxでファイルアップロード時に「413 Request Entity Too Large」エラーが表示される。

結論:まずこれを確認

  1. client_max_body_size の現在値を確認する
  2. アップロードしようとしているファイルサイズと比較する
  3. 設定値を適切な値に変更し、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 oktest 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.iniupload_max_filesizepost_max_size も確認する。nginx の制限を通過しても、PHP側で拒否される場合がある。

Q3: location ブロックと server ブロック、どちらが優先される?

A: より内側(具体的)なブロックが優先される。location > server > http の順で上書きされる。

関連するエラー・症状

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

解決しない場合