Базовые концепции и структуры

 

В архитектуре Apache можно выделить следующие базовые объекты:

  1. Сервер.
  2. Коннект.
  3. Запрос.
  4. Процесс.

Каждый из этих объектов представлен соответствующей структурой в заголовочном файле httpd.h.

Помимо этих 4-х основных объектов в архитектуре Apache нужно отметить еще два объекта.

Первый объект — это пулы. Управлением ресурсов в Apache занимаются пулы — APR pools (apr_pool_t). Любой ресурс, выделяемый динамически, если он привязан к пулу, будет удален автоматически после использования. Пул привязывает ресурсы к жизненному циклу основных объектов, о которых мы сказали выше. Второй объект — это конфигурационный массив ap_conf_vector_t, причем каждому модулю в нем отводится свое место.

Массив хранит как глобальные конфигурационные данные, так и локальные.

В переводе на язык си основные четыре объекта представлены структурами:

request_rec server_rec conn_rec process_rec

 

Более всего используются первые две. Каждый раз, когда на сервер приходит клиентский запрос, создается объект структуры request_rec, который передается в качестве параметра в любой обработчик, занятый обработкой запроса. Структура содержит не только стандартную информацию о HTTP-запросе, но и внутреннюю служебную информацию: пул запросов, массив глобальных и массив локальных конфигурационных записей, таблицы HTTP-заголовков, таблицу переменных окружения, указатели на сервер, коннект, фильтры, URL и его трансляцию, и т. д. Определение находится в httpd.h:

struct request_rec { apr_pool_t *pool; conn_rec *connection; server_rec *server; request_rec *next; request_rec *prev; request_rec *main; ... };

 

Структура server_rec представляет веб-сервер. Для каждого виртуального хоста имеется свой собственный экземпляр server_rec. Этот объект живет на протяжении всей жизни сервера. Ресурсы он берет из пула процессов. После структуры request_rec это вторая наиболее важная структура в Apache:

struct server_rec { process_rec *process; server_rec *next; const char *defn_name; char *server_admin; char *server_hostname; apr_port_t port; ... };

 

Структура conn_rec представляет TCP-коннект, создается при открытии коннекта и удаляется при его закрытии. Один коннект может породить несколько запросов. Запрос — это производный объект от коннекта:

struct conn_rec { apr_pool_t *pool; server_rec *base_server; void *vhost_lookup_data; apr_sockaddr_t *local_addr; apr_sockaddr_t *remote_addr; ... };

 

Структура process_rec имеет более непосредственное отношение к операционной системе, нежели к архитектуре самого сервера. Пул процессов можно получить через нее посредством

server_rec -> process_rec -> pool.

 

Другие структуры Apache разнесены по разным хидерам, из которых можно выделить следующие группы:

  1. ap_ — хидеры с таким префиксом генерируют низко-уровневое API и напрямую, как правило, не используются.
  2. http_ — в этих хидерах находится API, представляющее наибольший интерес для разработчиков.
  3. util_ — эти хидеры аналогичны первой группе.
  4. mod_ — здесь находятся определения для модулей.
  5. apr_ — APR API.

Для разработчиков наибольший интерес представляют следующие заголовки:

http_config.h http_connection.h http_core.h http_log.h http_main.h http_protocol.h http_request.h http_vhost.h httpd.h util_filter.h ap_provider.h mod_dbd.h util_ldap.h util_script.h