<-
Apache HTTP 服务器 2.4 > Apache模块mod_dbd

Apache模块mod_dbd

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

摘要

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

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

连接池

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

最佳

连接中

要连接到数据库,您需要指定驱动程序和连接参数。这些因一个数据库引擎而异。例如,要连接到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预准备语句。必须为每个准备好的语句分配一个名称(标签),并将它们存储在哈希中:的prepared字段ap_dbd_t。哈希条目是类型apr_dbd_prepared_t ,可以在任何apr_dbd准备语句SQL查询或选择命令中使用。

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

警告

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

安全警告

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

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

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

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

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

"SELECT foo FROM bar WHERE input = %s"

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

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

现在,所有与regexp的$ 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)
用户名,密码,应用程序名称,dbname,主机,字符集,lang,服务器
的MySQL
主机,端口,用户,通过,dbname,sock,标志,fldsz,组,重新连接
甲骨文
用户,通过,dbname,服务器
PostgreSQL的
连接字符串直接传递给 PQconnectdb
SQLite2
连接字符串在冒号上分割,并part1:part2用作sqlite_open(part1, atoi(part2), NULL)
SQLite3
连接字符串直接传递给 sqlite3_open
ODBC
数据源,用户,密码,连接,ctimeout,stimeout,访问,txmode,bufsize
最佳

DBDPersist 指令

描述:是否使用持久连接
句法:DBDPersist On|Off
内容:服务器配置,虚拟主机
状态:延期
模块:mod_dbd

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

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

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

最佳

DBDPrepareSQL 指令

描述:定义一个SQL预准备语句
句法:DBDPrepareSQL "SQL statement" label
内容:服务器配置,虚拟主机
状态:延期
模块:mod_dbd

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

最佳

DBDriver 指令

描述:指定一个SQL驱动程序
句法:DBDriver name
内容:服务器配置,虚拟主机
状态:延期
模块:mod_dbd

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

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。