Pular para conteúdo

upload: Módulo NGINX para lidar com uploads de arquivos

Instalação

Você pode instalar este módulo em qualquer distribuição baseada em RHEL, incluindo, mas não se limitando a:

  • RedHat Enterprise Linux 7, 8, 9 e 10
  • CentOS 7, 8, 9
  • AlmaLinux 8, 9
  • Rocky Linux 8, 9
  • Amazon Linux 2 e Amazon Linux 2023
dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install nginx-module-upload
yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install nginx-module-upload

Habilite o módulo adicionando o seguinte no topo de /etc/nginx/nginx.conf:

load_module modules/ngx_http_upload_module.so;

Este documento descreve o nginx-module-upload v2.4.0 lançado em 03 de fevereiro de 2026.


codecov

Um módulo para nginx para lidar com uploads de arquivos usando codificação multipart/form-data (RFC 1867) e uploads retomáveis de acordo com este protocolo.

Descrição

O módulo analisa o corpo da requisição armazenando todos os arquivos sendo enviados para um diretório especificado pela diretiva upload_store. Os arquivos são então removidos do corpo e a requisição alterada é então passada para um local especificado pela diretiva upload_pass, permitindo assim o tratamento arbitrário dos arquivos enviados. Cada um dos campos de arquivo é substituído por um conjunto de campos especificados pela diretiva upload_set_form_field. O conteúdo de cada arquivo enviado pode então ser lido de um arquivo especificado pela variável $upload_tmp_path ou o arquivo pode ser simplesmente movido para o destino final. A remoção dos arquivos de saída é controlada pela diretiva upload_cleanup. Se uma requisição tiver um método diferente de POST, o módulo retorna o erro 405 (Method not allowed). Requisições com tais métodos podem ser processadas em um local alternativo através da diretiva error_page.

Diretivas

upload_pass

Sintaxe: upload_pass location
Padrão:
Contexto: server,location

Especifica o local para o qual passar o corpo da requisição. Os campos de arquivo serão removidos e substituídos por campos, contendo as informações necessárias para lidar com os arquivos enviados.

upload_resumable

Sintaxe: upload_resumable on | off
Padrão: upload_resumable off
Contexto: main,server,location

Habilita uploads retomáveis.

upload_store

Sintaxe: upload_store directory [level1 [level2]] ...
Padrão:
Contexto: server,location

Especifica um diretório no qual os arquivos de saída serão salvos. O diretório pode ser com hash. Neste caso, todos os subdiretórios devem existir antes de iniciar o nginx.

upload_state_store

Sintaxe: upload_state_store directory [level1 [level2]] ...
Padrão:
Contexto: server,location

Especifica um diretório que conterá os arquivos de estado para uploads retomáveis. O diretório pode ser com hash. Neste caso, todos os subdiretórios devem existir antes de iniciar o nginx.

upload_store_access

Sintaxe: upload_store_access mode
Padrão: upload_store_access user:rw
Contexto: server,location

Especifica o modo de acesso que será usado para criar os arquivos de saída.

upload_set_form_field

Sintaxe: upload_set_form_field name value
Padrão:
Contexto: server,location

Especifica um ou mais campos de formulário a serem gerados para cada arquivo enviado no corpo da requisição passado para o backend. Tanto name quanto value podem conter as seguintes variáveis especiais:

  • $upload_field_name: o nome do campo de arquivo original
  • $upload_content_type: o tipo de conteúdo do arquivo enviado
  • $upload_file_name: o nome original do arquivo sendo enviado com os elementos de caminho iniciais em notação DOS e UNIX removidos. Ou seja, "D:\Documents And Settings\My Dcouments\My Pictures\Picture.jpg" será convertido para "Picture.jpg" e "/etc/passwd" será convertido para "passwd".
  • $upload_tmp_path: o caminho onde o conteúdo do arquivo original está sendo armazenado. O nome do arquivo de saída consiste em 10 dígitos e é gerado com o mesmo algoritmo da diretiva proxy_temp_path.

