Apache静态资源优化实操指南
说到Apache的性能调优,静态资源这块儿其实是最容易出效果、也最容易被忽视的环节。很多运维同学一上来就怼内存、调内核参数,结果发现浏览器缓存压根没配,压缩也没开,白白浪费了服务器资源。今天咱们就把这几个核心优化点掰开揉碎,说清楚每一步怎么配、怎么验证,顺便把那些容易踩的坑也指出来。
一、启用压缩与连接复用
压缩是减少传输体积最直接的手段,但有个前提:别对已经压缩过的图片再动手。
- 启用模块:Debian/Ubuntu 下执行
sudo a2enmod deflate;CentOS/RHEL 确认mod_deflate已安装。 - 推荐配置(
/etc/apache2/mods-enabled/deflate.conf或httpd.conf):# 压缩文本与脚本类资源 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css \ application/ja vascript application/x-ja vascript application/xml \ application/xhtml+xml image/svg+xml # 避免对已经压缩的二进制图片重复压缩 SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary # 兼容老浏览器 BrowserMatch ^Mozilla/4 gzip-only-text/html # 让缓存按 Accept-Encoding 区分版本 Header append Vary Accept-Encoding # 压缩级别:1-9,默认通常为 6,兼顾压缩率与 CPU DeflateCompressionLevel 6 - 启用长连接(建议值):
KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 - 验证:重启后打开浏览器开发者工具,或者用
curl -I看响应头里有没有Content-Encoding: gzip。
二、设置强缓存与验证
缓存策略直接决定了用户回访时的加载速度。强缓存(一年)给带指纹的资源,协商缓存(每次都问服务器)给 HTML 和 JSON,这是业界通行的做法。
- 启用模块:Debian/Ubuntu 执行
sudo a2enmod expires headers;CentOS/RHEL 确认mod_expires与mod_headers已加载。 - 推荐配置(在 VirtualHost 或全局配置中):
# 1) 使用 Expires 模块设置 Expires 与 Cache-ControlExpiresActive On ExpiresByType image/jpg "access plus 1 year" ExpiresByType image/jpeg "access plus 1 year" ExpiresByType image/gif "access plus 1 year" ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" ExpiresByType application/ja vascript "access plus 1 month" ExpiresByType application/x-ja vascript "access plus 1 month" ExpiresByType image/svg+xml "access plus 1 year" # 2) 用 Headers 精细控制# 对带指纹/版本号的资源设置“强缓存” Header set Cache-Control "public, max-age=31536000, immutable" # 对可能频繁变动的资源设置“协商缓存”Header set Cache-Control "public, max-age=0, must-revalidate" - 缓存时间写法要点:
access plus 1 month、now plus 30 days、A2592000(从访问时计算)modification plus 5 hours 3 minutes、M604800(从文件最后修改时间计算,M 仅对静态文件有效)
- 验证:检查响应头是否包含
Cache-Control: max-age=…与Expires,以及Vary: Accept-Encoding。
三、启用 HTTP/2 与资源分发
HTTP/2 的多路复用能让一个连接同时处理多个请求,配合 CDN 分发,效果立竿见影。
- 启用 HTTP/2(Apache 2.4.17+):
- 模块:
sudo a2enmod http2(Debian/Ubuntu);编译时加入--enable-http2(源码)。 - 在 VirtualHost 中:
Protocols h2 http/1.1
- 模块:
- 使用 CDN:将图片、字体、JS/CSS 等静态资源托管到 CDN,可显著降低源站带宽与首包时间,并配合上述压缩与缓存策略提升命中率与回源效率。
四、资源本身与运维优化
前端资源和后端配置两手都要硬。资源本身不够轻,再好的缓存策略也帮不上忙。
- 图片优化:使用 ImageOptim、TinyPNG、imagemin 等工具无损/有损压缩,减少体积。
- 资源合并与版本化:合并与压缩前端资源,并通过文件名加 hash(如
app.a1b2c3.js)解决强缓存更新问题。 - 减少不必要模块:禁用不使用的模块(如
a2dismod),降低内存占用与攻击面。 - 监控与压测:使用 Apache Bench(ab)、WebPageTest 等工具持续评估 TTFB、RPS、带宽、CPU 等指标,按结果微调压缩级别与缓存策略。
五、一键检查与常见问题
配置写完了,怎么确认生效?怎么排查问题?这里给出几个常用命令和要点。
- 模块是否已启用:
- Debian/Ubuntu:
apache2ctl -M | egrep 'deflate_module|expires_module|headers_module|http2_module' - CentOS/RHEL:
httpd -M | egrep 'deflate_module|expires_module|headers_module|http2_module'
- Debian/Ubuntu:
- 配置语法与生效:
- 语法检查:
sudo apache2ctl configtest(Debian/Ubuntu)或sudo httpd -t(CentOS/RHEL) - 重启服务:
sudo systemctl restart apache2(或httpd)
- 语法检查:
- 常见问题与要点:
- 已压缩的 GIF/JPG/PNG 不要再压缩,节省 CPU 并避免潜在质量损失。
- 设置
Vary: Accept-Encoding,确保 CDN/浏览器 能正确区分并缓存压缩与非压缩版本。 - 强缓存资源务必使用 文件名哈希 或版本号,避免用户端长期拿到旧文件。