Odocumentação para a diretiva timeoutno apache afirma que:
Ao gravar dados no cliente, o tempo de espera pela confirmação de um pacote se o buffer de envio estiver cheio.
Mas se a pilha TCP não receber um ACK, ela reenviará o pacote. Então, como essas duas coisas interagem? O tempo limite do apache define um limite geral de novas tentativas antes de interromper a conexão?
O contexto é uma situação em que curl pulls falham periodicamente com o erro:
curl: (18) transferência fechada com XXXXXX bytes restantes para leitura
e estou tentando determinar o motivo exato.
Tendo feito um rastreamento do Wireshark no cliente e no servidor, parece que o servidor (apache) está encerrando a sessão prematuramente por algum motivo (portanto, não um firewall ou outro forçando-o a fechar). Isso está acontecendo com dois tipos de arquivos que são baixados com frequência: arquivos binários grandes (100 MB MP4) e arquivos de texto pequenos (~ 10 KB). Para os arquivos grandes, há uma mensagem de log do Apache:
O tempo limite especificado expirou: [client:] AH01581: Tempo limite ao gravar dados para URI /xxxx/xxxx/xxxx/ no cliente
Meu melhor palpite atual é que isso é apenas congestionamento de rede, já que as falhas tendem a se agrupar em determinados momentos, mas gostaria de definir isso ainda mais, se possível.
Configuração:
CentOS 6.6
Apache 2.4.16
Enrolar 7.19.7