apache小文件优化核心是减少并发单位开销、避免无效驻留、绕过动态处理:优先用浏览器和cdn缓存;精简模块(禁用mod_php、mod_cache等);选用event mpm并调低minsparethreads、maxkeepaliverequests和keepalivetimeout;启用enablesendfile on、enablemmap off;操作系统层面调低swappiness和tcp_fin_timeout。

Apache 处理小文件(如图标、CSS、JS、字体等)时,内存占用容易被低估——看似单个文件几 KB,但高并发下大量连接+进程/线程驻留+缓存元数据叠加,会迅速吃掉数百 MB 甚至数 GB 内存。优化核心不是“压单次请求”,而是减少并发单位开销、避免无效驻留、绕过动态处理路径。
优先用浏览器和 CDN 缓存,绕过 Apache 动态处理
绝大多数小文件是静态且长期不变的,根本不需要 Apache 启动 PHP 或执行重写规则。直接让客户端和边缘节点缓存,可大幅降低后端并发压力。
- 在
<directory></directory>或<location></location>块中启用mod_expires和mod_headers:
ExpiresActive On ExpiresByType image/png "access plus 1 year" ExpiresByType text/css "access plus 1 month" ExpiresByType application/javascript "access plus 1 month" Header always set Cache-Control "public, immutable"
- 添加
Header unset Last-Modified和Header unset ETag,避免 Apache 为每个小文件生成并比对这些头,节省 CPU 和内存开销; - 若使用 CDN(如 Cloudflare、阿里云全站加速),确保其缓存策略与 Expires 一致,并开启“跳过查询字符串”和“忽略 Set-Cookie”等选项,防止缓存失效。
禁用或精简模块,减少常驻内存
默认 Apache 加载了大量与小文件无关的模块(如 mod_php、mod_proxy、mod_ssl 若未启用 HTTPS),每个模块都占用固定内存空间,且可能触发额外初始化逻辑。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 运行
httpd -M查看已加载模块,只保留必需项:mod_alias、mod_authz_host、mod_deflate、mod_expires、mod_headers、mod_mime、mod_rewrite(若需重写); - 注释掉所有
LoadModule行中非必需模块,例如:#LoadModule php_module modules/libphp.so; - 特别注意关闭
mod_cache_socache和mod_cache_disk——它们对小文件不仅无益,反而因元数据管理(尤其是 socache 的 shmcb 共享内存池)增加内存碎片和锁竞争。
调优 MPM 参数,控制并发资源粒度
小文件请求响应快,但若 Apache 进程/线程长时间空闲等待 KeepAlive,就会白白占着内存。关键是缩短生命周期、缩小池规模、匹配实际负载。
- 选用
eventMPM(推荐)或worker,而非prefork:单进程多线程模型显著降低内存 footprint(一个进程约 2–5 MB,而 prefork 下每个子进程约 10–30 MB); - 降低空闲资源保有量:
MinSpareThreads 15MaxSpareThreads 45StartServers 2
(避免启动即占用上百 MB); - 限制单个线程/进程寿命:
MaxConnectionsPerChild 2000(防止内存缓慢泄漏累积); - KeepAlive 要开,但要“短平快”:
KeepAlive OnMaxKeepAliveRequests 150KeepAliveTimeout 3(3 秒足够复用多个小文件请求,超时即释放线程)。
启用 sendfile 和内核级优化,减少用户态拷贝
传输小文件时,传统 read()+write() 会在内核态和用户态之间多次拷贝数据,消耗 CPU 和内存带宽。启用 sendfile 可让内核直接从磁盘 DMA 到网卡,跳过用户空间。
- 确认已启用:
EnableSendfile On(Apache 2.2+ 默认开启,但仍建议显式声明); - 搭配
EnableMMAP Off(尤其在 NFS 或某些虚拟化环境下,mmap 可能引发内存映射冲突或延迟); - 操作系统层面配合:
确保/proc/sys/vm/swappiness≤ 10(减少 swap 干扰);
设置net.ipv4.tcp_fin_timeout = 30(加快 TIME_WAIT 回收,释放 socket 内存)。
不复杂但容易忽略:小文件优化本质是“让请求尽量不进 Apache 核心”。能由浏览器缓、CDN 缓、内核送的,就别让 Apache 解析、重写、压缩、缓存。参数调得再细,也比不上少启动一个进程。










