Подсчет трафика в nginx

О большой практической пользе awk

Постановка задачи: есть Linux-сервер, на котором живёт сотня-другая виртуальных хостов. Сервер работает под управлением nginx. Нужно реализовать подсчет трафика с отображением «живой» статистики. Вариант решения: Таблица для хранения данных: CREATE TABLE `traf_stats` ( `in` INTEGER UNSIGNED NOT NULL, /* если качаются файлы размером более 4 ГБ, нужно использовать BIGINT */ `out` INTEGER UNSIGNED NOT NULL, [...]

← Вернуться к полной версии записи «Подсчет трафика в nginx»…

Автор: ; опубликовано в: Linux, MySQL, nginx, Администрирование; метки: Linux, MySQL, nginx, лог, трафик
23
Янв
2009

RSS Комментарии к статье «Подсчет трафика в nginx» (9)  »

  1. japplegame

    Изящное решение.
    К сожалению недостаточно знаю mysql, посему возник вопрос:
    Если по каким либо причинам будет на некоторое время нарушена связь с сервером MySQL, то что произойдет с описываемой связкой? Она обвалится или просто будут пропущены логи за промежуток с нарушенной связью?

    • Если честно, я не проверял — копаю сейчас в сторону написания своего модуля для nginx.

      Но по идее, в логах просто появится промежуток за время с нарушенной связью.

  2. japplegame

    Кстати, можно обойтись без awk, ведь можно задать log_format таким образом, чтобы сразу создать нужный SQL-запрос.
    А если потребуется какая-то сложная логика, можно воспользоваться хранимыми процедурами MySQL.

  3. japplegame

    И еще. Я проверил, утилита mysql не вываливается в случае обрыва соединения с сервером, а культурно пытается подконнектится при каждом запросе. Так что действительно, будут просто промежутки в БД.
    Что касаемо модуля для nginx, то у меня тоже возникла идея создать модуль на базе ngx_http_log_module. Добавить туда возможность записи лога в БД. Правда сразу появились вопросы. Дело в том, что при работе с БД могут возникнуть задержки, которые (вследствие архитектуры nginx) будут блокировать обработку ВСЕХ текущих запросов. Неприятно, однако. Правда, вероятно, есть возможность работать с MySQL в “неблокируещем” режиме, в частности, применять INSERT DELAYED. В итоге я рещил, что проще скрестить tail и mysql, написать маленький демон, который будет, скажем, раз в секунду читать лог nginx и писать его в БД.
    Тем не менее, даже просто ради приобретения опыта, я с удовольствием посодействую вам в создании этого модуля, начиная от тестирования и может быть каких-то идей, заканчивая собственно программированием (неплохо владею C и C++).

    • INSERT DELAYED работает только с MyISAM,я не уверен, целесообразно ли использовать MyISAM при большой посещаемости ресурса.

      Просто уже неоднократно видел, как от большого числа вставок падают майисамовские таблицыю

      У меня была идея заставить модуль писать в сокет, на другом конце которого будет висеть демон и передавать запросы непосредственно MySQL (возможно, даже с некоторой обработкой данных).

      • japplegame

        Ну если именно так подходить к вопросу, то зачем вообще заморачиваться? Читать прямо из файла, без всяких сокетов.
        Можно еще отдельный поток (thread) создать, который и будет писать в MySQL. А чтобы сервер поменьше мучать, запросы накапливать в буфере и отправлять одним большим INSERTом. А в случае обрыва связи временно буферизовать логи в файле, как это делает mod_log_sql для апача.

        • Потоки не особо кросс-платформенные. Плюс к тому, при сборке добавляется лишняя зависимость — libmysql15.

          Надо в коде nginx основательно покопаться…

  4. [...] статье “Подсчёт трафика в nginx” я приводил один из возможных вариантов живого [...]

Пожалуйста, не используйте эту форму для комментирования! Данная форма предназначена исключительно для ботов.

Оставить комментарий к записи «Подсчет трафика в nginx»

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Оставляя комментарий, вы выражаете своё согласие с Правилами комментирования.

Подписаться, не комментируя

गते गते पारगते पारसंगते बोधि स्वाहा