Skip to content

Como configurar corretamente client_max_body_size no Nginx | Solução de problemas de limite de upload

Categoria:Configuração de Nginx e Servidor
Este artigo está disponível atualmente apenas em japonês. As versões traduzidas serão publicadas sequencialmente.

Ao implementar uploads de arquivo no Nginx, é muito comum encontrar o problema em que 「arquivos pequenos são enviados, mas arquivos grandes resultam em erro 413」. A maioria das causas é configuração insuficiente de <code>client_max_body_size</code>. No entanto, mesmo corrigindo apenas a configuração do Nginx, muitos casos não são resolvidos. É necessário entender completamente as configurações de <code>upload_max_filesize</code> e <code>post_max_size</code> do PHP, bem como configurações de timeout. Este artigo explica sistematicamente todos os itens de configuração relacionados aos limites de upload.

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 Requisições que excedem o limite são rejeitadas com 413 antes de chegar ao upstream
Figura: Determinação de aprovação/rejeição por <code>client_max_body_size</code>

Valor padrão e função do client_max_body_size

O Nginx possui uma diretiva chamada <code>client_max_body_size</code> que limita o tamanho máximo do corpo da solicitação do cliente. O valor padrão é <code>1m</code> (1 MiB). Solicitações que excedem isso são imediatamente rejeitadas como erro <code>413 Request Entity Too Large</code>.

O padrão é 1m, que é extremamente pequeno, portanto o limite é atingido imediatamente mesmo ao fazer upload de uma única imagem ou PDF. Em ambientes de produção reais, este valor deve ser aumentado adequadamente dependendo do uso.

Local de configuração: diferenças entre http / server / location

<code>client_max_body_size</code> pode ser escrito em qualquer nível de configuração do Nginx (http / server / location). As configurações com escopo mais específico têm prioridade.

# 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;
        }
    }
}

É uma abordagem preferível do ponto de vista de segurança definir um valor grande apenas para o endpoint dedicado de upload e manter valores pequenos para os demais. Para permitir tamanho ilimitado, especifique <code>0</code>, mas isso não é recomendado pois aumenta o risco de ataques DoS.

Causa e solução do erro 413 Request Entity Too Large

Vamos organizar as causas e medidas para resolver o erro 413.

Causa Pontos de verificação Método de solução
Limite do Nginx excedido <code>client_max_body_size</code> em nginx.conf Aumentar o valor
Limite do PHP excedido <code>upload_max_filesize</code> em php.ini Aumentar o valor
Limite do corpo POST inteiro excedido <code>post_max_size</code> em php.ini Aumentar acima de upload_max_filesize
Limitações do proxy reverso Configuração upstream do Nginx ou balanceador de carga Verificar o proxy de cada camada

É necessário recarregar o Nginx após alterar a configuração.

# 設定の文法チェック
nginx -t

# 設定のリロード(サービス停止なし)
nginx -s reload

# または systemd 経由
systemctl reload nginx

Relação entre upload_max_filesize / post_max_size do PHP

Aumentar apenas o <code>client_max_body_size</code> do Nginx não é suficiente. Quando o backend é PHP, existem limitações independentes no nível do PHP. O upload será bem-sucedido apenas quando essas três configurações tiverem valores apropriados.

; 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

A relação dos valores de configuração importantes é a seguinte.

  • client_max_body_size(Nginx)post_max_size(PHP)upload_max_filesize(PHP)
  • Se o Nginx rejeitar a solicitação, o processamento não chegará até o PHP
  • <code>post_max_size</code> é o limite de tamanho para o corpo POST inteiro, incluindo uploads de múltiplos arquivos e campos de formulário além de arquivos

A importância de proxy_read_timeout / proxy_send_timeout

Para uploads de arquivos grandes, a configuração de timeout também é importante. O padrão <code>proxy_read_timeout</code> é de 60 segundos, e se o upload levar muito tempo, o processo será interrompido.

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;
}

É recomendado configurar valores de timeout separadamente para o endpoint de upload e o endpoint de API normal.

Configuração no Docker (mount de nginx.conf)

Em um ambiente Docker, um arquivo nginx.conf ou conf.d personalizado é montado no contêiner para refletir as configurações.

# 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 verificação de configuração

Para verificar qual valor <code>client_max_body_size</code> tem na configuração atual do Nginx, é conveniente expandir todas as configurações com <code>nginx -T</code> e depois usar grep.

# 全設定を展開して 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"

Erros de configuração comuns e como resolvê-los

  • <strong>Erro de unidade</strong>: <code>client_max_body_size 100</code> será interpretado como bytes. Sempre adicione a unidade como em <code>100m</code>
  • <strong>Negligência de hierarquia</strong>: quando você tenta sobrescrever dentro do bloco location, mas o bloco server ou http de nível superior está em vigor
  • <strong>Esquecer de recarregar</strong>: as alterações no arquivo de configuração não serão refletidas sem executar <code>nginx -s reload</code>
  • <strong>Múltiplos blocos server</strong>: conflito entre diferentes arquivos conf.d carregados com include
  • <strong>Incompatibilidade com PHP</strong>: Mesmo aumentando o Nginx, o <code>upload_max_filesize</code> do PHP permanece baixo e gera erros além do 413

Arquivo de teste disponível para usar neste artigo (gratuito)

  • → <a href="/ja/files/threshold/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de arquivos de teste de valores limite</a> — Reproduzir erros com arquivos próximos aos valores de configuração de client_max_body_size
  • → <a href="/ja/files/images/png/" class="text-primary-600 dark:text-primary-400 hover:underline">Lista de imagens de teste PNG</a> — Verificar limite do Nginx com PNG em vários tamanhos

Artigos relacionados

  • → <a href="/ja/blog/how-to-test-upload-limit/" class="text-primary-600 dark:text-primary-400 hover:underline">Como testar corretamente o limite de upload de arquivo</a>
  • → <a href="/ja/blog/multipart-form-data-overhead/" class="text-primary-600 dark:text-primary-400 hover:underline">Calcular com precisão o 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">Diferença entre MB e MiB | Compreensão correta das unidades de tamanho de arquivo</a>

Perguntas frequentes

Qual é o valor padrão de client_max_body_size no Nginx?

O padrão é 1m (1 megabyte). Solicitações que excedem isso resultam em um erro <code>413 Request Entity Too Large</code>.

Onde client_max_body_size deve ser configurado?

Pode ser configurado em um dos blocos <code>http</code>, <code>server</code> ou <code>location</code>. Se deseja alterar apenas um endpoint específico, escreva no bloco <code>location</code>.

Qual é a relação entre as configurações de upload do Nginx e PHP?

A solicitação do Nginx é verificada por client_max_body_size antes de chegar ao PHP. É necessário também configurar upload_max_filesize e post_max_size no lado do PHP.