É incomum que você esteja usando o MPM "prefork" no que parece ser essencialmente um proxy reverso, o MPM híbrido "trabalhador" tem melhor escalabilidade, mas esse não é o problema.
A mitigação de DoS geralmente é melhor tratada (se não pelo seu provedor de serviços de Internet) no dispositivo front-end que finaliza as solicitações do cliente, a partir de sua descrição é um balanceador de carga, não o Apache. Qualquer balanceador de carga competente será ciente do HTTP (ou seja, "Camada 7"), isso provavelmente resultará no buffer de solicitações HTTP. Isso também se aplica se o balanceador de carga estiver encerrando o HTTPS, mas menos se o balanceador de carga estiver simplesmente retransmitindo as conexões HTTPS (pois não pode ver as solicitações HTTP para armazená-las em buffer). Também não se aplica se o seu balanceador de carga for um simples balanceador de carga do tipo "Camada 3/4" NAT.
Quanto à possível causa dos tempos limite:
- sua instância SSL
KeepAliveTimeout
é igual ao tempo limite de leitura do cabeçalhoRequestReadTimeout
, é possível que haja uma corrida em que o tempo limite do keepalive seja atingido no meio da solicitação / cabeçalhos de entrada do cliente. Se eu tentar reproduzir isso, além de erros AH01382 também recebo AH01991 (falha na leitura do filtro de entrada SSL) e AH00567 (solicitação falhou: erro ao ler os cabeçalhos). Isso pode não explicar todos os problemas. - solicitações de clientes malformadas, não incomuns no passado (por exemplo, CR / LF extra após o POST, solicitações incompletas ao tentar novamente após um erro). Eu não sei de nada atual, depende da sua base de clientes e, mais importante, da conectividade deles.
- pode haver um bug semelhante a este recente que causou timeouts espúrios com "evento "MPM.
Para reproduzir tempos de espera:
$ openssl s_client -connect myhost:443
GET / HTTP/1.1
Host: myhost.whatever.com
[server reply goes here]
GET / HTTP/1.1
Host:
Você pode criar scripts para facilitar, caso contrário você deve digitar / colar a primeira solicitação e os cabeçalhos dentro dos 10s configurados, depois digitar mas não concluir a segunda solicitação nos próximos 10s, você deve ter pelo menos uma linha completa (a solicitação) enviada para a segunda solicitação, depois é só esperar.
Diminuir o KeepAliveTimeout (o padrão é 5 segundos) pode ajudar. Observe que KeepAliveTimeout é o tempo para receber uma solicitação completa.
Acho que o próximo passo pode ser mod_log_forensic
.
Em relação às conexões com o back-end via AJP, você está usando "ping" no Apache Balancer
configuration ? Se eu entendi o seu sistema corretamente, a configuração do Tomcat que você deu não se aplica a conexões do Apache httpd ao Tomcat. Veja as opções aqui .
/-> apache httpd + ajp -\ /-> tomcat/jboss
client -> load-balancer < > firewall <
\-> apache httpd + ajp -/ \-> tomcat/jboss