<-
Apache > HTTP Server > Documentation > Version 2.0 > Modules

Apache Модуль mod_unique_id

Description: предоставляет переменной окружающей среды уникальный идентификатор для каждого запроса
Status: расширение
Module Identifier: unique_id_module
Source File: mod_unique_id.c

резюме

этот модуль обеспечивает волшебный символ для каждого запроса, который, как гарантируют, будет уникальным поперек "всех" запросов при очень определенных условиях. Уникальный идентификатор даже уникален поперек многократных машин в должным образом формируемой группе машин. Переменная окружающей среды UNIQUE_ID собирается идентификатор для каждого запроса. Уникальные идентификаторы полезны по различным причинам, которые являются вне возможностей этого документа.

директивы

этот модуль не обеспечивает никаких директив.

темы

top

Theory

сначала резюме резюмирует из того, как Apache сервер воздействует на машины Unix. Эта особенность в настоящее время не поддерживается на Windows NT. На машинах Unix, Apache создает несколько детей, запросы процесса детей по одному. Каждый ребенок может служить многократным запросам в его целой жизни. Ради этого обсуждения, дети не разделяют никаких данных друг с другом. Мы обратимся к детям как процессы httpd .

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

машины в вашей группе должны удовлетворить эти требования. (Даже если Вы имеете только одну машину, Вы должны синхронизировать ее часы с NTP),

насколько операционные предположения системы идут, мы предполагаем, что pids (обрабатывают иды), пригодный в 32 битах. Если операционная система использует больше чем 32 бита для изодромного с предварением, устанавливание тривиально, но должно быть выполнено в кодексе.

учитывая те предположения, в единственном пункте вовремя мы можем идентифицировать любой процесс httpd на любой машине в группе от всех других процессов httpd. IP адрес машины и изодромный с предварением из процесса httpd достаточны, чтобы сделать это. Так, чтобы производить уникальные идентификаторы для запросов мы должны только различить различные пункты вовремя.

чтобы отличать время, мы будем использовать Unix timestamp (секунды с 1 января 1970 UTC), и 16-битовый прилавок. timestamp имеет только одну вторую степень детализации, таким образом прилавок используется, чтобы представить до 65536 ценностей в течение единственной секунды. Четверка (ip_addr, изодромный с предварением, time_stamp, прилавок) является достаточным, чтобы перечислить 65536 запросов в секунду в процесс httpd. Есть проблемы однако с изодромным с предварением повторным использованием в течение долгого времени, и прилавок используется, чтобы облегчить эту проблему.

когда httpd ребенок создан, прилавок калибруется с (текущие микросекунды, разделенные на 10) модуль 65536 (эта формула была выбрана, чтобы устранить некоторые проблемы разницы с низкими битами заказа таймеров микросекунды на некоторых системах). Когда уникальный идентификатор произведен, используемый отпечаток времени - время, запрос достиг сервера сети. Прилавок увеличен каждый раз, идентификатор произведен (и позволен перевернуться).

ядро производит изодромное с предварением для каждого процесса, поскольку это придает процессу форму вилки, и pids позволяют перевернуться (они с 16 битами на многих Unixes, но более новые системы расширились к 32 битам). Таким образом в течение долгого времени изодромное с предварением то же самое многократно используется. Однако, если это не многократно используется в течение той же самой секунды, это не разрушает уникальность нашей четверки. Таким образом, мы предполагаем, что система не порождает 65536 процессов в одном втором интервале (это могут даже быть 32768 процессов на некотором Unixes, но даже это, вероятно, не случится).

предположим, что время повторяет себя по некоторым причинам. Таким образом, предположите, что часы системы ввернуты, и это повторно посещает в прошлый раз (или это - слишком далеко вперед, перезагружено правильно, и затем повторно посещает будущее время). В этом случае мы можем легко показать, что мы можем стать изодромными с предварением и повторное использование отпечатка времени. Выбор initializer для прилавка предназначен, чтобы помочь побеждать это. Отметьте, что мы действительно хотим, чтобы случайное число калибровало прилавок, но нет никаких с готовностью доступных чисел на большинстве систем ( то есть. , Вы не можете использовать рэнд (), потому что Вы должны отобрать генератор, и не можете отобрать это со временем, потому что время, по крайней мере в одном втором решении, повторило себя). Это не прекрасная защита.

