Spec-Zone.ru › Apache HTTP Server

Apache Module mod_dbd

Description: Управление подключениями к базам данных SQL
Status: Расширение
Module Identifier: dbd_module
Source File: mod_dbd.c
Compatibility: Версия 2.1 и более поздние

Summary

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

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

Этот модуль управляет подключениями к базам данных, оптимизированными для платформы. На непоточных платформах он предоставляет постоянное подключение в стиле классического 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-запрос.

Его можно сделать безопасным, удаляя все входные данные: процесс, вдохновленный проверкой наличия вредоносных данных в 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

Description: Время ожидания для неактивных подключений
Syntax:
DBDExptime time-in-seconds
Default:
DBDExptime 300
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

Директива DBDInitSQL

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

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

Директива DBDKeep

Description: Максимальное количество поддерживаемых подключений
Syntax:
DBDKeep number
Default:
DBDKeep 2
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

Директива DBDMax

Description: Максимальное количество подключений
Syntax:
DBDMax number
Default:
DBDMax 10
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

Директива DBDMin

Description: Минимальное количество подключений
Syntax:
DBDMin number
Default:
DBDMin 1
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

Директива DBDParams

Description: Параметры подключения к базе данных
Syntax:
DBDParams param1=value1[,param2=value2]
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: 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

Description: Использовать постоянные подключения
Syntax:
DBDPersist On|Off
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

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

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

Директива DBDPrepareSQL

Description: Определить подготовленный SQL-запрос
Syntax:
DBDPrepareSQL "SQL statement" label
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: mod_dbd

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

Директива DBDriver

Description: Указать драйвер SQL
Syntax:
DBDriver name
Context: конфигурация сервера, виртуальный хост
Status: Расширение
Module: 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