Como posso observar as conexões atuais no meu servidor Apache?

32

Estou hospedando vários hosts virtuais usando o Apache em uma configuração básica do LAMP com a ajuda do Webmin / Virtualmin. Eu estou procurando uma ferramenta top-like em que eu possa monitorar as conexões atuais. A parte de hospedagem virtual parece estar me causando problemas aqui. Aqui está o que eu tentei:

  • netstat - Eu posso ver as conexões, mas elas mostram como se estivessem usando meu domínio principal, por exemplo, mydomain.com:www .
  • iftop - Eu gosto muito disso, mas desvantagem semelhante como netstat : não mostra o host virtual.
  • apachetop - parece não mostrar informações para todos os meus hosts virtuais. Estou fazendo o log para separar arquivos de log personalizados, o que eu suspeito ser a causa do porque não funciona.
  • ntop , darkstat , MRTG , bwm-ng , IPTraf - não está funcionando também.

Então, basicamente, estou procurando algo semelhante à saída atual de netstat , mas para incluir o host virtual para a solicitação, por exemplo: avirtualsite.com:www .

    
por ppumkin 10.01.2013 / 18:10

6 respostas

32

A resposta de Andrea Corbellini explica por que não funciona com as ferramentas que você está usando e como funciona o Virtual Hosting . Aqui está a maneira mais simples que eu posso pensar para fazê-lo no Apache ...

mod_status irá ajudá-lo.

Isenção de responsabilidade: não posso dizer como isso é feito no Webmin - eu uso arquivos de configuração nus para configurar servidores. Aqui está apenas uma visão geral básica das etapas.

É uma ferramenta top , mas representada como uma página da web. Ele lista o estado atual diretamente consultado do Apache, portanto, não depende da análise de arquivos de log como apachetop .

  1. Ativar mod_status :

    sudo a2enmod status
    
  2. Conceda acesso a você mesmo.

    • Abra /etc/apache2/mods-enabled/status.conf e edite:
    • Defina ExtendedStatus para On (opcional, mas mais impressionante e um pouco mais lento)
    • Dentro do <Location /server-status> , acrescente seu endereço IP à linha com a diretiva Allow . Exemplo:

      Allow from 127.0.0.1 ::1 66.77.88.99
      
  3. Reinicie o Apache:

    sudo service apache2 restart
    
  4. Aproveite a ferramenta no seu navegador, por exemplo: http://1.2.3.4/server-status

    Será parecido com esta captura de tela de exemplo .

  5. Continue pressionando F5 para obter atualizações. Ou obtenha um plug-in de navegador incrível e veja-o atualizado!

Webmin

adendo pelo OP para futuros visitantes

No Webmin, os passos básicos sobre o módulo Status podem ser encontrados aqui:

  • Servidores - > Servidor Web Apache - > Configurar módulos do Apache
  • Selecione o módulo Status e clique em Ativar módulos selecionados

    
por gertvdijk 10.01.2013 / 18:42
14

Todas as ferramentas que você está tentando nunca lhe darão a resposta certa. A razão é que a informação que você está solicitando é perdida quando a conexão é feita.

Vamos usar um exemplo: suponha que o seu servidor web tenha um endereço IP ( 1.2.3.4 ) e dois nomes de host ( a.mydomain.com e b .mydomain.com ) que resolvem esse endereço IP.

O que acontece quando você usa seu navegador da web favorito quando visita a.mydomain.com ?

  1. O navegador pergunta ao seu servidor DNS o endereço IP a.mydomain.com corresponde a.
  2. O servidor DNS informa ao navegador que o endereço é 1.2.3.4 .
  3. O navegador da web se conecta a 1.2.3.4 .

Então, netstat & amp; co. só sei que há uma conexão de entrada feita para 1.2.3.4 . O motivo pelo qual você vê um nome de host em vez de um endereço IP é que o endereço IP tem um registro rDNS, portanto, netstat prefere mostrar isso em vez do IP, porque é melhor. Tente netstat -n (ou remova o registro rDNS) e você verá o endereço IP.

Mas isso não é tudo: quando eu disse que as informações sobre o nome do host que foi usado para fazer a conexão foram perdidas, eu não estava totalmente certo. Do ponto de vista da pilha TCP / IP, essa frase é verdadeira. Mas se vemos as coisas do ponto de vista do protocolo HTTP, as coisas são diferentes. Em cada solicitação de HTTP, há um Host: header que contém o nome do host que foi usado pelo navegador para fazer a solicitação.

Portanto, em resumo, você deve verificar os arquivos de log do seu servidor web. O servidor web é o serviço que lida com as solicitações HTTP e, portanto, o único serviço que conhece o nome do host "original".

    
por Andrea Corbellini 10.01.2013 / 18:34
11

Outra maneira é digitar

tail -f /var/log/apache2/access.log

no seu terminal

    
por niksmac 17.03.2014 / 06:19
4

Você pode verificar todos os ips conectados na porta 80 com este bash

netstat -tn 2>/dev/null | grep :80 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head

Nota: se você quiser ver outra porta, mude 80

OUTPUT:

 19 x.174.143.1
 13 x.175.135.1
  9 x.68.135.1
  8 x.144.87.1
  7 x.68.150.1
  6 x.92.4.1
  6 x.188.23.1
  5 x.190.164.1
  4 x.189.156.1
    
por DarckBlezzer 09.07.2016 / 19:48
1

Você pode verificar isso com:

netstat -na | grep 'ESTA'
    
por user1717828 09.04.2016 / 22:45
1

Se você quer pid, user e command:

lsof  -i  tcp:443,80 | egrep 'PID|->' | sort -k9
    
por Vextor 13.09.2016 / 21:39