O Apache 2.4 envia 502 erros quando o backend envia 401 em uploads grandes de arquivos

2

Usando o Apache 2.4.25 (Windows) e o servidor back-end Tomcat 8 (Windows).

Temos alguns softwares clientes que enviam arquivos usando HTTPS em uma sessão autenticada que é intermediada pelo Apache para o Tomcat. No entanto, se uma sessão autenticada não for usada (ou a sessão expirar), o servidor Tomcat de back-end envia uma resposta HTTP 401. No entanto, o Apache retorna um erro 502 para o cliente.

Log de acesso ao Tomcat:

127.0.0.1 - - [21/Apr/2017:18:30:38 +0000] "POST /upload/10507.wav HTTP/1.1" 401 39

Log de acesso do Apache:

10.8.21.23 - - [21/Apr/2017:18:30:27 +0000] "POST /upload/10507.wav HTTP/1.1" 502 232 14030

O log de erros do Apache:

[Fri Apr 21 18:30:39.770715 2017] [proxy:error] [pid 33652:tid 120896] (OS 10053)An established connection was aborted by the software in your host machine.  : [client 10.8.21.23:62863] AH01084: pass request body failed to 127.0.0.1:8888 (127.0.0.1)
[Fri Apr 21 18:30:39.770715 2017] [proxy_http:error] [pid 33652:tid 120896] [client 10.8.21.23:62863] AH01097: pass request body failed to 127.0.0.1:8888 (127.0.0.1) from 10.8.21.23 ()

Esta questão tem um sintoma semelhante ao seguinte caso e bug, mas com um erro diferente nos logs:

Eu tentei várias combinações das seguintes variáveis de ambiente sem sorte:

  • force-proxy-pedido-set 1 de SetEnv 1
  • SetEnv proxy-nokeepalive 1
  • SetEnv proxy inicial não agrupado 1
  • RequestHeader desativado Aguarde antecipadamente
  • SetEnv proxy-sendcl 1

Em solicitações com um corpo menor, ele representa o 401 como esperado. Em solicitações maiores (> 1 MB ou mais, mas não consistente), ele envia o 502. O processamento de back-end não precisa ler o corpo inteiro antes de decidir se a sessão existe ou não, para que possa disparar o 401 assim que ele ler o cabeçalho. Com arquivos acima de 10 MB, ele pode ser reproduzido 100% do tempo, mesmo se estiver em proxy para um servidor local de back-end.

Especula-se que isso ocorre quando o Apache não leu completamente a solicitação inteira antes de receber a resposta 401. Ele vê isso como um 'erro de proxy' em vez de transmitir a resposta 401 'correta'.

Tentamos com um balanceador de carga diferente (AWS ELB) e ele envia de volta o 401 em todas as circunstâncias, por isso duvido que seja enviado um comportamento esperado do 502.

Existe alguma variável de ambiente do Apache que estou perdendo para tentar? Isso é um bug do Apache?

    
por MJB 21.04.2017 / 22:13

1 resposta

0

A correção foi modificar a configuração do Tomcat para 'maxSwallowSize', que possui bytes engole do Tomcat antes que a resposta seja enviada.

link

maxSwallowSize

O número máximo de bytes do corpo da solicitação (excluindo a sobrecarga da codificação de transferência) que será engolido pelo Tomcat para um upload cancelado. Um upload cancelado é quando o Tomcat sabe que o corpo da solicitação será ignorado, mas o cliente ainda o envia. Se o Tomcat não engolir o corpo, é improvável que o cliente veja a resposta. Se não for especificado, o padrão 2097152 (2 megabytes) será usado. Um valor menor que zero indica que nenhum limite deve ser imposto.

    
por 02.05.2017 / 22:44