生产环境Apache调优核心是“先定模型,再调参数,最后加固”:按场景选MPM(event/prefork),配静态资源缓存、TLS精简、日志分离与轮转、错误率监控。

生产环境 Apache 调优不是堆参数,而是按场景分层解决真实瓶颈:并发扛不住、静态资源慢、HTTPS不稳、日志失控、安全被扫。核心是“先定模型,再调参数,最后加固”。
选对 MPM 模型,别硬套默认配置
Apache 的并发能力由 MPM(多处理模块)决定,不是所有服务器都适合 event 或 prefork。 - 内存充足(≥4GB)、启用 HTTPS 且有较多长连接(如 WebSocket、API 接口)→ 用 **event MPM** - 纯 PHP-CGI 或旧模块不兼容线程 → 用 **prefork MPM** - 不确定或混合负载 → 先用 event,压测验证后再切换关键参数要匹配硬件:
- event 模式(4核8GB 示例):
StartServers 3
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 10000 - prefork 模式(同配置):
StartServers 8
改完执行 sudo systemctl restart apache2,再用 apache2ctl -V | grep MPM 确认生效。
MinSpareServers 8
MaxSpareServers 16
MaxRequestWorkers 256
MaxConnectionsPerChild 10000
静态资源必须缓存,别让浏览器反复拉
90% 的页面加载延迟来自重复请求 CSS、JS、图片。光开 mod_expires 不够,得配对控制。 启用模块:sudo a2enmod expires headers 在虚拟主机或目录段中加:ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
Header set Cache-Control "public, max-age=2592000"
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
HTTPS 不只是装证书,TLS 配置错了照样慢又不安全
强制跳转 + 协议精简 + 密钥交换优化,三者缺一不可。 启用模块:sudo a2enmod ssl rewrite 在 HTTP 虚拟主机里加重定向:RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
SSLEngine on
SSLProtocol all -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder on
SSLCompression off
日志和监控不配好,出事只能靠猜
默认 access.log 写满磁盘、没字段、难分析,等于没日志。 分离日志路径(避免和系统日志混):LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %D" combined
CustomLog /var/log/apache2/access-prod.log combined
ErrorLog /var/log/apache2/error-prod.log
/var/log/apache2/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 644 www-data www-data
sharedscripts
postrotate
if systemctl is-active --quiet apache2; then
systemctl reload apache2 > /dev/null
fi
endscript
}
不复杂但容易忽略。

















