Apache 模块 mod_dbd

Description:Management SQL 数据库连接
Status:Extension
Module Identifier:dbd_module
Source File:mod_dbd.c
Compatibility:2.1 版及更高版本

Summary

mod_dbd使用APRManagement SQL 数据库连接。它根据需要提供与需要 SQL 数据库功能的模块的数据库连接,并以最佳效率和可伸缩性 Management 线程和非线程 MPM 的数据库。有关详细信息,请访问APR网站以及其原始开发人员对Apache DBD 框架的概述。

Connection Pooling

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

Connecting

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

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

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

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

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

SQL 预准备语句

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

dbd 用户模块可以使用准备好的语句并记录可以在 httpd.conf 中指定的语句,或者提供自己的指令并使用ap_dbd_prepare

Caveat

将预备语句与 MySQL 数据库一起使用时,最好在连接字符串中将reconnect设置为 0,以避免由于 MySQL Client 端重新连接而未正确重置预备语句而引起的错误。如果设置为 1,将尝试修复任何断开的连接,但是由于未通知 mod_dbd,因此准备好的语句将无效。

SECURITY WARNING

任何 Web /数据库应用程序都需要保护自己免受 SQL 注入攻击。在大多数情况下,Apache DBD 是安全的,因为应用程序使用预准备的语句,而不受信任的 Importing 仅用作数据。当然,如果通过第三方模块使用它,则应确定它们可能需要采取哪些预防措施。

但是,FreeTDS 驱动程序本质上是“不安全的”。基础库不支持准备好的语句,因此驱动程序会对其进行仿真,并将不受信任的 Importing 合并到 SQL 语句中。

可以通过取消所有 Importing 来确保它的安全:这是受 Perl 的污点检查启发的过程。根据 Perl 习惯用法,每个 Importing 都与一个正则表达式匹配,并且仅使用匹配:

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

要使用此功能,必须在配置的准备好的语句中包含无限制的正则表达式。 regexp 紧跟在 prepared 语句中的%之后,并用大括号\ {}括起来。例如,如果您的应用程序需要字母数字 Importing,则可以使用:

"SELECT foo FROM bar WHERE input = %s"

与其他驱动程序一起使用,并且没有比失败的查询更糟糕的了。但是使用 FreeTDS,您需要:

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

现在,所有与 regexp 的$ 1 不匹配的内容都将被丢弃,因此该语句很安全。

一种替代方法是第三方 ODBC 驱动程序,它提供了 true 的预备语句的安全性。

DBDExptime Directive

Description:空闲连接的存活时间
Syntax:DBDExptime time-in-seconds
Default:DBDExptime 300
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

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

DBDInitSQL Directive

Description:连接到数据库后执行 SQL 语句
Syntax:DBDInitSQL "SQL statement"
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

创建与数据库的连接时,需要的模块可以执行一个或多个 SQL 语句。用法的示例可能是初始化某些值或在与数据库构建新连接时添加日志条目。

DBDKeep Directive

Description:最大持续连接数
Syntax:DBDKeep number
Default:DBDKeep 2
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

设置每个进程要维持的最大连接数,而不是用于处理高峰需求(仅线程平台)。

DBDMax Directive

Description:最大连接数
Syntax:DBDMax number
Default:DBDMax 10
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

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

DBDMin Directive

Description:最小连接数
Syntax:DBDMin number
Default:DBDMin 1
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

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

DBDParams Directive

Description:数据库连接参数
Syntax:DBDParams param1=value1[,param2=value2]
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

根据底层驱动程序的要求。通常,这将用于传递用户名,密码,数据库名称,主机名和连接端口号中无法默认设置的任何内容。

当前驱动程序的连接字符串参数包括:

  • FreeTDS(用于 MSSQL 和 SyBase)

    • 用户名,密码,应用程序名称,dbname,主机,字符集,lang,服务器
  • MySQL

    • 主机,端口,用户,通过,dbname,sock,标志,fldsz,组,重新连接
  • Oracle

    • 用户,通过,dbname,服务器
  • PostgreSQL

    • 连接字符串直接传递到PQconnectdb
  • SQLite2

    • 连接字符串在冒号上分割,并且part1:part2用作sqlite_open(part1, atoi(part2), NULL)
  • SQLite3

    • 连接字符串直接传递到sqlite3_open
  • ODBC

    • 数据源,用户,密码,连接,ctimeout,stimeout,访问,txmode,bufsize

DBDPersist Directive

Description:是否使用持久连接
Syntax:DBDPersist On|Off
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

如果设置为“关”,则禁用持久连接和池连接。Client 端请求时将打开一个新的数据库连接,并在发布时立即将其关闭。此选项用于调试和低使用率的服务器。

默认设置是启用持久性连接池(如果是非线程服务器,则启用单个 LAMP 风格的持久性连接),并且几乎应始终在操作中使用。

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

DBDPrepareSQL Directive

Description:定义一个 SQL 预准备语句
Syntax:DBDPrepareSQL "SQL statement" label
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

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

DBDriver Directive

Description:指定一个 SQL 驱动程序
Syntax:DBDriver name
Context:服务器配置,虚拟主机
Status:Extension
Module:mod_dbd

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