Spec-Zone.ru › Apache HTTP Server

Модуль Apache mod_dbd

Описание: Управляет подключениями к базам данных SQL
Статус: Расширение
Идентификатор модуля: dbd_module
Исходный файл: mod_dbd.c
Совместимость: Версия 2.1 и новее

Краткое описание

mod_dbd управляет подключениями к базам данных SQL с помощью APR. Он предоставляет подключения к базам данных по запросу модулей, которым требуются функции работы с базами данных SQL, и управляет базами данных с оптимальной эффективностью и масштабируемостью как для многопоточных, так и для однопоточных MPM. Подробности см. на веб-сайте APR и в этом обзоре инфраструктуры Apache DBD, подготовленном её первоначальным разработчиком.

Пул подключений

Этот модуль управляет подключениями к базам данных способом, оптимизированным для платформы. На однопоточных платформах он предоставляет постоянное подключение по классической схеме LAMP (Linux, Apache, Mysql, Perl/PHP/Python). На многопоточных платформах он предоставляет более масштабируемый и эффективный пул подключений, описанный в этой статье на ApacheTutor. Обратите внимание, что mod_dbd заменяет модули, представленные в этой статье.

Подключение

Чтобы подключиться к базе данных, необходимо указать драйвер и параметры подключения. Они различаются в зависимости от используемой системы управления базами данных. Например, чтобы подключиться к mysql, выполните следующее:

DBDriver mysql
DBDParams host=localhost,dbname=pony,user=shetland,pass=appaloosa

Затем это подключение можно использовать в различных других модулях, включая mod_rewrite, mod_authn_dbd и mod_lua. Дополнительные примеры использования приведены в документации каждого из этих модулей.

Сведения о строках подключения для каждого из поддерживаемых драйверов баз данных см. в DBDParams.

API Apache DBD

mod_dbd экспортирует пять функций для использования другими модулями. API выглядит следующим образом:

typedef struct {
    apr_dbd_t *handle;
    apr_dbd_driver_t *driver;
    apr_hash_t *prepared;
} ap_dbd_t;

/* Export functions to access the database */

/* acquire a connection that MUST be explicitly closed.
 * Returns NULL on error
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_open(apr_pool_t*, server_rec*);

/* release a connection acquired with ap_dbd_open */
AP_DECLARE(void) ap_dbd_close(server_rec*, ap_dbd_t*);

/* acquire a connection that will have the lifetime of a request
 * and MUST NOT be explicitly closed.  Return NULL on error.
 * This is the preferred function for most applications.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_acquire(request_rec*);

/* acquire a connection that will have the lifetime of a connection
 * and MUST NOT be explicitly closed.  Return NULL on error.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_cacquire(conn_rec*);

/* Prepare a statement for use by a client module */
AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*);

