Servidor apache adormecido recusando conexões, mas não via localhost

2

Estou empurrando uma quantidade moderada de tráfego (cerca de 20 req / s) para uma API simples do PHP em execução em um servidor Apache. O servidor Apache slumbers (mod_status mal registra um pedido ativo), no entanto, eu estou vendo erros "Connection Refused" acontecendo periodicamente apesar disso. Tentei dissolver uname -n e MinSpareServers , mas sem efeito.

Eu executei um script de diagnóstico como este enquanto estava em carga, e eu veria cerca de 1 em cada 10 solicitações com "Conexão recusada"

while [ 1 ]; do echo "" | telnet <server> 80; sleep 1; done

No entanto, ao executar uma solicitação semelhante na máquina local, tudo bem.

while [ 1 ]; do echo "" | telnet localhost 80; sleep 1; done

Inicialmente, achei que todas as solicitações eram provenientes do mesmo cliente e o servidor estava sendo estrangulado. No entanto, enquanto estiver em carga, todos os outros hosts que tentarem se conectar verão o mesmo problema intermitente.

O fato de o host local se comportar de maneira diferente sugere que é um problema de rede, e não de apache, mas não tenho certeza de onde diagnosticar isso. Existe um log que eu possa inspecionar / habilitar para ver se a recusa da conexão está acontecendo em um nível O / S (ou possivelmente iptables).

Software relevante:

  • Ubuntu Lucid, kernel 2.6.33
  • Apache 2.2.14

ATUALIZAÇÃO:

Em nossa configuração do iptables eu posso ver a seguinte regra em "Chain TCPACCEPT":

655K 34M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x02 limit: avg 12/sec burst 24

Parece que esse limite de taxa poderia estar causando alguns desses erros de "Conexão recusada". Posso desativar o firewall por um curto período para ver se isso resolve o problema, mas suponho que essa regra esteja lá para ajudar a lidar com ataques do DOS. O limite atual parece pequeno demais para o avg e o burst. Quais são os limites mais sensíveis (eu posso ajustar isso em nossa configuração do iptables)?

    
por Ross 10.05.2012 / 01:32

1 resposta

1

Se isso está acontecendo periodicamente, é mais provável que não iptables, mas para ver as regras do iptables, execute

sudo iptables -L -n -v

Seus logs do iptables estarão sob / var / log, mas podem variar dependendo da sua configuração. Verifique no diretório /etc/rsyslog.d para ver se há um arquivo de configuração para o seu local de registro do iptables.

Você também pode usar netstat ou lsof para ver o que está acontecendo na porta também.

netstat -an | grep "80.*LIST"

lsof -i :80

Finalmente, você pode querer fazer uma captura de rede para ver se há TCP RSTs sendo enviados de volta ou simplesmente não há resposta voltando - use o tcpdump para isso.

Atualização para atualização de perguntas:

O que acontece se você desabilitar essa regra do iptables? Ele faz um par de coisas, mas um deles parece estar restringindo segmentos tcp que só tem o pacote syn definido para 12 / seg de média com um limite de burst. Se você está enviando uma média de 20 / seg, acredito que você está excedendo os limites definidos na regra do iptables.

Portanto, você pode desativar essa regra no firewall para testá-la (eu não recomendo desligar completamente o firewall) ou você pode modificá-la para dizer 22 / seg com um burst de 36.

Eu penso seriamente em modificar a configuração com a qual você não está familiarizado ou não tem certeza de porque ela está lá, antes de modificá-la.

    
por 10.05.2012 / 18:36