Estas variáveis são válidas apenas durante o processamento de uma parte do corpo da requisição original.

Exemplo de uso:

upload_set_form_field $upload_field_name.name "$upload_file_name";
upload_set_form_field $upload_field_name.content_type "$upload_content_type";
upload_set_form_field $upload_field_name.path "$upload_tmp_path";

upload_aggregate_form_field

Sintaxe: upload_aggregate_form_field name value
Padrão:
Contexto: server,location

Especifica um ou mais campos de formulário contendo atributos agregados a serem gerados para cada arquivo enviado no corpo da requisição passado para o backend. Tanto name quanto value podem conter variáveis padrão do nginx, variáveis da diretiva upload_set_form_field e as seguintes variáveis especiais adicionais:

  • $upload_file_md5: checksum MD5 do arquivo
  • $upload_file_md5_uc: checksum MD5 do arquivo em letras maiúsculas
  • $upload_file_sha1: checksum SHA1 do arquivo
  • $upload_file_sha1_uc: checksum SHA1 do arquivo em letras maiúsculas
  • $upload_file_sha256: checksum SHA256 do arquivo
  • $upload_file_sha256_uc: checksum SHA256 do arquivo em letras maiúsculas
  • $upload_file_sha512: checksum SHA512 do arquivo
  • $upload_file_sha512_uc: checksum SHA512 do arquivo em letras maiúsculas
  • $upload_file_crc32: valor hexadecimal do CRC32 do arquivo
  • $upload_file_size: tamanho do arquivo em bytes
  • $upload_file_number: número ordinal do arquivo no corpo da requisição

O valor de um campo especificado por esta diretiva é avaliado após o upload bem-sucedido do arquivo, portanto estas variáveis são válidas apenas no final do processamento de uma parte do corpo da requisição original.

Aviso: as variáveis $upload_file_md5, $upload_file_md5_uc, $upload_file_sha1 e $upload_file_sha1_uc usam recursos adicionais para calcular os checksums MD5 e SHA1.

Exemplo de uso:

upload_aggregate_form_field $upload_field_name.md5 "$upload_file_md5";
upload_aggregate_form_field $upload_field_name.size "$upload_file_size";

upload_pass_form_field

Sintaxe: upload_pass_form_field regex
Padrão:
Contexto: server,location

Especifica um padrão regex para nomes de campos que serão passados para o backend a partir do corpo da requisição original. Esta diretiva pode ser especificada múltiplas vezes por local. O campo será passado para o backend assim que o primeiro padrão corresponder. Para ambientes sem PCRE, esta diretiva especifica o nome exato de um campo a ser passado para o backend. Se a diretiva for omitida, nenhum campo será passado para o backend pelo cliente.

Exemplo de uso:

upload_pass_form_field "^submit$|^description$";

Para ambientes sem PCRE:

upload_pass_form_field "submit";
upload_pass_form_field "description";

upload_cleanup

Sintaxe: upload_cleanup status/range ...
Padrão:
Contexto: server,location

Especifica os status HTTP após a geração dos quais todos os arquivos enviados com sucesso na requisição atual serão removidos. Usado para limpeza após falha do backend ou do servidor. O backend também pode sinalizar explicitamente um status de erro se não precisar dos arquivos enviados por algum motivo. O status HTTP deve ser um valor numérico no intervalo 400-599, sem zeros à esquerda permitidos. Intervalos de status podem ser especificados com um hífen.

Exemplo de uso:

upload_cleanup 400 404 499 500-505;

upload_buffer_size

Sintaxe: upload_buffer_size size
Padrão: tamanho da página de memória em bytes
Contexto: server,location

Tamanho em bytes do buffer de escrita que será usado para acumular dados de arquivo e gravá-los em disco. Esta diretiva destina-se a ser usada para equilibrar o uso de memória versus a taxa de chamadas de sistema.

