Структуры данных Apache. server_rec
В предыдущей статье мы рассмотрели структуру request_rec - важнейшую структуру сервера Apache, предназначеную для хранения всех данных поступившего запроса. Одним из полей request_rec было поле server_rec *server, которое содержит структуру сервера, на который поступил запрос. Сегодня эту структуру мы и рассмотрим. В основном она доступна через указатель на request_rec (r->server), но иногда передается непосредственно, например, в обработчик хука post_config - post_config_handler(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s).
Данная статья взята из выпуска №5 рассылки "Информационный бюллетень от ApacheDev.ru". Подписаться на рассылку…
struct server_rec {
process_rec *process;
server_rec *next;
const char *defn_name;
unsigned defn_line_number;
char *server_admin;
char *server_hostname;
apr_port_t port;
char *error_fname;
apr_file_t *error_log;
int loglevel;
int is_virtual;
struct ap_conf_vector_t *module_config;
struct ap_conf_vector_t *lookup_defaults;
server_addr_rec *addrs;
apr_interval_time_t timeout;
apr_interval_time_t keep_alive_timeout;
int keep_alive_max;
int keep_alive;
const char *path;
int pathlen;
apr_array_header_t *names;
apr_array_header_t *wild_names;
int limit_req_line;
int limit_req_fieldsize;
int limit_req_fields;
};
process_rec *process;
server_rec *next;
const char *defn_name;
unsigned defn_line_number;
char *server_admin;
char *server_hostname;
apr_port_t port;
char *error_fname;
apr_file_t *error_log;
int loglevel;
int is_virtual;
struct ap_conf_vector_t *module_config;
struct ap_conf_vector_t *lookup_defaults;
server_addr_rec *addrs;
apr_interval_time_t timeout;
apr_interval_time_t keep_alive_timeout;
int keep_alive_max;
int keep_alive;
const char *path;
int pathlen;
apr_array_header_t *names;
apr_array_header_t *wild_names;
int limit_req_line;
int limit_req_fieldsize;
int limit_req_fields;
};
process_rec *process; Структура, описывающая процесс, в контесте которого выполняется данный сервер. Структура process_rec имеет следующие поля:
struct process_rec {
/* Глобальный пул. Очищается при завершении процесса*/
apr_pool_t *pool;
/* Пул конфигурации. Очищается при перезагрузки сервера*/
apr_pool_t *pconf;
/* Количество аргументов коммандной строки, переданных программе */
int argc;
/* Строка аргументов */
const char * const *argv;
/* Имя программы, использованное для запуска */
const char *short_name;
};
/* Глобальный пул. Очищается при завершении процесса*/
apr_pool_t *pool;
/* Пул конфигурации. Очищается при перезагрузки сервера*/
apr_pool_t *pconf;
/* Количество аргументов коммандной строки, переданных программе */
int argc;
/* Строка аргументов */
const char * const *argv;
/* Имя программы, использованное для запуска */
const char *short_name;
};
server_rec *next; Указатель на структуру следующего сервера.
const char *defn_name; Полное имя используемого файла конфигурации. (Хотя в документации это поле описано как хранилище для имени сервера).
unsigned defn_line_number; Номер строки в конфигурационном файле где задается данный сервер.
char *server_admin; E-mail администратора сервера. Значение директивы ServerAdmin.
char *server_hostname; Имя сервера. Значение директивы ServerName.
apr_port_t port; Порт сервера.
char *error_fname; Полное имя используемого лога ошибок. Определяется директивой ErrorLog.
apr_file_t *error_log; Файловый дескриптор лога ошибок.
int loglevel; Уровень ошибок этого сервера, попадающих в лог. Возможные значения:
- APLOG_EMERG
- APLOG_ALERT
- APLOG_CRIT
- APLOG_ERR
- APLOG_WARNING
- APLOG_NOTICE
- APLOG_INFO
- APLOG_DEBUG
int is_virtual; Данный флаг показывает является ли данный сервер виртуальным.
struct ap_conf_vector_t *module_config; Вектор серверных конфигураций. Содержит указатели на серверные конфигурации модулей. Для получения конфигурации конкретного модуля используйте функцию ap_get_module_config(r->server->module_config, &your_module_struct). Подробнее о конфигурации Apache можно прочитать в статье "Взаимодействие модулей Apache с файлами конфигурации (httpd.conf и .htaccess)".
struct ap_conf_vector_t *lookup_defaults; Вектор дефолтовых значений директив контекста каталога до обхода секций <Directory>, <Files> и <Location>.
server_addr_rec *addrs; Структура, описывающая адрес сервера:
struct server_addr_rec {
/* Указатель на следующий сервер */
server_addr_rec *next;
/* Адрес сервера */
apr_sockaddr_t *host_addr;
/* Порт сервера */
apr_port_t host_port;
/* Имя сервера, определенное в "<VirtualHost>" */
char *virthost;
};
/* Указатель на следующий сервер */
server_addr_rec *next;
/* Адрес сервера */
apr_sockaddr_t *host_addr;
/* Порт сервера */
apr_port_t host_port;
/* Имя сервера, определенное в "<VirtualHost>" */
char *virthost;
};
apr_interval_time_t timeout; Таймаут в микросекундах. Значение директивы Timeout.
apr_interval_time_t keep_alive_timeout; Значение директивы KeepAliveTimeout. Задается в микросекундах.
int keep_alive_max; Максимальное количество запросов на соединение. Значение директивы MaxKeepAliveRequests.
int keep_alive; Использовать устойчивые соединения? Значение директивы KeepAlive.
const char *path; Значение директивы ServerPath для этого сервера.
int pathlen; Длина значения поля path.
apr_array_header_t *names; Массив значений директив ServerAlias. Для чтения значений используйте следующий код:
apr_array_header_t *array = server->names;
for (i = 0; i < array->nelts; ++i){
const char *aray_item = ((const char **) array->elts)[i];
}
for (i = 0; i < array->nelts; ++i){
const char *aray_item = ((const char **) array->elts)[i];
}
apr_array_header_t *wild_names; Массив значений директив ServerAlias, содержащих символ "*".
int limit_req_line; Лимит длины строки запроса HTTP.
int limit_req_fieldsize; Лимит длины HTTP заголовка.
int limit_req_fields; Лимит количества заголовков в запросе.
Ссылки
- Книга "Администрирование Apache" (Глава 12). Хорошее описание основных структур и API сервера. Озон, Болеро.
Комментарий от я — Ноябрь 8, 2006 @ 8:45 am
Комментарий от pavel — Июль 17, 2008 @ 1:55 pm
_____________
mameipape.ru
Комментарий от андрюха — Август 29, 2008 @ 12:10 am
Комментарий от Богдан — Октябрь 18, 2008 @ 5:32 pm
Комментарий от Иван — Октябрь 18, 2008 @ 5:34 pm
Комментарий от Юлия — Октябрь 18, 2008 @ 5:35 pm
Комментарий от Гаврила — Ноябрь 27, 2008 @ 7:47 pm
Комментарий от Грехов — Декабрь 25, 2008 @ 1:37 am
Комментарий от ХаусМД — Декабрь 27, 2008 @ 1:37 am
Комментарий от чихуахуа — Декабрь 29, 2008 @ 2:53 am
Комментарий от folder — Январь 4, 2009 @ 1:55 am
int limit_req_fields; Лимит количества заголовков в запросе.
Комментарий от Май — Апрель 8, 2009 @ 7:48 am
Комментарий от Дмитрий — Апрель 10, 2009 @ 6:35 pm
Комментарий от andryw — Апрель 19, 2009 @ 4:20 pm