насколько хороший защита - это? Предположим, что одна из ваших машин служит самое большее 500 запросам в секунду (который является очень разумным верхним, связанным при этом письме, потому что системы вообще более чем только сгребают статические файлы). Чтобы сделать это, это будет требовать множества детей, который зависит, сколько параллельных клиентов Вы имеете. Но мы будем пессимистическими и предполагать, что единственный ребенок в состоянии служить 500 запросам в секунду. Есть 1000 возможных стартовых прилавков, оценивает такой, что две последовательности 500 запросов накладываются. Таким образом есть шанс на 1.5 %, что, если время (в одном втором решении) повторяет себя, этот ребенок повторит встречную ценность, и уникальность будет сломана. Это было очень пессимистическим примером, и с реальными мировыми ценностями это, еще менее вероятно, произойдет. Если ваша система - такой, что это, все еще вероятно, будет происходить, то возможно Вы должны сделать прилавок 32 битами (редактируя кодекс).

Вы можете быть заинтересованы о часах ", задержанных" в течение летних сбережений дневного света. Однако это не проблема потому что времена, используемые, вот - UTC, которые "всегда" продвигаются. Отметьте, что x86 базировался, Unixes, возможно, нуждаются в надлежащей конфигурации для этого, чтобы быть верным - они должны формироваться, чтобы предположить, что часы объединительной платы находятся на UTC и давать компенсацию соответственно. Но даже все еще, если Вы управляете NTP тогда, ваше время UTC будет правильно очень вскоре после перезагрузки.

UNIQUE_ID переменная окружающей среды построена, кодируя 112-битовое (32-битовый IP адрес, изодромные с предварением 32 бита, 32 печати времени прохождения бита, прилавок на 16 битов) учетверенное использование алфавита [A-Za-z0-9@-] в манере, подобной ПАНТОМИМЕ base64 зашифровывание, производя 19 характеров. ПАНТОМИМА base64 алфавит - фактически [A-Za-z0-9+/] однако + и / должен быть особенно закодирован в URL, который делает их менее желательными. Все ценности закодированы в заказе байта сети так, чтобы зашифровывание было сопоставимо поперек архитектуры различного заказа байта. Фактический заказ зашифровывания: отпечаток времени, IP адрес, изодромный с предварением, встречный. Этот заказ имеет цель, но должно быть подчеркнуто, что заявления не должны анализировать зашифровывание. Заявления должны рассмотреть закодированное все UNIQUE_ID как непрозрачный символ, который может быть сравнен с другим UNIQUE_ID s для равенства только.

заказ был выбран такой, что возможное изменить зашифровывание в будущем, не волнуясь о столкновении с существующей базой данных UNIQUE_ID s. Новые зашифровывания должны также держать отпечаток времени как первый элемент, и могут иначе использовать тот же самый алфавит и длину долота. Так как отпечатки времени - по существу увеличивающаяся последовательность, достаточно иметь a секунда флага в котором все машины в группе прекращают служить и запросу, и прекращают использовать старый формат зашифровывания. Впоследствии они могут возобновить запросы и начать выпускать новые зашифровывания.

это, которому мы верим, - относительно портативное решение этой проблемы. Это может быть расширено на мультипереплетенные системы как Windows NT, и может расти с будущими потребностями. Произведенные идентификаторы имеют по существу бесконечную целую жизнь, потому что будущие идентификаторы могут быть сделаны дольше как требуется. По существу никакая коммуникация не требуется между машинами в группе (только синхронизация NTP требуется, который является низко верхним), и никакая коммуникация между процессами httpd не требуется (коммуникация неявна в изодромной с предварением ценности, назначенной ядром). В очень определенных ситуациях может быть сокращен идентификатор, но больше информации должно быть принято (например, 32-битовый IP адрес - массовое убийство для любого участка, но нет никакой портативной более короткой замены для этого).