Ubuntu 上 Apache2 性能提升实操指南
一 基线评估与监控
- 启用状态页定位瓶颈:执行 sudo a2enmod status,在虚拟主机或全局配置中加入
<Location “/server-status”>
SetHandler server-status
Require local
访问 http://服务器IP/server-status 查看 Busy/Idle workers、每秒请求数 等关键指标。配合 htop、sar 观察 CPU、内存、I/O 使用率,先建立优化前的基线数据再逐项调整。
二 核心优化步骤
- 选择高效 MPM
- Prefork:兼容非线程安全模块(如部分旧版 PHP),稳定但内存占用高。
- Worker/Event:线程/事件驱动,适合高并发,内存更省。若使用线程安全版本的 PHP-FPM,优先 mpm_event。切换示例:sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2。
- 开启持久连接与压缩
- KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 2(繁忙站点建议 1–5 秒)。
- 启用压缩:sudo a2enmod deflate;为文本类资源启用压缩(如 text/html、text/css、application/javascript)。
- 启用缓存与静态资源过期
- 启用 mod_expires 设置 Cache-Control/Expires,提升浏览器与反向代理缓存命中率。
- 启用 mod_cache/mod_disk_cache 做服务器端页面/对象缓存(可选,视业务与后端动态性而定)。
- 优化超时与日志
- Timeout 30(过高会占用连接更久)。
- LogLevel warn,减少磁盘 I/O 与日志开销。
- 启用 HTTP/2
- 在 ports.conf 使用:Listen 443 ssl http2,并正确配置 SSL 证书,提升并发与首包时间表现。
三 关键参数示例与计算
- 计算前提与方法
- 估算每个 worker/进程 的内存占用(RSS),用 free -m 观察常态占用;结合可用内存与安全余量,确定 MaxRequestWorkers/MaxClients 上限,避免 OOM 与频繁换页。
- Prefork 示例(非线程安全 PHP 常用)
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxRequestWorkers 256
MaxConnectionsPerChild 250
说明:该示例来自生产常见做法,数值需按内存与压测结果微调。
- 事件/Worker 思路(需线程安全后端)
- 关注 ThreadsPerChild、MaxRequestWorkers 等;原则是“在内存与后端可承受的前提下提高并发,但避免把连接全部占满”。
- 其它通用参数
- Timeout 30
- KeepAlive On、MaxKeepAliveRequests 100、KeepAliveTimeout 2
- LogLevel warn
以上参数与示例可作为起点,务必结合压测与监控逐步微调。
四 架构与运维层面的优化
- 静态资源交付
- 使用 CDN 缓存图片、视频、下载与静态文件,降低源站压力与跨地域时延。
- 反向代理与负载均衡
- 在 Apache 前放置 Nginx/HAProxy 做反向代理与负载均衡,横向扩展后端实例,平滑应对流量峰值。
- 模块与功能精简
- 禁用不需要的模块(如 a2dismod module_name),减少攻击面与初始化开销。
- 日志与磁盘 I/O
- 使用 logrotate 管理日志轮转,避免日志过大影响性能与磁盘空间。
- 数据库与应用层
- 优化 SQL 查询、索引与连接池;启用应用层缓存(如对象缓存),降低后端数据库压力。
五 快速检查清单
- 已启用 mpm_event/mpm_worker(或确认 prefork 为必需),并完成切换与重启。
- KeepAlive、压缩、缓存、过期、HTTP/2 已正确开启并验证生效。
- 超时与日志级别已按建议调整,状态页可访问且指标正常。
- 已做压测(如 ab、wrk、jmeter)与监控基线,关键参数按监控结果微调。
- 静态资源走 CDN,高并发场景前置 Nginx/HAProxy 或做负载均衡。