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 周)。
三 应用与架构层优化
- 静态资源减负:将图片、视频、归档与下载类资源迁移至 CDN 或 Nginx/对象存储,让 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;若异常,快速回滚到上一版本配置并逐步恢复参数。