Идея модуля для nginx - счетчик

Eugene my-subscr at mail.ru
Fri Mar 10 15:26:40 MSK 2006


День добрый!

Модуль 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 хоть на С--


Хотел бы обсудить со всеми и особенно с Игорем такой модуль.
Наверняка, не у меня одного было желание и небходимость сделать счетчик.


С уважением,
Евгений






More information about the nginx-ru mailing list