Saltar al contenido

Cómo configurar correctamente client_max_body_size en Nginx | Solución de problemas de límites de carga

Categoría: Nginx / Configuración del servidor
Este artículo está disponible actualmente solo en japonés. Estamos trabajando en las traducciones.

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 <code>client_max_body_size</code>. Sin embargo, simplemente corregir la configuración de Nginx a menudo no resuelve el problema, y se necesita una comprensión integral que incluya <code>upload_max_filesize</code> y <code>post_max_size</code> 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.

client_max_body_size 10m 5 MB POST 10 MB POST 20 MB POST nginx limit: 10 MB 200 OK 200 OK 413 Too Large Las solicitudes que superan el límite se rechazan con 413 antes del upstream
Diagrama: permitir/denegar según client_max_body_size

Valor predeterminado y función de client_max_body_size

Nginx tiene una directiva <code>client_max_body_size</code> que limita el tamaño máximo del cuerpo de solicitudes de clientes. El valor predeterminado es <code>1m</code> (1 MiB). Las solicitudes que superan este límite se rechazan inmediatamente con un error <code>413 Request Entity Too Large</code>.

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

<code>client_max_body_size</code> 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 <code>0</code> 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 <code>client_max_body_size</code> en nginx.conf Aumentar el valor
Límite de PHP excedido <code>upload_max_filesize</code> en php.ini Aumentar el valor
Límite excedido para todo el cuerpo POST <code>post_max_size</code> 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 <code>client_max_body_size</code> 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
  • <code>post_max_size</code> es 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 <code>proxy_read_timeout</code> 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 <code>client_max_body_size</code> en tu configuración actual de Nginx, es conveniente expandir todas las configuraciones con <code>nginx -T</code> 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

  • <strong>Error de unidad</strong>: <code>client_max_body_size 100</code> especifica bytes de forma predeterminada. Siempre especifica una unidad como <code>100m</code>
  • <strong>Descuido jerárquico</strong>: Crees que estás sobrescribiendo dentro de un bloque location, pero un bloque server o http de nivel superior está en vigor
  • <strong>Olvido de recarga</strong>: Los cambios de configuración no tendrán efecto a menos que ejecutes <code>nginx -s reload</code>
  • <strong>Múltiples bloques de servidor</strong>: Otro archivo conf.d cargado mediante include está en conflicto
  • <strong>Desajuste con PHP</strong>: Aunque aumente los límites de Nginx, si <code>upload_max_filesize</code> de PHP sigue siendo bajo, pueden ocurrir errores distintos de 413

Archivos de prueba para este artículo (gratis)

  • → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de archivos de prueba de valores límite</a> — Reproducir errores con archivos cerca del límite de client_max_body_size
  • → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de imágenes de prueba PNG</a> — Verificar límites de Nginx con imágenes PNG de varios tamaños

Artículos relacionados

  • → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">Cómo Probar Correctamente los Límites de Carga de Archivos</a>
  • → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Calcular con Precisión el Overhead de multipart/form-data</a>
  • → <a href="/ja/blog/mb-vs-mib-file-size/" class="text-primary-600 dark:text-primary-400 hover:underline">Diferencia Entre MB y MiB | Comprensión Correcta de las Unidades de Tamaño de Archivo</a>

Preguntas frecuentes

¿Cuál es el valor predeterminado de client_max_body_size en Nginx?

El valor predeterminado es 1m (1 megabyte). Las solicitudes que superen este límite resultarán en un error 413 Request Entity Too Large.

¿Dónde debe configurarse client_max_body_size?

Puede configurarlo en el bloque <code>http</code>, <code>server</code> o <code>location</code>. Si desea cambiar solo un endpoint específico, escriba en el bloque <code>location</code>.

¿Cuál es la relación entre la configuración de carga de Nginx y PHP?

Nginx verifica las solicitudes con client_max_body_size antes de que lleguen a PHP. También debe configurar upload_max_filesize y post_max_size de PHP en consecuencia.