Ubuntu Apache2 与 MySQL 协同优化指南
一 基线评估与监控
- 明确硬件与负载:记录内存、CPU、磁盘类型(优先 SSD)、并发访问量与关键业务 SQL。
- 开启监控与诊断:
- 慢查询日志:开启并设置阈值,便于定位性能瓶颈。
- 实时状态与进程:使用 SHOW PROCESSLIST、SHOW STATUS 观察连接与 InnoDB 关键指标。
- 外部工具:使用 MySQLTuner 定期给出配置与安全建议,配合日志分析工具(如 pt-query-digest)做 SQL 画像。
二 Apache2 层优化
- 选择并配置合适的 MPM(多处理模块):
- prefork:稳定、每个进程单线程,适合传统 PHP 模块场景。
- worker/event:多线程/事件驱动,资源占用更低,适合高并发。
- 长连接与并发控制:
- 启用 KeepAlive,合理设置 MaxKeepAliveRequests 与 KeepAliveTimeout,减少频繁建连开销。
- 依据内存与 CPU 调整并发工作进程/线程上限(如 MaxRequestWorkers/MaxClients),避免资源争用。
- 启用压缩与缓存:
- 启用 mod_deflate 压缩文本、JS、CSS 等响应体,降低带宽与时延。
- 启用 mod_cache/mod_disk_cache 缓存静态资源,减轻后端数据库压力。
三 MySQL 层关键配置
- 内存与缓存:
- 将 innodb_buffer_pool_size 设为可用内存的约 50%–70%(写多或专用库可更高),显著减少磁盘 I/O。
- 适度设置 query_cache_size/query_cache_type(如 64M 且开启),用于结果集小且重复度高的查询场景。
- 连接与会话:
- 结合并发与资源,设置 max_connections(如 200–500 起步),避免过高导致上下文切换与内存压力。
- 合理设置 tmp_table_size 与 max_heap_table_size(如各 64M),减少磁盘临时表。
- InnoDB 日志与持久化:
- 适度增大 innodb_log_file_size(如 256M)提升大事务吞吐。
- 在允许一定数据丢失风险的场景,可将 innodb_flush_log_at_trx_commit 设为 2 提升写性能(默认 1 更安全)。
- 诊断与维护:
- 开启 slow_query_log 并定期用 pt-query-digest 分析,配合 EXPLAIN 优化索引与执行计划。
- 定期执行 OPTIMIZE TABLE 整理碎片(视表变更频率与引擎而定)。
四 PHP 与连接管理
- 使用 mysqlnd(PHP 的 MySQL 原生驱动),在 Ubuntu 上安装对应扩展(如 php-mysql 或 php-mysqlnd-ms),获得更好的连接与统计能力。
- 启用连接复用:
- 应用侧使用 持久连接(PDO::ATTR_PERSISTENT) 或等效机制,减少频繁建连/销毁开销。
- 读写分离与故障转移:在复杂场景可使用 mysqlnd-ms 等中间件实现主从路由与切换。
五 配置示例与变更流程
- 示例配置片段(按实际内存与负载调整):
- MySQL(/etc/mysql/mysql.conf.d/mysqld.cnf)
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
max_connections = 300
query_cache_type = 1
query_cache_size = 64M
tmp_table_size = 64M
max_heap_table_size = 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
- Apache2(MPM prefork 示例,/etc/apache2/mods-available/mpm_prefork.conf)
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
- 变更流程与回滚要点:
- 备份配置与数据:如 /etc/mysql/、/var/lib/mysql 与关键应用配置。
- 逐项小步调整,变更后重启服务(如 sudo systemctl restart apache2、sudo systemctl restart mysql),观察错误日志与监控指标。
- 若调整 innodb_log_file_size,需先干净关闭 MySQL、备份并删除旧日志文件后再启动,避免启动失败。
- 持续用 MySQLTuner、慢查询分析与业务指标验证效果,必要时回滚或微调。