mod_expires 几乎不构成高并发瓶颈,性能关键在于配置方式:应将规则移至主配置文件、禁用 .htaccess、优先用 expiresbytype、慎用 mod_headers、配合 event mpm 与 keepalive 优化连接复用。
mod_expires 本身不处理请求、不解析内容,只在响应生成阶段写入 expires 和 cache-control 头,所以它几乎不构成高并发瓶颈。真正影响性能的是配置方式是否合理、模块是否与其他机制冲突,以及缓存头是否引发客户端或中间代理的低效行为。
避免在 .htaccess 中启用 expires
每次请求都要逐级查找并解析 .htaccess 文件,开启 ExpiresActive On + 大量 ExpiresByType 规则会带来明显开销,尤其在高并发下。
- 把所有 expires 配置移到主服务器配置(/etc/apache2/sites-enabled/xxx.conf 或 /etc/httpd/conf.d/vhost.conf)中,用
或 包裹 - 确保 AllowOverride None 在全局或虚拟主机中启用,彻底禁用 .htaccess 解析
- 这样可让 Apache 在启动时一次性编译规则,运行时零解析成本
用 ExpiresByType 替代 FilesMatch + Header set
FilesMatch 按文件路径匹配,需做字符串比对;而 ExpiresByType 依赖已确定的 Content-Type 响应头,由内核级 MIME 映射直接查表,更快更稳定。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 不要写:FilesMatch "\.(jpg|jpeg|png)$" + Header set Expires ...
- 坚持用:ExpiresByType image/jpeg "access plus 1 year"
- 确保 MIME 类型定义准确(检查 /etc/mime.types 或 AddType 指令),否则类型不匹配会导致规则失效
关闭不必要的缓存头补充逻辑
mod_headers 可以补 Cache-Control: immutable 或 public,但每条 Header 指令都会触发一次响应头遍历。高频请求下叠加多条 Header set,会轻微拖慢响应组装。
- 如果已用 ExpiresByType 设好过期时间,且不依赖 immutable 特性(如资源带哈希指纹),可暂不启用 mod_headers 补充
- 必须用 Cache-Control 时,合并为单条指令:Header always set Cache-Control "public, max-age=31536000, immutable"
- 避免重复设置:例如同时用 ExpiresByType 和 Header set Expires,不仅冗余,还可能因顺序问题覆盖预期值
配合 MPM 和 KeepAlive 减少连接开销
expires 优化的是“单次响应头”,但高并发真实压力来自连接建立/释放。若每个静态资源都新建 TCP 连接,再快的 expires 也白搭。
- 确认启用了 event MPM(非 prefork),并开启 KeepAlive On
- 设 KeepAliveTimeout 5、MaxKeepAliveRequests 100,让浏览器复用连接加载多个缓存资源
- 这样即使有 10 个图片请求,实际可能只走 1–2 个 TCP 连接,大幅降低系统调用和上下文切换开销










