<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_dbd

可用语言:  en  |  fr 

描述管理 SQL 数据库连接
状态扩展
模块标识符dbd_module
源文件mod_dbd.c
兼容性版本 2.1 及更高版本

摘要

mod_dbd 使用 APR 管理 SQL 数据库连接。它根据需要为需要 SQL 数据库功能的模块提供数据库连接,并负责以最优的效率和可扩展性管理数据库,适用于线程化和非线程化 MPM。有关详细信息,请参阅 APR 网站以及其原始开发人员对 Apache DBD 框架 的概述。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

连接池

此模块以针对平台优化的方式管理数据库连接。在非线程化平台上,它以经典 LAMP(Linux、Apache、Mysql、Perl/PHP/Python)的方式提供持久连接。在线程化平台上,它提供了一个更具可扩展性和效率的连接池,如 ApacheTutor 上的这篇文章 所述。请注意,mod_dbd 取代了该文章中介绍的模块。

top

连接

要连接到您的数据库,您需要指定一个驱动程序和连接参数。这些参数因数据库引擎而异。例如,要连接到 mysql,请执行以下操作

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

然后,您可以在各种其他模块中使用此连接,包括 mod_rewritemod_authn_dbdmod_lua。每个模块的文档中都提供了更多使用示例。

有关每个支持的数据库驱动程序的连接字符串信息,请参阅 DBDParams

top

Apache DBD API

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*));
top

SQL 预处理语句

mod_dbd 支持代表可能希望使用它们的模块的 SQL 预处理语句。每个预处理语句必须分配一个名称(标签),并存储在一个哈希表中:ap_dbd_tprepared 字段。哈希表条目类型为 apr_dbd_prepared_t,可以在任何 apr_dbd 预处理语句 SQL 查询或选择命令中使用。

dbd 用户模块负责使用预处理语句并记录可以在 httpd.conf 中指定哪些语句,或者提供自己的指令并使用 ap_dbd_prepare

注意事项

在使用 MySQL 数据库的预处理语句时,最好在连接字符串中将 reconnect 设置为 0,以避免由于 MySQL 客户端在未正确重置预处理语句的情况下重新连接而导致的错误。如果设置为 1,将尝试修复任何断开的连接,但由于 mod_dbd 未收到通知,因此预处理语句将失效。
top

安全警告

任何 Web/数据库应用程序都需要保护自己免受 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 驱动程序,它提供了真正的预处理语句的安全性。

top

DBDExptime 指令

描述空闲连接的保持活动时间
语法DBDExptime 以秒为单位的时间
默认值DBDExptime 300
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

当连接数超过 DBDKeep 中指定的连接数时,设置保持空闲连接活动的时间(仅限线程化平台)。

top

DBDInitSQL 指令

描述在连接到数据库后执行 SQL 语句
语法DBDInitSQL "SQL 语句"
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

希望执行此操作的模块可以在创建数据库连接时执行一个或多个 SQL 语句。例如,在将新连接建立到数据库时,可以初始化某些值或添加日志条目。

top

DBDKeep 指令

描述最大持续连接数
语法DBDKeep 数字
默认值DBDKeep 2
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

设置每个进程要持续的连接数的最大值,除了处理峰值需求之外(仅限线程化平台)。

top

DBDMax 指令

描述最大连接数
语法DBDMax 数字
默认值DBDMax 10
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

设置每个进程的连接数的硬性最大值(仅限线程化平台)。

top

DBDMin 指令

描述最小连接数
语法DBDMin 数字
默认值DBDMin 1
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

设置每个进程的连接数的最小值(仅限线程化平台)。

top

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
top

DBDPersist 指令

描述是否使用持久连接
语法DBDPersist On|Off
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

如果设置为 Off,则禁用持久连接和连接池。在客户端请求时打开新的数据库连接,并在释放时立即关闭。此选项适用于调试和低使用率服务器。

默认情况下启用持久连接池(或在非线程化服务器的情况下启用单个 LAMP 样式的持久连接),并且几乎始终在操作中使用。

在版本 2.2.2 之前,此指令仅接受值 01,而不是 OffOn

top

DBDPrepareSQL 指令

描述定义 SQL 预处理语句
语法DBDPrepareSQL "SQL 语句" 标签
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

对于像身份验证这样的重复使用单个 SQL 语句的模块,在启动时准备语句而不是每次使用时准备语句可以实现最佳性能。此指令准备 SQL 语句并为其分配一个标签。

top

DBDriver 指令

描述指定 SQL 驱动程序
语法DBDriver 名称
上下文服务器配置、虚拟主机
状态扩展
模块mod_dbd

按名称选择 apr_dbd 驱动程序。驱动程序必须安装在您的系统上(在大多数系统上,它将是一个共享对象或 dll)。例如,DBDriver mysql 将选择 apr_dbd_mysql.so 中的 MySQL 驱动程序。

可用语言:  en  |  fr 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/偏离主题,则可能会被我们的版主删除。有关如何管理 Apache HTTP 服务器的问题应直接发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表