Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Идея модуля для nginx - счетчик
День добрый!
Модуль empty_gif навеял идею нового модуля - счетчика посещений.
Функционал получается близкий к уже существующему в empty_gif. C той
разницей, что нужно вести реестр посетителей.
Для большей гибкости предлагаю не вводить какие-то заранее
вкомпилированные способы учета, а сделать
учет по хешу строки, заданной в конфигурации.
Например, если нам нужно считать общую посещаемость по ip адресам, то
объявляем хеш навроде такого:
counter_hash_1 = "$remote_ip"
Если хотим считать с учетом страниц на которые ходят пользователи, то
берем хеш типа такого:
counter_hash_2 = "$remote_ip $request_uri".
Будет очень хорошо, если можно будет использовать все внутренние
переменные nginx для создания хеша.
В этом хеше можно отделить посещения разных страниц с одного и того же
ip адреса.
Значением хеша может быть число "попаданий" в него. Либо, если идти на
шаг дальше и вводить защиту от накруток
и случайных срабатываний, то можно записывать массив из 2 элементов:
счетчика и времени последнего срабатывания + заданный в конфиге таймаут.
Теперь, если приходит запрос, то мы проверяем если текущее время меньше,
чем записанное в хеше, то игнорируем запрос. Если же больше, то
увеличиваем счетчик и записываем в поле "время" текущее время
увеличенное на таймаут для данного хеша.
Для ускорения работы хеш можно хранить в памяти или где-нить в /proc для
линукса.
Также надо придумать как доставать значения. Можно использовать вариант,
который сделан в счетчике сетевых пакетов ipcad.
Первая комада типа checkout заставляет его создать новый пустой хеш и
записывать новые данные в него. Старый при этом просто висит в памяти.
Следующий сигнал, например dump, говорит, что надо сбросить старый хеш в
файл и очистить эту область памяти.
Теперь счетчик может считать - надо только отображать значения на кнопке.
Наврядли будет хорошей идеей жестко вкомпилировать код для создания
кнопки, т.к. это лишит гибкости, и если надо будет изменить фон, то
придется пересобирать сервер. Как вариант, можно сделать подключение
внешних программ для отрисовки через fastcgi и передавать им параметры.
Что-то навроде такого:
location /counter/hosts {
fastcgi_pass localhost:12345;
fastcgi_param QUERY_STRING
hash1=$counter_hash_1_value&hash2=$counter_hash_2_value;
и т.п.
}
Программа сама разберется как отрисовать эти значения. На чем она будет
написана? На чем удобнее человеку: хоть на php хоть на С--
Хотел бы обсудить со всеми и особенно с Игорем такой модуль.
Наверняка, не у меня одного было желание и небходимость сделать счетчик.
С уважением,
Евгений
|