Среда, 27 Май 2009
nginx: фазы обработки http запросов
Обработка http запроса идет в несколько фаз.
Сейчас существуют фазы (в порядке их обработки):
NGX_HTTP_POST_READ_PHASE— фаза чтения запроса;NGX_HTTP_SERVER_REWRITE_PHASE— фаза преобразование URI на уровне сервера;NGX_HTTP_FIND_CONFIG_PHASE— поиск конфигурации в которой будет обрабатываться запрос;NGX_HTTP_REWRITE_PHASE— фаза преобразование URI на уровне location;NGX_HTTP_POST_REWRITE_PHASE— фаза обработки результатов преобразование URI запроса;NGX_HTTP_PREACCESS_PHASE— подготовительная фаза для проверки доступа;NGX_HTTP_ACCESS_PHASE— фаза проверки доступа;NGX_HTTP_POST_ACCESS_PHASE— фаза обработки результатов проверки доступа;NGX_HTTP_TRY_FILES_PHASE— фаза обработки try_files;NGX_HTTP_CONTENT_PHASE— фаза генерации ответа;NGX_HTTP_LOG_PHASE— фаза записи логов.
Пользовательские обработчики не могут быть зарегистрированные на фазах:
NGX_HTTP_FIND_CONFIG_PHASENGX_HTTP_POST_REWRITE_PHASENGX_HTTP_POST_ACCESS_PHASENGX_HTTP_TRY_FILES_PHASE
Пользовательский обработчик должен вернуть одно из значений:
NGX_OK— выполнение завершено успешно, переходим к следующей фазе;NGX_DECLINED— обработчик не может обработать его, переходим к следующему обработчику;NGX_AGAIN || NGX_DONE— выполнение части обработчика завершено, но нужно подаждать внешних событий что бы закончить;NGX_ERROR || NGX_HTTP_...— при выполнении произошла ошибка. Есть не NGX_ERROR то будет показан код ошибки, иначе просто закроется соединение.
В общем виде устновить обработчик можно через код:
h = ngx_array_push(&cmcf->phases[ФАЗА].handlers);
if (h == NULL) {
    return NGX_ERROR;
}
*h = обработчик;
Для фазы NGX_HTTP_CONTENT_PHASE делается исключение, и ее правильно ставить так:
clcf->handler = обработчик;
Это корректно и правильно, только в том случае, когда надо поставить обработчик именно на этот location и он сработает первым. Почти все модули ставят обработчики на фазу NGX_HTTP_CONTENT_PHASE и чем больше их, тем дольше будет происходить эта фаза. Этот «хак» позволяет ускорить выдачу.






Комментарии
Форма комментирования для «nginx: фазы обработки http запросов»