/* Also export them as optional functions for modules that prefer it */
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_open, (apr_pool_t*, server_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_close, (server_rec*, ap_dbd_t*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_acquire, (request_rec*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*));

Подготовленные операторы SQL

mod_dbd поддерживает подготовленные операторы SQL для модулей, которым они могут потребоваться. Каждому подготовленному оператору необходимо назначить имя (метку); они хранятся в хеше — поле prepared структуры ap_dbd_t. Элементы хеша имеют тип apr_dbd_prepared_t и могут использоваться в любой из команд apr_dbd для выполнения подготовленных SQL-запросов или выборок.

Модули, использующие dbd, должны самостоятельно использовать подготовленные операторы и документировать, какие операторы можно указывать в httpd.conf, либо предоставлять собственные директивы и использовать ap_dbd_prepare.

Предупреждение

При использовании подготовленных операторов с базой данных MySQL рекомендуется установить reconnect в строке подключения в значение 0, чтобы избежать ошибок, возникающих при переподключении клиента MySQL без надлежащего сброса подготовленных операторов. Если установить значение 1, будет предпринята попытка восстановить разорванные подключения, но, поскольку mod_dbd об этом не уведомляется, подготовленные операторы станут недействительными.

ПРЕДУПРЕЖДЕНИЕ О БЕЗОПАСНОСТИ

Любое веб-приложение, работающее с базой данных, должно быть защищено от атак с внедрением SQL-кода. В большинстве случаев Apache DBD безопасен, поскольку приложения используют подготовленные операторы, а недоверенные данные применяются только как данные. Разумеется, если вы используете его через сторонние модули, следует выяснить, какие меры предосторожности могут потребоваться.

Однако драйвер FreeTDS по своей природе небезопасен. Базовая библиотека не поддерживает подготовленные операторы, поэтому драйвер эмулирует их, подставляя недоверенные данные непосредственно в SQL-оператор.

Обеспечить безопасность можно, очистив все входные данные: этот процесс основан на проверке taint-данных в Perl. Каждый входной параметр сопоставляется с регулярным выражением, и согласно идиоме Perl используется только совпавшая часть:

$untrusted =~ /([a-z]+)/; $trusted = $1;

Для этого регулярные выражения очистки необходимо включить в настроенные подготовленные операторы. Регулярное выражение указывается сразу после символа % в подготовленном операторе и заключается в фигурные скобки {}. Например, если приложение ожидает буквенно-цифровые данные, можно использовать:

"SELECT foo FROM bar WHERE input = %s"

Для других драйверов это приведёт лишь к неудачному запросу, но не к более серьёзным последствиям. Однако для FreeTDS потребуется:

"SELECT foo FROM bar WHERE input = %{([A-Za-z0-9]+)}s"

Теперь все данные, не соответствующие совпадению $1 регулярного выражения, отбрасываются, поэтому оператор безопасен.

В качестве альтернативы можно использовать сторонний драйвер ODBC, который обеспечивает безопасность благодаря настоящим подготовленным операторам.

Директива DBDExptime

Описание: Время поддержания активности неактивных подключений
Синтаксис:
DBDExptime time-in-seconds
Значение по умолчанию:
DBDExptime 300
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Задаёт время поддержания активности неиспользуемых подключений после превышения количества подключений, указанного в DBDKeep (только для многопоточных платформ).

Директива DBDInitSQL

Описание: Выполнение SQL-оператора после подключения к базе данных
Синтаксис:
DBDInitSQL "SQL statement"
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Модули при необходимости могут выполнять один или несколько SQL-операторов при создании подключения к базе данных. Например, это может быть инициализация определённых значений или добавление записи в журнал при создании нового подключения к базе данных.

Директива DBDKeep

Описание: Максимальное постоянное количество подключений
Синтаксис:
DBDKeep number
Значение по умолчанию:
DBDKeep 2
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Задаёт максимальное количество подключений на процесс, которое будет поддерживаться вне периодов пиковой нагрузки (только для многопоточных платформ).

Директива DBDMax

Описание: Максимальное количество подключений
Синтаксис:
DBDMax number
Значение по умолчанию:
DBDMax 10
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Задаёт жёсткое максимальное количество подключений на процесс (только для многопоточных платформ).

Директива DBDMin

Описание: Минимальное количество подключений
Синтаксис:
DBDMin number
Значение по умолчанию:
DBDMin 1
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Задаёт минимальное количество подключений на процесс (только для многопоточных платформ).

Директива DBDParams

Описание: Параметры подключения к базе данных
Синтаксис:
DBDParams param1=value1[,param2=value2]
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Задаются в соответствии с требованиями используемого драйвера. Обычно эта директива используется для передачи параметров подключения, которым не заданы значения по умолчанию: имени пользователя, пароля, имени базы данных, имени хоста и номера порта.

Параметры строк подключения для используемых драйверов:

FreeTDS (для MSSQL и SyBase)
username, password, appname, dbname, host, charset, lang, server
MySQL
host, port, user, pass, dbname, sock, flags, fldsz, group, reconnect
Oracle
user, pass, dbname, server
PostgreSQL
Строка подключения передаётся напрямую в PQconnectdb
SQLite2
Строка подключения разбивается по двоеточию, а part1:part2 используется как sqlite_open(part1, atoi(part2), NULL)
SQLite3
Строка подключения передаётся напрямую в sqlite3_open
ODBC
datasource, user, password, connect, ctimeout, stimeout, access, txmode, bufsize

Директива DBDPersist

Описание: Использовать ли постоянные подключения
Синтаксис:
DBDPersist On|Off
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Если задано значение Off, постоянные подключения и пулы отключаются. По запросу клиента открывается новое подключение к базе данных, которое сразу же закрывается после освобождения. Этот параметр предназначен для отладки и серверов с низкой нагрузкой.

По умолчанию включён пул постоянных подключений (или одно постоянное подключение в стиле LAMP для однопоточного сервера); этот режим почти всегда следует использовать в рабочей среде.

До версии 2.2.2 эта директива принимала только значения 0 и 1 вместо Off и On соответственно.

Директива DBDPrepareSQL

Описание: Определение подготовленного SQL-оператора
Синтаксис:
DBDPrepareSQL "SQL statement" label
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Для таких модулей, как аутентификация, которые многократно используют один и тот же SQL-оператор, оптимальная производительность достигается его подготовкой при запуске, а не при каждом использовании. Эта директива подготавливает SQL-оператор и присваивает ему метку.

Директива DBDriver

Описание: Указание драйвера SQL
Синтаксис:
DBDriver name
Контекст: конфигурация сервера, виртуальный хост
Статус: Расширение
Модуль: mod_dbd

Выбирает драйвер apr_dbd по имени. Драйвер должен быть установлен в системе (в большинстве систем это будет общий объект или DLL). Например, DBDriver mysql выберет драйвер MySQL в apr_dbd_mysql.so.

© 2018 The Apache Software Foundation
Licensed under the Apache License, Version 2.0.
https://httpd.apache.org/docs/2.4/en/mod/mod_dbd.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API