ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 

  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА














     АРХИВ :: Apache-Talk
Apache-Talk mailing list archive (apache-talk@lists.lexa.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[apache-talk] Announce: mod_uid 1.0.0



Привет,

всех с новым годом и всем новогодний подарок - модуль для правильного
подсчета пользователей.

ftp://ftp.lexa.ru/pub/apache-rus/contrib/mod_uid-1.0.0.tar.gz

Выдержка из документации (удалены куски про директивы и инсталляцию):


                            mod_uid.c version 1.0

    модуль, выдающий "правильные" cookies для подсчета посетителей сайта

Оглавление

  I. Copyright
  II. Назначение
  III. Установка
  IV. Конфигурация
  V. Формат cookie
  VI. Что можно записать в лог
  VII. Почему не mod_usertrack
  VIII. TODO

I. Copyright

Copyright (C) 2000-2002 Alex Tutubalin, lexa@lexa.ru

Допускается распространение и использование в производных продуктах на
условиях аналогичных Apache License - должен быть сохранен копирайт автора и
ссылка на http://www.lexa.ru/lexa, производный продукт не должен называться
mod_uid

Прототип этого модуля был сделан автором при работе в компании Rambler,
данная версия cущественно переработана.

Автор благодарит Дмитрия Хрусталева за ценные советы.

II. Описание

Стандартные средства Apache не дают разумных средств трэкинга пользователей
(о проблемах mod_usertrack написано ниже), данный модуль их предоставляет.

Что он делает:

   * если пользователь отдал заголовок Cookie с правильным cookie-name, то
     записывает эту Cookie в notes c именем uid_got (потом, соответственно,
     это можно записать в лог)
   * если пользователь пришел без нужной cookie - выдает ему заголовок
     Set-Cookie и записывает выданную cookie в notes с именем uid_set (и это
     можно тоже записать в лог)
   * если включена встроенная поддержка P3P, то при выдаче заголовка
     Set-Cookie выдается и заголовок P3P

Достоинства:

   * в cookie присутствует дата ее выдачи и "номер сервиса" (т.е. число,
     задаваемое при настройке), что позволяет понять когда пользователь
     пришел на наш сайт впервые и куда именно он пришел.
   * поддержана многосерверная работа - при аккуратной настройке (либо при
     полном ее отсутствии :) гарантируется, что выданная пользователю cookie
     будет уникальна
   * выданная пользователю и полученная от него cookie не смешиваются в
     лог-файле
   * cookies имеют длину 128 бит, что позволяет для работы с ними в
     анализаторе логов (быстрый поиск и т.п.) использовать готовый код,
     предназначенный для работы с IPv6 (например, libpatricia)
   * Поддержана P3P (в минимальном объеме)

[ установка и конфигурация описаны в документации модуля ]

III. Формат Cookie

Формат куки: В двоичном виде: unsigned int cookie[4], где

     cookie[0] - "номер сервиса" (задается через UIDService)
     cookie[1] - время выдачи (unix time)
     cookie[2] - pid процесса выдавшего куку
     cookie[3] - старшие 24 бита - уникальный секвенсер в пределах процесса
     (стартовое значение - 0x030303),
     младшие 8 бит - номер версии куки (сейчас - 2)

Эти 128 бит переводятся в network byte order, кодируются в base64 и отдаются
клиенту (в версии 1 все отдавалось в host order, что затрудняло поддержку
кластеров серверов с разной архитектурой).

Уникальность

Очевидно, что полную гарантию может дать только страховой полис и если в
пределах одного домена будет выдано более чем 2^128 cookies, то какие-то из
них будут повторяться. Однако при разработке формата cookie были приложены
усиля к тому, чтобы при разумном количестве cookies они были бы уникальными.

  1. В случае, если "номера сервиса" уникален (свой у каждого сервера) в
     пределах данного домена, разные серверы будут с гарантией выдавать
     разные cookies.
  2. Включение в cookie времени выдачи и pid подразумевает, что pid-ы разных
     процессов не повторяются в течение одной секунды. На всех известных мне
     Unix-системах это так - pid-ы монотонно возрастают до некоего максимума
     - 2^16 или более - т.е. для повторения cookie[1]/cookie[2] в рамках
     одного сервера нужно делать больше чем 2^16 fork() в секунду, что на
     сегодняшний день малореально.
  3. Секвенсер (старшие 24 бита в cookie[3]) позволяет удостовериться в
     уникальности cookie в пределах одного процесса в течение одной секунды.
     Разрядность секвенсера позволяет выдавать до 1.0E+07 cookies одним
     процессом в секунду.

VI. Что можно записать в лог

mod_uid пишет в notes ("заметки") одно из двух значений:

  1. Если от клиента была получена cookie, она помещается в note "uid_got"
  2. Если клиенту была выдана cookie, она помещается в note "uid_set"

Cookies пишутся в лог как 4 32-битных 16-ричных числа в host-order (т.е. для
версии 2 производится преобразование network-host, для версии 1 - все
пишется как есть в предположении, что архитектура сервера с момента выдачи
cookie не изменилась) В LogFormat эти notes можно использовать в виде
\"%{uid_got}n\" и \"%{uid_set}n\" соответственно.
При использовании LogFormat такого вида:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" 
\"%{uid_got}n\" \"%{uid_set}n  combined_cookie

мы получим примерно такие записи в log-е

Выданная клиенту Cookie:
62.104.212.93 - - [05/Jan/2002:00:02:06 +0300] "GET / HTTP/1.0" 200
13487 "-" "Mozilla/4.0 (compatible; MSIE 5.5; Windows 98; Win 9x
4.90)" "-" "ruid=000000013C36184E00009A2100002901"

Полученная от клиента Cookie:
216.136.145.172 - - [05/Jan/2002:00:14:59 +0300] "GET /buttons/but-support-e.gif
 HTTP/1.0" 200 252 "http://apache.lexa.ru/english/meta-http-eng.html";
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
"ruid=000000013C361B5000009A0100009501" "-"

Такой формат без проблем понимается распространенными анализаторами логов,
включая Webtrends, который по такому логу с удовольствием считает Visitors.

VII. Почему не mod_usertrack из поставки Apache

Потому что у него есть несколько недостатков:

   * нет гарантий, что двум пользователям не будет выдана одинаковая cookie,
     хотя конечно включение getpid(), remote_ip и времени до миллисекунд
     сводит эту вероятность к минимуму
   * нет поддержки многосерверной работы - а в этом случае возможность
     выдачи одинаковой cookie возрастает
   * в логе хочется иметь возможность видеть и выданную пользователю cookie,
     причем видеть ее отдельно, mod_usertrack их перемешивает.
   * Хочется иметь "номер сервиса" (см. выше) - чтобы понимать на какой из
     наших сервисов пользователь зашел при первом своем визите.

VIII. TODO

  1. Поддержка разных форматов (Netscape/Cookie/Cookie2 - как в
     mod_usertrack), но только если появится реальная необходимость - пока
     таковой необходимости не замечено.
  2. Есть смутное подозрение, что на multithread-apache и многопроцессорных
     машине инкремент sequencer-а нужно обложить mutex-ами



Алексей Тутубалин
mailto: lexa@lexa.ru
=============================================================================
=               Apache-Talk@lists.lexa.ru mailing list                      =
Mail "unsubscribe apache-talk" to majordomo@lists.lexa.ru if you want to quit.
=       Archive avaliable at http://www.lexa.ru/apache-talk                 =



 




Copyright © Lexa Software, 1996-2009.