mod_dbd
描述: | 管理 SQL 数据库连接 |
状态: | 延期 |
模块标识符: | dbd_module |
源文件: | mod_dbd.c |
兼容性: | Version 2.1 以及之后 |
摘要
mod_dbd使用APR管理 SQL 数据库连接。它根据请求向需要 SQL 数据库功能的模块提供数据库连接,并负责管理具有线程和 non-threaded MPM 的最佳效率和可伸缩性的数据库。有关详细信息,请参阅APR网站以及原始开发人员对Apache DBD Framework的概述。
连接池
此模块以针对平台优化的方式管理数据库连接。在 non-threaded 平台上,它以经典 LAMP(Linux,Apache,Mysql,Perl/PHP/Python)的方式提供持久连接。在线程平台上,它提供了一个更加可扩展和高效的连接池,如本文在 ApacheTutor 上发表中所述。请注意,mod_dbd取代该文章中提供的模块。
Connecting
要连接到数据库,您需要指定驱动程序和连接参数。这些因数据库引擎而异。对于 example,要连接到 mysql,请执行以下操作:
DBDriver mysql DBDParams host=localhost,dbname=pony,user=shetland,pass=appaloosa
然后,您可以在各种其他模块中使用此连接,包括mod_rewrite,mod_authn_dbd和mod_lua。其他用法示例出现在每个模块的文档中。
有关每个受支持的数据库驱动程序的连接 string 信息,请参阅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 准备的 statements。必须为每个预准备语句分配一个 name(标签),并将它们存储在散列中:ap_dbd_t
的prepared
字段。散列条目的类型为apr_dbd_prepared_t
,可以在任何 apr_dbd 预处理语句 SQL 查询或 select 命令中使用。
dbd 用户模块可以使用准备好的 statements 并记录 httpd.conf 中可以指定的 statements,或提供自己的指令并使用ap_dbd_prepare
。
警告
将已准备好的 statements 与 MySQL 数据库一起使用时,最好在连接 string 中将reconnect
设置为 0,以避免在没有正确重置准备好的 statements 的情况下重新连接 MySQL client 时出现的错误。如果设置为 1,则将尝试修复任何已断开的连接,但由于未通知 mod_dbd,因此准备好的 statements 将无效。
安全警告
任何 web/database application 都需要保护自己免受 SQL 注入攻击。在大多数情况下,Apache DBD 是安全的,因为 applications 使用准备好的 statements,不受信任的输入只被用作数据。当然,如果您通过 third-party 模块使用它,您应该确定它们可能需要的预防措施。
但是,FreeTDS 驱动程序本质上是不安全的**。底层 library 不支持准备好的 statements,因此驱动程序会模拟它们,并且不受信任的输入将合并到 SQL 语句中。
它可以通过取消所有输入来保证安全:一个受 Perl 污点检查启发的过程。根据 Perl 习语,每个输入都与正则表达式匹配,并且只使用 match:
$untrusted =~ /([a-z]+)/; $trusted = $1;
要使用此功能,必须在配置的准备好的 statements 中包含无效的正则表达式。正则表达式紧跟在预准备语句中的%之后,并用大括号{}括起来。例如,如果您的 application 需要字母数字输入,您可以使用:
"SELECT foo FROM bar WHERE input =%s"
与其他驱动程序,并没有比失败的查询更糟糕的事情。但是使用 FreeTDS 你需要:
"SELECT foo FROM bar WHERE input =%{([A-Za-z0-9]+)}s"
现在,任何不匹配正则表达式的$1 match 的东西都会被丢弃,因此该语句是安全的。
另一种方法可能是 third-party ODBC 驱动程序,它提供了真正准备的 statements 的安全性。
DBDExptime 指令
描述: | Keepalive time 用于 idle 连接 |
句法: | DBDExptime time-in-seconds |
默认: | DBDExptime 300 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
设置 time 以在超过 DBDKeep 中指定的连接数时保持 idle 连接处于活动状态(仅限线程平台)。
DBDInitSQL 指令
描述: | 连接到数据库后执行 SQL 语句 |
句法: | DBDInitSQL "SQL statement" |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
希望它的模块可以在创建与数据库的连接时执行一个或多个 SQL statements。示例用法可能是在与数据库建立新连接时初始化某些值或添加 log 条目。
DBDKeep 指令
描述: | 最大持续连接数 |
句法: | DBDKeep number |
默认: | DBDKeep 2 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
设置每个 process 的最大连接数,而不是处理峰值需求(仅限线程平台)。
DBDMax 指令
描述: | 最大连接数 |
句法: | DBDMax number |
默认: | DBDMax 10 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
设置每个 process 的最大连接数(仅限螺纹平台)。
DBDMin 指令
描述: | 最小连接数 |
句法: | DBDMin number |
默认: | DBDMin 1 |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
设置每个 process 的最小连接数(仅限螺纹平台)。
DBDParams 指令
描述: | 数据库连接的参数 |
句法: | DBDParams param1=value1[,param2=value2] |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
根据底层驱动程序的要求。通常,这将用于传递无法在用户名,密码,数据库 name,主机名和 port 号码之间进行默认的任何连接。
当前驱动程序的连接 string 参数包括:
- FreeTDS(适用于 MSSQL 和 SyBase)
用户名,密码,appname,dbname,host,charset,lang,server - MySQL
host, port,user,pass,dbname,sock,flags,fldsz,group,reconnect - 神谕
用户,传递,dbname,服务器 - PostgreSQL
连接 string 直接传递给 PQconnectdb - SQLite2
连接 string 在冒号上拆分,part1:part2 用作 sqlite_open(part1,atoi(part2),NULL) - sqlite3
连接 string 直接传递给 sqlite3_open - ODBC
数据源,用户,密码,连接,ctimeout,stimeout,访问,txmode,bufsize
DBDPersist 指令
描述: | 是否使用持久连接 |
句法: | DBDPersist On\|Off |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
如果设置为 Off,则禁用持久性和池化连接。当 client 请求时,将打开一个新的数据库连接,并在发布时立即关闭。此选项用于调试和 low-usage 服务器。
缺省情况是启用持久连接池(如果是 non-threaded 服务器,则启用单个 LAMP-style 持久连接),并且几乎总是在操作中使用。
在 version 2.2.2 之前,该指令仅接受值0
和1
而不是Off
和On
。
DBDPrepareSQL 指令
描述: | 定义 SQL 预准备语句 |
句法: | DBDPrepareSQL "SQL statement" label |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
对于重复使用单个 SQL 语句的身份验证等模块,可以通过在启动时准备语句而不是每次使用它来实现最佳 performance。该指令准备 SQL 语句并为其分配标签。
DBDriver 指令
描述: | 指定 SQL 驱动程序 |
句法: | DBDriver name |
Context: | server config,virtual host |
状态: | 延期 |
模块: | mod_dbd |
按 name 选择 apr_dbd 驱动程序。必须在系统上安装驱动程序(在大多数系统上,它将是共享的 object 或 dll)。例如,DBDriver mysql
将在 apr_dbd_mysql.so 中选择 MySQL 驱动程序。