Модуль 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