upload_max_part_header_len

Sintaxe: upload_max_part_header_len size
Padrão: 512
Contexto: server,location

Especifica o comprimento máximo do cabeçalho da parte em bytes. Determina o tamanho do buffer que será usado para acumular os cabeçalhos das partes.

upload_max_file_size

Sintaxe: upload_max_file_size size
Padrão: 0
Contexto: main,server,location

Especifica o tamanho máximo do arquivo. Arquivos maiores que o valor desta diretiva serão omitidos. Esta diretiva especifica um limite "soft", no sentido de que, após encontrar um arquivo maior que o limite especificado, o nginx continuará a processar o corpo da requisição, tentando receber os arquivos restantes. Para um limite "hard", a diretiva client_max_body_size deve ser usada. O valor zero para esta diretiva especifica que nenhuma restrição de tamanho de arquivo deve ser aplicada.

upload_limit_rate

Sintaxe: upload_limit_rate rate
Padrão: 0
Contexto: main,server,location

Especifica o limite de taxa de upload em bytes por segundo. Zero significa que a taxa é ilimitada.

upload_max_output_body_len

Sintaxe: upload_max_output_body_len size
Padrão: 100k
Contexto: main,server,location

Especifica o comprimento máximo do corpo de saída. Isso evita o acúmulo de campos de formulário que não são de arquivo na memória. Sempre que o corpo de saída exceder o limite especificado, o erro 413 (Request entity too large) será gerado. O valor zero para esta diretiva especifica que nenhuma restrição ao comprimento do corpo de saída deve ser aplicada.

upload_tame_arrays

Sintaxe: upload_tame_arrays on | off
Padrão: off
Contexto: main,server,location

Especifica se os colchetes nos nomes dos campos de arquivo devem ser removidos (necessário para arrays PHP).

upload_pass_args

Sintaxe: upload_pass_args on | off
Padrão: off
Contexto: main,server,location

Habilita o encaminhamento de argumentos de consulta para o local especificado por upload_pass. Ineficaz com locais nomeados. Exemplo:

<form action="/upload/?id=5">
<!-- ... -->
location /upload/ {
    upload_pass /internal_upload/;
    upload_pass_args on;
}

## ...

location /internal_upload/ {
    # ...
    proxy_pass http://backend;
}

Neste exemplo, o backend recebe a URI da requisição "/upload?id=5". No caso de upload_pass_args off, o backend recebe "/upload".

Exemplo de configuração

server {
    client_max_body_size 100m;
    listen 80;

    # Upload form should be submitted to this location
    location /upload/ {
        # Pass altered request body to this location
        upload_pass @test;

        # Store files to this directory
        # The directory is hashed, subdirectories 0 1 2 3 4 5 6 7 8 9 should exist
        upload_store /tmp 1;

        # Allow uploaded files to be read only by user
        upload_store_access user:r;

        # Set specified fields in request body
        upload_set_form_field $upload_field_name.name "$upload_file_name";
        upload_set_form_field $upload_field_name.content_type "$upload_content_type";
        upload_set_form_field $upload_field_name.path "$upload_tmp_path";

        # Inform backend about hash and size of a file
        upload_aggregate_form_field "$upload_field_name.md5" "$upload_file_md5";
        upload_aggregate_form_field "$upload_field_name.size" "$upload_file_size";

        upload_pass_form_field "^submit$|^description$";

        upload_cleanup 400 404 499 500-505;
    }

    # Pass altered request body to a backend
    location @test {
        proxy_pass http://localhost:8080;
    }
}
<form name="upload" method="POST" enctype="multipart/form-data" action="/upload/">
<input type="file" name="file1">
<input type="file" name="file2">
<input type="hidden" name="test" value="value">
<input type="submit" name="submit" value="Upload">
</form>