温馨提示×

如何优化Ubuntu Apache的CPU使用

小樊
38
2025-12-09 01:55:03
栏目: 智能运维

Ubuntu 上降低 Apache CPU 占用的实用优化路线

一 基线检查与定位

  • 确认 Apache 版本与运行模式:apache2 -v;查看已加载模块:apache2ctl -M;在 Ubuntu 上切换或查看 MPM 配置通常在 /etc/apache2/mods-enabled/mpm*.conf。高并发动态站点优先使用线程化 MPM(event/worker),仅当应用非线程安全(如部分旧版 PHP 模块)才用 prefork。
  • 实时监控与瓶颈定位:用 htop/atop 观察 CPU 占用与负载;用 apache2ctl status(需启用 mod_status)查看当前连接、工作进程/线程与请求排队;用 netstat -tnp | grep :80 或 ss -s 检查连接状态分布;查看错误日志 /var/log/apache2/error.log 是否出现 “server reached MaxRequestWorkers/MaxClients setting” 等提示。
  • 识别 CPU 热点:ab/wrk/siege 做小流量压测复现峰值;结合应用日志与数据库慢查询定位是脚本执行、数据库、外部 API 还是静态资源处理导致的 CPU 飙升。

二 核心配置优化

  • 选择并切换合适的 MPM(Ubuntu 常见路径与命令)
    • 查看/切换示例:
      • apache2ctl -M | grep mpm
      • sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2
    • 说明:event/worker 为线程化,适合高并发、长连接;prefork 为进程隔离,兼容性好但内存与 CPU 开销更高。
  • 调整 MPM 关键参数(示例为常见安全起步值,需结合内存与压测微调)
    • event/worker(线程化)
      • StartServers 4
      • MinSpareThreads 25;MaxSpareThreads 75
      • ThreadsPerChild 25
      • MaxRequestWorkers 150(总并发工作线程上限)
      • MaxConnectionsPerChild 1000(进程生命周期内处理请求数,防内存泄漏累积)
    • prefork(非线程化,旧应用兼容)
      • StartServers 5;MinSpareServers 5;MaxSpareServers 10
      • ServerLimit 256;MaxRequestWorkers 150(进程上限)
      • MaxConnectionsPerChild 250~1000
    • 原则:让 MaxRequestWorkers × 单进程/线程平均内存 ≤ 可用物理内存,避免 swap;出现 “reached MaxRequestWorkers/MaxClients” 再适度上调。
  • 优化 KeepAlive(减少握手开销但避免连接占用过久)
    • KeepAlive On
    • MaxKeepAliveRequests 100
    • KeepAliveTimeout 2~5 秒(繁忙站点建议 2 秒)
  • 减少不必要 CPU 消耗
    • HostnameLookups Off(避免每条日志反向 DNS 查询)
    • 合理设置 Timeout(如 15~30 秒,视业务而定,过长会占用工作进程)
  • 启用压缩与缓存(以 CPU 换带宽与后端压力,注意适度)
    • 压缩:sudo a2enmod deflate;在 mods-enabled/deflate.conf 中压缩 text/html、text/css、application/javascript 等可压缩类型。
    • 缓存:sudo a2enmod cache;sudo a2enmod cache_disk;配置 CacheRoot、CacheEnable disk /、CacheDirLevels/CacheDirLength;启用 mod_expires 设置静态资源过期头(如图片 1 个月、CSS/JS 1 周)。

三 应用与架构层优化

  • 静态资源减负:将图片、视频、归档与下载类资源迁移至 CDNNginx/对象存储,让 Apache 专注动态请求。
  • 页面与数据缓存:启用 mod_cache/mod_cache_disk 做页面/片段缓存;应用层引入 Redis/Memcached 缓存热点数据,降低数据库与 PHP 计算压力。
  • 数据库优化:为高频查询建立合适索引、优化慢 SQL、合理使用连接池与查询缓存,避免 N+1 查询与全表扫描。
  • 减少日志开销:生产环境关闭或降低访问日志细粒度(如条件日志),避免高并发下日志 I/O 与格式化带来的 CPU 消耗。
  • 语言运行时:若使用 PHP-FPM,确保使用 OPcache 并合理设置 opcache.max_accelerated_files、validate_timestamps 等参数,减少脚本编译开销。

四 安全与维护

  • 保持软件更新:定期 apt update && apt upgrade apache2 与相关模块,获取性能修复与安全补丁。
  • 精简模块:只启用必需模块,禁用无用模块(Debian/Ubuntu 可用 a2dismod/a2enmod),减少初始化与运行时开销。
  • 连接与进程治理:通过 MaxRequestWorkers/MaxConnectionsPerChild 控制并发与生命周期,配合监控告警,防止异常请求拖垮 CPU。

五 快速参考配置示例

  • Ubuntu 22.04/24.04 + PHP-FPM 场景(线程化起步值,压测后再调)
    • 切换 MPM:sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2
    • /etc/apache2/mods-enabled/mpm_event.conf(示例)
      • StartServers 4
      • MinSpareThreads 25;MaxSpareThreads 75
      • ThreadsPerChild 25
      • MaxRequestWorkers 150
      • MaxConnectionsPerChild 1000
    • /etc/apache2/apache2.conf(片段)
      • KeepAlive On
      • MaxKeepAliveRequests 100
      • KeepAliveTimeout 2
      • HostnameLookups Off
      • Timeout 30
    • 启用压缩与缓存:sudo a2enmod deflate;sudo a2enmod cache;sudo a2enmod cache_disk;sudo a2enmod expires
  • 验证与回滚:每次变更后执行 sudo systemctl reload apache2;若异常,快速回滚到上一版本配置并逐步恢复参数。

0