温馨提示×

Ubuntu Apache2如何优化MySQL

小樊
38
2025-12-11 02:49:11
栏目: 云计算

Ubuntu Apache2 与 MySQL 协同优化指南

一 基线评估与监控

  • 明确硬件与负载:记录内存、CPU、磁盘类型(优先 SSD)、并发访问量与关键业务 SQL。
  • 开启监控与诊断:
    • 慢查询日志:开启并设置阈值,便于定位性能瓶颈。
    • 实时状态与进程:使用 SHOW PROCESSLISTSHOW STATUS 观察连接与 InnoDB 关键指标。
    • 外部工具:使用 MySQLTuner 定期给出配置与安全建议,配合日志分析工具(如 pt-query-digest)做 SQL 画像。

二 Apache2 层优化

  • 选择并配置合适的 MPM(多处理模块):
    • prefork:稳定、每个进程单线程,适合传统 PHP 模块场景。
    • worker/event:多线程/事件驱动,资源占用更低,适合高并发。
  • 长连接与并发控制:
    • 启用 KeepAlive,合理设置 MaxKeepAliveRequestsKeepAliveTimeout,减少频繁建连开销。
    • 依据内存与 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_sizemax_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-mysqlphp-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 apache2sudo systemctl restart mysql),观察错误日志与监控指标。
    • 若调整 innodb_log_file_size,需先干净关闭 MySQL、备份并删除旧日志文件后再启动,避免启动失败。
    • 持续用 MySQLTuner、慢查询分析与业务指标验证效果,必要时回滚或微调。

0