Среда, 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_PHASE
NGX_HTTP_POST_REWRITE_PHASE
NGX_HTTP_POST_ACCESS_PHASE
NGX_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 запросов»