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?