Apache HTTP 服务器版本 2.4
描述 | 管理 SQL 数据库连接 |
---|---|
状态 | 扩展 |
模块标识符 | dbd_module |
源文件 | mod_dbd.c |
兼容性 | 版本 2.1 及更高版本 |
mod_dbd
使用 APR 管理 SQL 数据库连接。它根据需要为需要 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
。
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*));
mod_dbd
支持代表可能希望使用它们的模块的 SQL 预处理语句。每个预处理语句必须分配一个名称(标签),并存储在一个哈希表中:ap_dbd_t
的 prepared
字段。哈希表条目类型为 apr_dbd_prepared_t
,可以在任何 apr_dbd 预处理语句 SQL 查询或选择命令中使用。
dbd 用户模块负责使用预处理语句并记录可以在 httpd.conf 中指定哪些语句,或者提供自己的指令并使用 ap_dbd_prepare
。
reconnect
设置为 0,以避免由于 MySQL 客户端在未正确重置预处理语句的情况下重新连接而导致的错误。如果设置为 1,将尝试修复任何断开的连接,但由于 mod_dbd 未收到通知,因此预处理语句将失效。任何 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 驱动程序,它提供了真正的预处理语句的安全性。
描述 | 空闲连接的保持活动时间 |
---|---|
语法 | DBDExptime 以秒为单位的时间 |
默认值 | DBDExptime 300 |
上下文 | 服务器配置、虚拟主机 |
状态 | 扩展 |
模块 | mod_dbd |
当连接数超过 DBDKeep 中指定的连接数时,设置保持空闲连接活动的时间(仅限线程化平台)。
描述 | 在连接到数据库后执行 SQL 语句 |
---|---|
语法 | DBDInitSQL "SQL 语句" |
上下文 | 服务器配置、虚拟主机 |
状态 | 扩展 |
模块 | mod_dbd |
希望执行此操作的模块可以在创建数据库连接时执行一个或多个 SQL 语句。例如,在将新连接建立到数据库时,可以初始化某些值或添加日志条目。
描述 | 最大持续连接数 |
---|---|
语法 | DBDKeep 数字 |
默认值 | DBDKeep 2 |
上下文 | 服务器配置、虚拟主机 |
状态 | 扩展 |
模块 | mod_dbd |
设置每个进程要持续的连接数的最大值,除了处理峰值需求之外(仅限线程化平台)。
描述 | 数据库连接的参数 |
---|---|
语法 | DBDParams param1=value1[,param2=value2] |
上下文 | 服务器配置、虚拟主机 |
状态 | 扩展 |
模块 | mod_dbd |
根据底层驱动程序的要求。通常,这将用于传递在用户名、密码、数据库名称、主机名和端口号之间无法默认的任何内容。
当前驱动程序的连接字符串参数包括
PQconnectdb
part1:part2
用作 sqlite_open(part1, atoi(part2), NULL)
sqlite3_open
描述 | 是否使用持久连接 |
---|---|
语法 | DBDPersist On|Off |
上下文 | 服务器配置、虚拟主机 |
状态 | 扩展 |
模块 | mod_dbd |
如果设置为 Off,则禁用持久连接和连接池。在客户端请求时打开新的数据库连接,并在释放时立即关闭。此选项适用于调试和低使用率服务器。
默认情况下启用持久连接池(或在非线程化服务器的情况下启用单个 LAMP 样式的持久连接),并且几乎始终在操作中使用。
在版本 2.2.2 之前,此指令仅接受值 0
和 1
,而不是 Off
和 On
。