Apache2 Ubuntu版數據庫連接優化指南
Apache的進程管理參數直接影響并發處理能力,需根據服務器內存、CPU資源調整mpm_prefork_module
(多進程模型)或mpm_event_module
(事件驅動模型,推薦高并發場景)的配置。
StartServers
:啟動時的進程數,建議設為5-10(根據內存大小調整,每個進程約消耗5-10MB內存);MinSpareServers
/MaxSpareServers
:空閑進程的最小/最大數量,保持足夠的空閑進程應對突發請求;MaxRequestWorkers
(原MaxClients
):核心參數,控制同時處理的最大請求數,建議設為服務器內存的1/4-1/2(如8GB內存可設為200-300);MaxConnectionsPerChild
:每個子進程處理的最大請求數,設為1000-5000可防止內存泄漏(設為0表示無限制,但需謹慎)。/etc/apache2/apache2.conf
或/etc/apache2/mods-enabled/mpm_prefork.conf
):<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 250
MaxConnectionsPerChild 1000
</IfModule>
KeepAlive On
MaxKeepAliveRequests 100 # 單個連接的最大請求數
KeepAliveTimeout 5 # 連接保持時間(秒)
連接池通過復用現有數據庫連接,避免頻繁創建/銷毀連接的開銷(如MySQL每次新建連接約耗時100-200ms)。
/var/www/html/config.php
):$dsn = 'mysql:host=localhost;dbname=your_database;charset=utf8';
$options = [
PDO::ATTR_PERSISTENT => true, // 啟用持久連接
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, 'username', 'password', $options);
} catch (PDOException $e) {
die("Connection failed: " . $e->getMessage());
}
/var/www/html/db.php
):$mysqli = new mysqli('localhost', 'username', 'password', 'database');
if ($mysqli->connect_error) die("Connect Error: " . $mysqli->connect_error);
$mysqli->options(MYSQLI_OPT_CONNECT_TIMEOUT, 5); // 連接超時設置
$mysqli->options(MYSQLI_OPT_RECONNECT, true); // 自動重連
數據庫本身的性能是連接優化的基礎,需調整MySQL的關鍵參數:
/etc/mysql/mysql.conf.d/mysqld.cnf
):
innodb_buffer_pool_size
:InnoDB引擎緩存數據和索引的內存區域,建議設為服務器內存的50%-70%(如8GB內存設為4G-5G);max_connections
:最大并發連接數,需大于Apache的MaxRequestWorkers
(如Apache設為250,MySQL可設為300-400);query_cache_size
:查詢緩存(高并發寫入場景建議禁用,避免緩存失效導致的性能下降),設為64M-128M;tmp_table_size
/max_heap_table_size
:內存臨時表大小,避免大查詢使用磁盤臨時表(建議設為64M-128M)。[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 300
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M
thread_cache_size = 16 # 緩存線程,減少線程創建開銷
table_open_cache = 2000 # 緩存打開的表數量
使用內存緩存系統(如Redis、Memcached)緩存熱點數據,降低數據庫查詢頻率(如商品詳情、用戶會話等)。
sudo apt update
sudo apt install memcached
sudo systemctl start memcached
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);
$data = $memcached->get('hot_data_key');
if (!$data) {
$data = $pdo->query("SELECT * FROM hot_table")->fetchAll();
$memcached->set('hot_data_key', $data, 3600); // 緩存1小時
}
通過工具監控服務器性能,定位瓶頸并調整配置:
htop
(實時查看CPU、內存、進程)、iotop
(查看磁盤IO)、vmstat
(查看系統整體狀態);apachetop
(查看請求響應時間、流量)、tail -f /var/log/apache2/access.log
(分析訪問日志);mysqltuner.pl
(分析MySQL配置瓶頸,如max_connections
是否不足、innodb_buffer_pool_size
是否合理)、pt-query-digest
(分析慢查詢日志,優化低效SQL);[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log
long_query_time = 2 # 超過2秒的查詢視為慢查詢
WHERE
、JOIN
條件中的字段),避免全表掃描;減少循環內的數據庫查詢,改用批量操作;SELECT
、INSERT
、UPDATE
權限,禁止DROP
、ALTER
等高危操作);使用防火墻(如ufw
)限制數據庫端口(3306)的訪問范圍(僅允許Apache服務器IP);