Ursache und Lösungsmethod des Fehlers 413 Request Entity Too Large | Vollständige Unterstützung für Nginx, PHP und Apache
Bei der Implementierung der Datei-Upload-Funktion kann plötzlich ein Fehler 「413 Request Entity Too Large」 im Browser angezeigt werden. Dieser Fehler ist ein HTTP-Statuscode, der zurückgegeben wird, wenn die Größe des gesendeten Request-Body das auf dem Server festgelegte Limit überschreitet. Dieser Artikel behandelt die Konfigurationsstellen für Nginx, PHP und Apache und erklärt systematisch von der Ursachenermittlung bis zur Lösung.
Was ist Fehler 413
Der HTTP-Statuscode 413 (in RFC 9110 in 「Content Too Large」 umbenannt) wird zurückgegeben, wenn der vom Client gesendete Request-Body die vom Server verarbeitbare Größe überschreitet. Dies beschränkt sich nicht nur auf Datei-Uploads; es tritt auch bei großen JSON-Payloads oder Base64-kodierten Daten auf.
Wenn dieser Fehler auftritt, lehnt der Server die Anfrage selbst ab, sodass die Verbindung unterbrochen wird, bevor die Verarbeitung den Code auf der Anwendungsseite (PHP, Python, etc.) erreicht. Infolgedessen bleibt kein Datensatz im Anwendungslog, und Sie müssen das Fehlerlog des Webservers überprüfen.
Nginx: Konfiguration von client_max_body_size
Nginx hat standardmäßig <code>client_max_body_size</code> auf <strong>1MB</strong> eingestellt. Bei Websites, die Bild- oder PDF-Uploads akzeptieren, muss dieser Wert fast sicher erhöht werden.
# /etc/nginx/nginx.conf(グローバル設定)
http {
# すべての仮想ホストに適用
client_max_body_size 100m;
server {
listen 80;
server_name example.com;
# このサーバーブロック内のみに適用(httpの値を上書き)
client_max_body_size 50m;
location /api/upload {
# このlocationのみに適用(serverの値を上書き)
client_max_body_size 200m;
proxy_pass http://backend;
}
}
}
Die Prioritätsreihenfolge der Einstellungen ist <code>location</code> > <code>server</code> > <code>http</code>. Wenn Sie das Limit nur für einen bestimmten Upload-Endpunkt erhöhen möchten, ist es Best Practice, dies im <code>location</code>-Block anzugeben.
# 設定変更後はNginxをリロード
sudo nginx -t # 構文チェック
sudo systemctl reload nginx # リロード(ダウンタイムなし)
# エラーログの確認
tail -f /var/log/nginx/error.log
# 413エラー時のログ例:
# client intended to send too large body: 10485760 bytes
PHP: Beziehung zwischen upload_max_filesize / post_max_size / memory_limit
PHP hat mehrere Größenlimits und Sie müssen die Beziehung zwischen ihnen richtig verstehen. Konfigurieren Sie immer so, dass die folgende Ungleichung erfüllt ist.
; php.ini の設定
; 必ず以下の関係を維持すること:
; upload_max_filesize <= post_max_size <= memory_limit
; 1ファイルあたりの最大サイズ
upload_max_filesize = 50M
; POSTリクエスト全体の最大サイズ(複数ファイルの合計 + フォームデータ)
post_max_size = 100M
; PHPスクリプトが使用できる最大メモリ
memory_limit = 256M
; ファイルアップロードの最大数
max_file_uploads = 20
; アップロードの一時保存先
upload_tmp_dir = /tmp
| Direktive | Standardwert | Auswirkungsbereich |
|---|---|---|
upload_max_filesize |
2M | Maximale Größe einer Datei |
post_max_size |
8M | Vollständige POST-Anfrage (Datei + Formulardaten) |
memory_limit |
128M | Maximale Speichernutzung während der Skriptausführung |
max_file_uploads |
20 | Anzahl der Dateien, die gleichzeitig hochgeladen werden können |
max_execution_time |
30 | Maximale Anzahl von Sekunden für die Skriptausführung (große Dateien benötigen eine Erweiterung) |
max_input_time |
60 | Maximale Anzahl von Sekunden für die Analyse von Eingabedaten |
// 現在のPHP設定値を確認するスクリプト
echo 'upload_max_filesize: ' . ini_get('upload_max_filesize') . PHP_EOL;
echo 'post_max_size: ' . ini_get('post_max_size') . PHP_EOL;
echo 'memory_limit: ' . ini_get('memory_limit') . PHP_EOL;
echo 'max_file_uploads: ' . ini_get('max_file_uploads') . PHP_EOL;
echo 'max_execution_time: ' . ini_get('max_execution_time') . PHP_EOL;
// php.ini の場所を確認
echo 'Loaded php.ini: ' . php_ini_loaded_file() . PHP_EOL;
Apache: Konfiguration von LimitRequestBody
In Apache setzen Sie das Limit für den Request-Body mit der Direktive <code>LimitRequestBody</code>. Der Standard ist 0 (unbegrenzt), aber es wird empfohlen, aus Sicherheitsgründen ein angemessenes Limit zu setzen.
# /etc/apache2/apache2.conf または .htaccess
# バイト単位で指定(100MB = 104857600 bytes)
# グローバル設定
LimitRequestBody 104857600
# 特定のディレクトリのみ
<Directory "/var/www/html/uploads">
LimitRequestBody 209715200
</Directory>
# 特定のURLパスのみ
<Location "/api/upload">
LimitRequestBody 209715200
</Location>
# .htaccess での設定(AllowOverride が必要)
# php_value upload_max_filesize 50M
# php_value post_max_size 100M
Häufige Kombinationsfehler
Das knifflige Problem bei Fehler 413 ist, dass es Größenlimits auf mehreren Schichten gibt. Selbst wenn Sie eine Einstellung ändern, wird die Anfrage häufig auf einer anderen Schicht blockiert.
Fall 1: Nginx erlaubt, aber von PHP abgelehnt
Wenn <code>client_max_body_size</code> von Nginx auf 100m eingestellt ist, aber <code>upload_max_filesize</code> von PHP bei 2M bleibt, passiert eine 50MB-Datei zwar das Nginx, wird aber von PHP ignoriert. In diesem Fall gibt HTTP Status 200 zurück, die Datei ist aber leer und <code>$_FILES</code> hat den Fehlercode 1 (UPLOAD_ERR_INI_SIZE) gesetzt.
Fall 2: upload_max_filesize ist ausreichend, aber post_max_size ist nicht ausreichend
Auch wenn Sie <code>upload_max_filesize = 50M</code> einstellen, wird die gesamte Anfrage, die 8MB überschreitet, verworfen, wenn <code>post_max_size = 8M</code> bleibt. In diesem Fall werden sowohl <code>$_POST</code> als auch <code>$_FILES</code> zu leeren Arrays, was ein verwirrend wirkendes Verhalten ist.
Fall 3: Übersehen in der Reverse-Proxy-Konfiguration
Bei Verwendung von Nginx als Reverse Proxy mit Apache + PHP-FPM im Backend müssen die Grenzen in Nginx, Apache und PHP festgelegt werden.
# Nginx リバースプロキシの設定
server {
client_max_body_size 100m;
location / {
proxy_pass http://127.0.0.1:8080;
# プロキシ関連のタイムアウトも延長(大容量ファイル対策)
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
# バッファリングの設定
proxy_request_buffering on;
proxy_buffering on;
proxy_buffer_size 128k;
proxy_buffers 4 256k;
}
}
Debugging-Verfahren
Wenn ein Fehler 413 auftritt, ermitteln Sie die Ursache anhand der folgenden Schritte.
# 1. どのレイヤーでブロックされているか確認
# Nginx のエラーログを確認
tail -n 50 /var/log/nginx/error.log | grep "too large"
# 2. PHP の設定値を確認
php -i | grep -E "upload_max|post_max|memory_limit"
# 3. PHP-FPM の設定ファイルを確認(php.ini とは別の場合がある)
php-fpm -i | grep -E "upload_max|post_max"
# または
find /etc -name "php.ini" -o -name "www.conf" | xargs grep -l "upload_max"
# 4. Apache の設定を確認
apachectl -t -D DUMP_RUN_CFG 2>/dev/null | grep -i limit
grep -r "LimitRequestBody" /etc/apache2/ /etc/httpd/
# 5. curl で実際にテスト(10MBのダミーファイルを送信)
dd if=/dev/zero of=/tmp/test_10mb.bin bs=1M count=10
curl -v -X POST -F "file=@/tmp/test_10mb.bin" https://example.com/api/upload
# 6. レスポンスヘッダーを確認
curl -I -X POST -F "file=@/tmp/test_10mb.bin" https://example.com/api/upload
Testmethode
Nach Änderung der Konfiguration ist es wichtig, Tests mit Dateien verschiedener Größen durchzuführen. DevLab stellt Dateien für Grenzwert-Tests zur Verfügung. Testen Sie vor und nach dem Höchstwert (Beispiel: Bei einem Limit von 50MB testen Sie mit 49MB, 50MB und 51MB) und bestätigen Sie, dass das Verhalten wie erwartet ist.
# JavaScript での送信テスト例
# 指定サイズのBlobを作成して送信する方法
# <script>
# async function testUpload(sizeMB) {
# const blob = new Blob(
# [new ArrayBuffer(sizeMB * 1024 * 1024)],
# { type: 'application/octet-stream' }
# );
# const formData = new FormData();
# formData.append('file', blob, 'test.bin');
#
# const response = await fetch('/api/upload', {
# method: 'POST',
# body: formData
# });
# console.log(sizeMB + 'MB:', response.status, response.statusText);
# }
#
# // 境界値テスト
# testUpload(1); // 1MB - 通常は成功
# testUpload(10); // 10MB - 設定による
# testUpload(50); // 50MB - 設定による
# testUpload(100); // 100MB - 通常は失敗
# </script>
Zusammenfassung der empfohlenen Einstellungen für jeden Server
| Schicht | Direktive | Empfohlener Wert (50MB Upload unterstützt) |
|---|---|---|
| Nginx | client_max_body_size |
60m (mit Puffer) |
| PHP | upload_max_filesize |
50M |
| PHP | post_max_size |
55M (größer als <code>upload_max_filesize</code>) |
| PHP | memory_limit |
256M |
| Apache | LimitRequestBody |
62914560 (60MB, in Bytes) |
Testdatei zur Verwendung in diesem Artikel (kostenlos)
- → <a href="/ja/files/threshold/png/10mb/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG Grenzwerttest 10MB</a> — Zum Testen von Dateien über der Nginx-Standardbeschränkung (1MB)
- → <a href="/ja/files/threshold/png/50mb/" class="text-primary-600 dark:text-primary-400 hover:underline">PNG Grenzwerttest 50MB</a> — Für upload_max_filesize-Grenzwerttest
- → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Liste von Grenzwert-Testdateien</a> — Grenzwert-Testdateien verschiedener Größen
- → <a href="/ja/files/images/png/1mb/" class="text-primary-600 dark:text-primary-400 hover:underline">1MB Test-PNG-Bild</a> — Zur Überprüfung des Betriebs bei kleiner Größe
Verwandte Artikel
- → <a href="/ja/blog/nginx-upload-config/" class="text-primary-600 dark:text-primary-400 hover:underline">Nginx Datei-Upload-Konfigurationsleitfaden | client_max_body_size und Proxy-Konfiguration</a>
- → <a href="/ja/blog/file-validation-checklist/" class="text-primary-600 dark:text-primary-400 hover:underline">Checkliste zur Implementierung der Dateiverifizierung für Web-Formulare</a>
- → <a href="/ja/blog/http-422-error/" class="text-primary-600 dark:text-primary-400 hover:underline">Ursachen und Lösungen für den Fehler 422 Unprocessable Entity</a>
- → <a href="/ja/blog/http-507-error/" class="text-primary-600 dark:text-primary-400 hover:underline">Ursachen und Lösungen für den Fehler 507 Insufficient Storage</a>