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