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 準備好的陳述式,讓需要使用這些陳述式的模組能使用。每個準備好的陳述式都必須指定一個名稱 (標籤),並儲存在 hash 中:一個 ap_dbd_t
的 prepared
欄位。Hash 項目為 apr_dbd_prepared_t
類型,並可在任何 apr_dbd 準備好的陳述式 SQL 查詢或選取指令中使用。
由 dbd 使用者模組使用準備好的陳述式,並記錄可以在 httpd.conf 中指定的陳述式,或提供自己的指令並使用 ap_dbd_prepare
。
reconnect
設定為 0,才能避免 MySQL 客戶端重新連線時未正確重設準備好的陳述式所造成的錯誤。如果設定為 1,系統會嘗試修復所有斷線的連線,但由於 mod_dbd 未收到通知,準備好的陳述式將會失效。任何網路/資料庫應用程式都需要確保自己不會受到 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"
現在與 regexp 的 $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 開啟|關閉 |
內容 | 伺服器組態、虛擬主機 |
狀態 | 擴充套件 |
模組 | mod_dbd |
如果設為關閉,持續連線和匯集的連線會停用。當客戶端要求時,會開啟新的資料庫連線,並在釋放時立即關閉。此選項適用於除錯和低用量的伺服器。
預設是啟用持續連線匯集 (或在非執行緒伺服器的案例中單一 LAMP 型式的持續連線),且幾乎永遠會在作業中使用。
在版本 2.2.2 之前,此指令只接受值 0
和 1
,而不是 關閉
和 開啟
。