Estou tentando depurar um problema de tempo limite que tenho com o Apache, há alguns meses.
O padrão se parece com isso:
A cada primeira solicitação de uma nova sessão (ou após algum tempo após a última solicitação), o navegador solicita instantaneamente as credenciais e, em seguida, envia a solicitação com autenticação básica. Então o servidor espera exatamente 1 minuto antes de enviar o resultado.
As solicitações subsequentes são atendidas instantaneamente, isso só acontece para solicitações após algum tempo (não consegui identificar exatamente ainda, entre 5 e 15 minutos).
O fato de o tempo de espera ser reproduzível exatamente 60 segundos me parece um tempo limite. Se eu cancelar a solicitação e clicar em recarregar, recebo o URL solicitado instantaneamente.
Como o prompt de senha também aparece instantaneamente, posso descartar um problema com o handshake SSL entre o cliente e o servidor ou problemas de DNS nessa perna. Não importa se eu solicito um script PHP ou um arquivo de texto em branco, o que também elimina um problema com scripts no servidor. Acho que o resultado do processo de autenticação é armazenado em cache por um tempo, portanto, não é necessário para solicitações subsequentes.
Observe que a autenticação sempre é bem-sucedida, portanto, também posso descartar um problema "o controlador de domínio não respondeu".
O Apache 2.4 está sendo executado no Windows Server 2012 R2. Está configurado para autenticação LDAP:
<Location />
AuthType Basic
AuthName "AD Login"
AuthBasicProvider ldap
LDAPReferrals Off
#AuthLDAPUrl ldap://dc01.domain.de:3268/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*)
#AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) STARTTLS
AuthLDAPUrl ldap://ad.domain.de:389/dc=ad,dc=domain,dc=de?sAMAccountName?sub?(objectClass=*) TLS
AuthLDAPBindDN "[email protected]"
AuthLDAPBindPassword "secret"
Require valid-user
Require all denied
</Location>
Como você pode ver, tentei diferentes tipos de conexão com os controladores de domínio, realmente não parece importar qual método de criptografia eu uso ou se eu passo a criptografia.
ad.domain.de resolve para vários controladores de domínio, mas o comportamento é o mesmo se eu me conectar a um controlador de domínio específico.
Sem entradas no logon de erro LogLevel info
, ainda estou hesitante em aumentá-lo para debug
, pois sei por experiência que tenho problemas para filtrar as informações de depuração geradas.
Existe alguma coisa que eu perdi ainda que eu possa usar para depurar o problema, ou eu tenho que passar pelo log de nível de depuração?
Após aumentar o nível de log para os módulos
authnz_ldap
eldap
a seguinte mensagem de erro apareceu no log de erro:Isso me levou a este relatório de bug do mod_ldap , que, embora tenha sido um erro de configuração, me apontou o problema real:
Fazendo algumas verificações rápidas para confirmar isso:
O valor padrão
MaxConnIdleTime
nas políticas de LDAP da Microsoft é 900 segundos, o que corresponde à minha observação de que o problema aparece novamente após 15 minutos. O atraso de 60 segundos também corresponde exatamente ao meu problema.De acordo com esse relatório de erro, o problema deve ser resolvido definindo
LDAPConnectionPoolTTL
um valor menorMaxConnIdleTime
e diferente do valor padrão -1, mas isso não funcionou para mim. Tive que definir o valor como0
, desabilitando a reutilização de conexões existentes.Não espero nenhum problema de desempenho com isso, pois os resultados do ldap são armazenados em cache de qualquer maneira.
A única coisa que permanece um mistério é por que esse problema ocorre apenas em nossa instância do Apache em execução no Windows, mas não nas instâncias do Apache em execução no Linux.