O tempo limite do Apache SSL não está correspondendo às configurações

2

Eu tenho uma versão do servidor Apache do CentOS 6.7: servidor Apache / 2.4.7 (Unix) com as portas http e https configuradas. Eles são configurados da mesma forma, exceto para as configurações específicas do SSL.

As configurações mais relevantes são

KeepAlive on
MaxKeepAliveRequests 50
KeepAliveTimeout 65
Timeout 65
AcceptFilter https none

Não há arquivos .htaccess ou outros arquivos de configuração óbvios.

Mas quando eu testo o tempo limite da conexão bruta com um comando como

tempo telnet localhost 443 ou # tempo telnet localhost 80

Recebo resultados inesperados e errados.

Para o http, recebo

time telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

real    0m51.423s
user    0m0.001s
sys     0m0.002s

E para SSL https eu recebo

time telnet localhost 443
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

real    0m20.018s
user    0m0.001s
sys     0m0.002s

Como você pode ver, nigther está mostrando o tempo limite esperado de 65 segundos, http é de 50 segundos e https é de 20 segundos.

Não em nenhum dos arquivos de configuração é um tempo limite alternativo definido.

Eu também considerei as configurações de TCP do kernel. tcp_fin_timeout = 60 tcp_keepalive_time = 7200 tcp_synack_retries = 5

De onde vêm esses 20 segundos para o SSL? Por que as configurações keepalive e as configurações de tempo limite estão sendo ignoradas? Existe uma forma diferente de palavras-chave 'KeepAlive' e / ou 'Timeout' para SSL que a diferencia de http?

    
por Cosmo F 18.11.2015 / 20:18

2 respostas

1

Como você está no Linux, o recurso AcceptFilter está usando o TCP_DEFER_ACCEPT socket option no Linux. O código-fonte do Apache mostra que httpd usa um valor de opção de soquete de 30 segundos (codificado) para isso.

Se o seu Apache também tiver o módulo mod_reqtimeout , pode ser que o comportamento padrão de RequestReadTimeout está envolvido. Por padrão, RequestReadTimeout espera pelo menos 20 segundos para ler os cabeçalhos antes que o tempo limite da conexão do cliente.

Então, juntando tudo, talvez você verá 50 segundos de tempo limite para solicitações HTTP porque você não desativou o AcceptFilter para HTTP (apenas HTTPS), o que significa que você tem 30 segundos ( AcceptFilter ) mais 20 segundos ( RequestReadTimeout ). Mas para solicitações HTTPS, em que você desativou o AcceptFilter , suspeito que esteja encontrando apenas o tempo limite de 20 segundos devido a RequestReadTimeout .

Espero que isso ajude!

    
por 07.06.2016 / 19:29
1

Você tem o módulo reqtimeout do apache carregado?

Tente este comando para ver: apachectl -M | grep reqtimeout

Nesse caso, ele tem o padrão de 20 segundos de acordo com o link :

Syntax: RequestReadTimeout [header=timeout[-maxtimeout][,MinRate=rate] [body=timeout[-maxtimeout][,MinRate=rate]

Default: header=20-40,MinRate=500 body=20,MinRate=500

Você pode alterar este para 60 segundos (90 máx incluindo pedidos de aceitação) com o seguinte em seu /etc/httpd/conf/httpd.conf (ou algum tipo de arquivo vhosts.conf):

RequestReadTimeout header=60-90,MinRate=500 body=60-90,MinRate=500

Você também pode testá-lo antes / depois com o seguinte comando:

time openssl s_client -connect your.ip.address.here:443

Para mim:

ANTES

real    0m20.222s
user    0m0.012s
sys 0m0.000s

DEPOIS

real    1m0.527s
user    0m0.017s
sys 0m0.006s
    
por 22.05.2017 / 21:41