Wednesday, 27 May 2009

nginx: фазы обработки http запросов

Обработка http запроса идет в несколько фаз.

Сейчас существуют фазы (в порядке их обработки):

  1. NGX_HTTP_POST_READ_PHASE — фаза чтения запроса;
  2. NGX_HTTP_SERVER_REWRITE_PHASE — фаза преобразование URI на уровне сервера;
  3. NGX_HTTP_FIND_CONFIG_PHASE — поиск конфигурации в которой будет обрабатываться запрос;
  4. NGX_HTTP_REWRITE_PHASE — фаза преобразование URI на уровне location;
  5. NGX_HTTP_POST_REWRITE_PHASE — фаза обработки результатов преобразование URI запроса;
  6. NGX_HTTP_PREACCESS_PHASE — подготовительная фаза для проверки доступа;
  7. NGX_HTTP_ACCESS_PHASE — фаза проверки доступа;
  8. NGX_HTTP_POST_ACCESS_PHASE — фаза обработки результатов проверки доступа;
  9. NGX_HTTP_TRY_FILES_PHASE — фаза обработки try_files;
  10. NGX_HTTP_CONTENT_PHASE — фаза генерации ответа;
  11. 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 и чем больше их, тем дольше будет происходить эта фаза. Этот «хак» позволяет ускорить выдачу.

Write on: 16:39 | 0 comments | | tags: , , , , | permalink |
Add post to:   Delicious Reddit Slashdot Digg Technorati Google


Add comment

Comments

No comments for this post

Comment form for «nginx: фазы обработки http запросов»

Required. 30 chars of fewer.

Required.