Debian 上 Apache2 性能优化实操指南
一 基线检查与模块精简
- 保持系统与软件包为最新:执行 sudo apt update && sudo apt upgrade,及时获取性能与安全性修复。
- 精简加载模块:仅启用必需模块,减少内存与启动开销。示例:禁用目录浏览 sudo a2dismod autoindex;按需启用 a2enmod rewrite ssl headers expires deflate brotli(Brotli 需安装相应包)。
- 动态语言与 Apache 解耦:尽量用 PHP-FPM/uWSGI/Gunicorn 替代 mod_php/Passenger,可显著降低每个 Apache 进程的内存占用,提升并发承载。
- 监控与诊断:启用 mod_status 与 ExtendedStatus,访问 http://localhost/server-status 查看当前连接、工作进程与排队情况;使用 Apache2Buddy 快速评估内存与 MaxRequestWorkers 配置:
curl -L http://apache2buddy.pl/ | perl
以上做法有助于在不牺牲稳定性的前提下,快速发现瓶颈与过度占用资源的模块。
二 MPM 选择与关键参数
- 选择高效 MPM:在 Apache 2.4 优先使用 event MPM 处理高并发与长连接;若依赖非线程安全模块或旧组件,可回退 prefork。切换示例:
sudo a2dismod mpm_prefork && sudo a2enmod mpm_event && sudo systemctl restart apache2
- 计算与设置并发:先估算单个工作进程/线程的内存占用(RSS),再结合可用内存设置 MaxRequestWorkers(事件/工作线程)或 MaxClients(预派生)。示例公式:
MaxRequestWorkers ≈ 可用内存 / 单进程RSS(建议预留 20%–30% 给系统与其他服务)。
- 参考示例(需结合实际压测微调):
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
- 连接复用:开启 KeepAlive On,适度设置 KeepAliveTimeout(如 5–10 秒)与 MaxKeepAliveRequests(如 100),减少握手与慢启动开销。
- 验证与回滚:每次变更后执行 apache2ctl configtest,确认语法无误再重载;通过 server-status 与压测工具观察队列、CPU、内存与 5xx 错误变化。
三 传输压缩与浏览器缓存
- 启用压缩:同时启用 mod_deflate 与 mod_brotli(若已安装),对文本类资源进行压缩,降低带宽与时延。
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/json
AddOutputFilterByType BROTLI text/html text/plain text/xml text/css text/javascript application/javascript application/json
- 强缓存策略:启用 mod_expires 与 mod_headers,为静态资源设置长期 Cache-Control/Expires,对带指纹/版本号的资源设置可长期缓存,对 HTML 设置较短协商缓存。
ExpiresActive On
ExpiresByType image/jpeg “access plus 1 year”
ExpiresByType image/png “access plus 1 year”
ExpiresByType text/css “access plus 1 year”
ExpiresByType application/javascript “access plus 1 year”
ExpiresByType text/html “access plus 600 seconds”
- 资源优化:图片采用 WebP/AVIF 等现代格式并压缩;合并/最小化 HTML/CSS/JS;启用 HTTPS 提升安全与搜索可见性。
四 页面与数据库层加速
- 应用层缓存:部署 Varnish 作为反向代理缓存整页或片段,显著减轻后端负载;对数据库查询结果使用 Memcached 或 Redis 做对象缓存。
- PHP 加速:安装并启用 PHP OPcache,减少脚本编译开销;按需调整 memory_limit、max_execution_time。
sudo apt install php-opcache && sudo phpenmod opcache
- 数据库优化:针对 MySQL/MariaDB,优先调大 innodb_buffer_pool_size(常设为内存的 50%–80%,视业务而定),并定期维护表与索引。
- 架构解耦:静态资源交由 CDN 分发,动态请求回源;必要时采用 Nginx + Apache 组合,Nginx 处理静态与反向代理,Apache 专注动态应用。
五 监控验证与持续优化
- 实时监控:使用 mod_status/ExtendedStatus 观察 Busy/Idle workers、Scoreboard、Total Accesses;结合 Prometheus + Grafana 搭建指标大盘,持续跟踪 CPU、内存、连接队列、响应时延、5xx 比例。
- 日志分析:用 GoAccess 对访问日志进行可视化分析,定位慢页面、热门资源与异常流量。
- 压测与迭代:使用 siege/ab/wrk 进行基线压测与回归压测,小步调整 MaxRequestWorkers/KeepAlive/压缩/缓存 等参数,观察 P95/P99 时延与错误率 的变化,形成可回滚的优化闭环。