Cómo configurar correctamente client_max_body_size en Nginx | Solución de problemas de límites de carga
Al implementar carga de archivos en Nginx, el problema de "los archivos pequeños se cargan bien pero los archivos grandes resultan en error 413" es muy frecuente. La causa es casi siempre la configuración insuficiente de client_max_body_size. Sin embargo, simplemente corregir la configuración de Nginx a menudo no resuelve el problema, y se necesita una comprensión integral que incluya upload_max_filesize y post_max_size de PHP, así como la configuración de tiempo de espera. Este artículo explica sistemáticamente todos los elementos de configuración relacionados con los límites de carga.
Valor predeterminado y función de client_max_body_size
Nginx tiene una directiva client_max_body_size que limita el tamaño máximo del cuerpo de solicitudes de clientes. El valor predeterminado es 1m (1 MiB). Las solicitudes que superan este límite se rechazan inmediatamente con un error 413 Request Entity Too Large.
Como el valor predeterminado es tan pequeño como 1m, rápidamente alcanzarás el límite incluso al cargar una sola imagen o PDF. En entornos de producción reales, necesitas aumentar este valor apropiadamente según tu caso de uso.
Ubicación de configuración: diferencias entre http / server / location
client_max_body_size se puede configurar en cualquier nivel de configuración de Nginx (http / server / location). La configuración de alcance más específico tiene prioridad.
# http ブロック(全サーバー共通)
http {
client_max_body_size 10m;
server {
listen 80;
server_name example.com;
# server ブロック(このバーチャルホスト全体)
client_max_body_size 50m;
location /upload {
# location ブロック(このパスのみ)
# より大きなファイルを許可したい場合
client_max_body_size 200m;
proxy_pass http://app;
}
location /api {
# APIエンドポイントはデフォルト(1m)のままにする例
client_max_body_size 1m;
}
}
}
Establecer un valor más grande solo para puntos finales específicos de carga mientras se mantienen otros pequeños es la mejor práctica de seguridad. Puede especificar 0 para ilimitado, pero esto aumenta el riesgo de ataque DoS y no se recomienda.
Error 413 Request Entity Too Large: causas y soluciones
Organizaremos las causas y contramedidas para los errores 413.
| Causa | Puntos de Verificación | Medida correctiva |
|---|---|---|
| Límite de Nginx superado | client_max_body_size en nginx.conf |
Aumentar el valor |
| Límite de PHP excedido | upload_max_filesize en php.ini |
Aumentar el valor |
| Límite excedido para todo el cuerpo POST | post_max_size en php.ini |
Hacer más grande que upload_max_filesize |
| Límites del proxy inverso | Configuración de Nginx o balanceador de carga ascendente | Verificar proxies en cada etapa |
Después de cambiar la configuración de Nginx, debe recargar siempre.
# 設定の文法チェック
nginx -t
# 設定のリロード(サービス停止なし)
nginx -s reload
# または systemd 経由
systemctl reload nginx
Relación con upload_max_filesize / post_max_size de PHP
Simplemente aumentar client_max_body_size de Nginx no es suficiente. Si el backend es PHP, también hay límites independientes a nivel de PHP. La carga tiene éxito solo cuando los tres de estos parámetros se establecen en valores apropiados.
; php.ini の設定
; 1ファイルあたりの上限
upload_max_filesize = 100M
; POSTリクエスト全体の上限(upload_max_filesize より大きくする)
; multipart/form-data のオーバーヘッド分を見込んで多めに設定
post_max_size = 110M
; メモリ上限(post_max_size より大きくする)
memory_limit = 256M
; アップロード処理の実行時間(大容量ファイル用に延ばす)
max_execution_time = 300
max_input_time = 300
Las relaciones entre valores de configuración importantes son las siguientes.
- client_max_body_size(Nginx) ≥ post_max_size(PHP) ≥ upload_max_filesize(PHP)
- Si Nginx rechaza una solicitud, el procesamiento nunca llega a PHP
post_max_sizees el límite de tamaño para todo el cuerpo POST, incluyendo cargas de archivos múltiples y campos de formulario sin archivos
Importancia de proxy_read_timeout / proxy_send_timeout
Al cargar archivos grandes, la configuración de tiempo de espera también es importante. El proxy_read_timeout predeterminado es de 60 segundos, y si la carga toma tiempo, el proceso se interrumpirá.
location /upload {
client_max_body_size 500m;
proxy_pass http://app_backend;
# バックエンドからのレスポンス待機時間
# 大容量ファイルの処理には長めに設定
proxy_read_timeout 600s;
# クライアントへのデータ送信待機時間
proxy_send_timeout 600s;
# バックエンドへの接続タイムアウト
proxy_connect_timeout 60s;
# クライアントのリクエストボディ受信タイムアウト
# 2回の連続した読み取り操作の間の時間
client_body_timeout 120s;
}
Se recomienda establecer valores de tiempo de espera diferentes para puntos finales de carga y puntos finales de API regulares.
Configuración en Docker (Montaje de nginx.conf)
En entornos Docker, los archivos nginx.conf o conf.d personalizados se montan en contenedores para aplicar la configuración.
# Dockerfile でのカスタム設定追加
FROM nginx:alpine
# カスタム設定ファイルをコピー
COPY ./nginx/conf.d/upload.conf /etc/nginx/conf.d/upload.conf
# デフォルト設定を完全に置き換える場合
# COPY ./nginx/nginx.conf /etc/nginx/nginx.conf
# docker-compose.yml でのボリュームマウント
version: '3.8'
services:
nginx:
image: nginx:alpine
volumes:
# ディレクトリごとマウント(変更が即反映される)
- ./nginx/conf.d:/etc/nginx/conf.d
# または特定ファイルだけマウント
# - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
# nginx/conf.d/upload.conf
server {
listen 80;
server_name localhost;
# グローバルのアップロード上限
client_max_body_size 100m;
location / {
proxy_pass http://app:9000;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
location /upload {
client_max_body_size 500m;
proxy_pass http://app:9000;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
}
}
Comando de verificación de configuración
Para verificar qué valor tiene client_max_body_size en tu configuración actual de Nginx, es conveniente expandir todas las configuraciones con nginx -T y luego hacer grep en el resultado.
# 全設定を展開して client_max_body_size を検索
nginx -T | grep -i body_size
# 出力例:
# client_max_body_size 1m; ← デフォルト(http ブロック)
# client_max_body_size 100m; ← カスタム設定(server ブロック)
# 設定ファイルのパスも確認
nginx -T | grep "# configuration"
# 特定の設定ファイルだけチェック
nginx -t -c /etc/nginx/nginx.conf
# 現在読み込まれている設定のダンプ
nginx -T 2>/dev/null | grep -A1 "client_max"
Errores de configuración comunes y cómo solucionarlos
- Error de unidad:
client_max_body_size 100especifica bytes de forma predeterminada. Siempre especifica una unidad como100m - Descuido jerárquico: Crees que estás sobrescribiendo dentro de un bloque location, pero un bloque server o http de nivel superior está en vigor
- Olvido de recarga: Los cambios de configuración no tendrán efecto a menos que ejecutes
nginx -s reload - Múltiples bloques de servidor: Otro archivo conf.d cargado mediante include está en conflicto
- Desajuste con PHP: Aunque aumente los límites de Nginx, si
upload_max_filesizede PHP sigue siendo bajo, pueden ocurrir errores distintos de 413
Archivos de prueba para este artículo (gratis)
- → Lista de archivos de prueba de valores límite — Reproducir errores con archivos cerca del límite de client_max_body_size
- → Lista de imágenes de prueba PNG — Verificar límites de Nginx con imágenes PNG de varios tamaños