Isso acontece porque o nginx tenta ler o backend (php-fpm no seu caso) o mais rápido possível, armazenando em buffer a resposta primeiro na memória (limitada pelas configurações proxy_buffer_size
e proxy_buffers
) e depois no disco ( até o tamanho especificado em proxy_max_temp_file_size
, o padrão é 1 GiB). Portanto, o script "streaming" faz o download do arquivo o mais rápido possível, mesmo que a velocidade de download do cliente seja mais lenta.
Veja a documentação do módulo proxy nginx http - há vários parâmetros que podem ser ajustados e a maioria deles pode ser definida por local (para que você possa alterar o comportamento do buffer apenas para algumas URLs). Você pode até mesmo retornar o cabeçalho X-Accel-Buffering do back-end para desativar o buffer, ou melhor ainda, retorne o cabeçalho X-Accel-Redirect para fazer o nginx transmitir o arquivo sem vincular um processo de backend.