Как я могу следить за текущими подключениями на моем веб-сервере Apache?

Я размещаю довольно много виртуальных хостов, используя Apache в базовом LAMP, настроенном с помощью Webmin / Virtualmin. Я ищу топовый инструмент, с помощью которого я мог бы отслеживать текущие соединения. Часть виртуального хостинга, похоже, доставляет мне здесь неприятности. Вот что я пробовал:

  • netstat - Я вижу соединения, но они показывают мне, как будто все они используют мой основной домен, например mydomain.com:www.
  • iftop - Мне это очень нравится, но такой же недостаток, как netstat: не показывает виртуальный хост.
  • apachetop - кажется, отображается не информация для всех моих виртуальных хостов. Я регистрируюсь в отдельных пользовательских файлах журнала, что, как я подозреваю, является причиной того, почему это не работает.
  • ntop, darkstat, MRTG, bwm-ng, IPTraf - тоже не работает.

Итак, в принципе, я ищу что-то похожее на текущий вывод netstat, но для включения виртуального хоста, для которого требуется запрос, например: avirtualsite.com:www.

Ответ Андреа Корбеллини объясняет вам, почему это не будет работать с инструментами, которые вы используете, и как работает виртуальный хостинг. Вот самый простой способ, который я могу придумать, чтобы сделать это в Apache...

mod_status я помогу вам выбраться.

Отказ от ответственности: Я не могу сказать, как это делается в Webmin - я использую голые конфигурационные файлы для настройки серверов. Вот лишь общий обзор шагов.

Это top-похожий инструмент, но представленный в виде веб-страницы. В нем отображается текущее состояние, непосредственно запрашиваемое из Apache, поэтому оно не зависит от разбора файлов журнала, таких как apachetop делает.

  1. Включить mod_status:

    sudo a2enmod status
  2. Предоставьте себе доступ.

    • Открыть /etc/apache2/mods-enabled/status.conf и редактировать:
    • Набор ExtendedStatus к On (необязательно, но более впечатляюще и немного медленнее)
    • В рамках <Location /server-status>, добавлять ваш IP-адрес на строку с Allow директива. Пример:

      Allow from 127.0.0.1 ::1 66.77.88.99
  3. Перезапустить Apache:

    sudo service apache2 restart
  4. Воспользуйтесь инструментом в вашем браузере, например: http://1.2.3.4/server-status

    Это будет выглядеть так этот пример скриншота.

  5. Продолжайте нажимать F5 чтобы получать обновления. Или получите потрясающий плагин для браузера и наблюдайте, как он обновляется!


Вебмин

дополнение от OP для будущих посетителей

В Webmin основные шаги, связанные с модулем состояния, можно найти здесь:

  • Серверы> - Веб-сервер Apache> - Настройка модулей Apache
  • Выберите Статус модуль и нажмите кнопку click Включить Выбранные Модули

enter image description here

Все инструменты, которые вы пробуете, никогда не дадут вам правильного ответа. Причина в том, что запрашиваемая вами информация теряется при установлении соединения.

Давайте воспользуемся примером: предположим, что ваш веб-сервер имеет один IP-адрес (1.2.3.4) и два имени хоста (a.mydomain.com и b.mydomain.com), которые разрешаются на этот IP-адрес.

Что происходит, когда вы используете свой любимый веб-браузер при посещении a.mydomain.com?

  1. Браузер запрашивает у вашего DNS-сервера IP-адрес a.mydomain.com соответствует.
  2. DNS-сервер сообщает браузеру, что адрес 1.2.3.4.
  3. Веб-браузер подключается к 1.2.3.4.

Так netstat & amp; co. знают только о том, что есть входящее соединение, установленное с 1.2.3.4. Причина, по которой вы видите имя хоста вместо IP-адреса, заключается в том, что IP-адрес имеет запись rDNS, поэтому netstat предпочитает показывать это вместо IP-адреса, потому что так приятнее. Попробуй netstat -n (или удалите запись rDNS), и вы увидите IP-адрес.

Но это еще не все: когда я сказал, что информация об имени хоста, которая использовалась для установления соединения, была потеряна, я был не совсем прав. С точки зрения стека TCP/IP это предложение верно. Но если мы посмотрим на вещи с точки зрения протокола HTTP, то все будет по-другому. В каждом HTTP-запросе есть Host: заголовок, содержащий имя хоста, которое было использовано браузером для выполнения запроса.

Итак, вкратце, вам следует просмотреть файлы журналов вашего веб-сервера. Веб-сервер - это служба, которая обрабатывает HTTP-запросы и, следовательно, единственная служба, которая знает об "исходном" имени хоста.

Другой способ - ввести

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

в вашем терминале

Вы можете проверить все IP-адреса, подключенные к порту 80, с помощью этого bash

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

Примечание: если вы хотите увидеть другой порт, измените 80

выход:

 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

Вы можете проверить это с помощью:

netstat -na | grep 'ESTA'

Если вам нужен pid, пользователь и команда:

lsof  -i  tcp:443,80 | egrep 'PID|->' | sort -k9

Вы также можете использовать GoAccess интерактивно просматривать ваших текущих посетителей. Для этой цели он анализирует ваш журнал доступа Apache и показывает кучу статистических данных о вашем сайте.

Я использую Apache2 - Установку LAMP по умолчанию для использования с VirtualMin / Webmin - я только что нашел apachetop - но это отслеживает только файл, который я предоставляю… черт возьми, не все серверы…