优化Apache HTTPS握手内存消耗需协同调整会话复用、MPM模型、模块精简和静态分流:启用shmcb型SSLSessionCache并设超时,改用event MPM限制线程数,禁用冗余模块,静态资源由Apache直服。

优化 Apache 处理 HTTPS 握手时的内存消耗,核心在于减少 TLS 握手过程中的重复计算、避免缓存争用,并控制并发连接所占用的进程/线程资源。它不单是“调小某个值”,而是围绕 会话复用、MPM 模型、模块精简、静态内容分流 四个关键点协同调整。
启用并正确配置 SSLSessionCache
这是降低 HTTPS 握手开销最直接有效的手段:
- 使用 shmcb 后端(唯一 production-ready):
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000)
路径需提前创建并授权:
mkdir -p /var/cache/apache2 && chown www-data:www-data /var/cache/apache2 - 必须配对设置超时:
SSLSessionCacheTimeout 300(默认 300 秒),否则缓存永不老化,长期运行后内存持续增长 - 确认模块已加载:
httpd -M | grep socache,若无输出需启用mod_socache_shmcb - 避免使用 dbm(文件锁瓶颈)或 memcache(网络+序列化开销),它们在中高并发下反而抬高握手延迟
选用 event MPM 并合理限制并发线程
prefork 模型为每个连接 fork 一个进程,HTTPS 握手期间进程常驻内存开销大;event 模型以轻量线程处理连接,更适合 HTTPS 场景:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 启用 event MPM(Apache 2.4+ 默认支持),并在
mpm_event.conf中配置:ThreadsPerChild 25MaxRequestWorkers 400MinSpareThreads 25MaxSpareThreads 75 - 估算内存上限:若单线程 RSS 约 15MB(实测值),按 0.6 系数折算独占内存 ≈ 9MB,则 400 并发约需 3.6GB 内存 —— 根据服务器实际内存反推合理
MaxRequestWorkers - 禁用 prefork 或 worker 模块,防止配置冲突
精简模块,剥离与 HTTPS 握手无关的负担
每个加载的模块都增加常驻内存和初始化开销,尤其在 Java 反向代理场景下,多数模块完全冗余:
- 只保留必需模块:
mod_ssl、mod_proxy、mod_proxy_http、mod_rewrite、mod_headers、mod_deflate - 明确禁用:
mod_php、mod_perl、mod_dav、mod_cgi、mod_userdir等动态语言或非必要功能模块 - 验证生效:
httpd -M | grep -E "(proxy|ssl|rewrite)",确保无意外加载
将静态资源交由 Apache 直接服务,减轻后端压力
Java 应用(如 Tomcat)处理静态文件会触发完整 Servlet 生命周期,不仅耗 CPU,还延长连接保持时间,间接放大 HTTPS 握手后的内存占用:
- 在 Apache 配置中显式拦截常见静态后缀:
<LocationMatch "\.(js|css|png|jpg|gif|ico|woff2?)$">,并设ProxyPass !绕过代理 - 配合
mod_expires和mod_headers设置强缓存头,减少重复请求 - 启用
EnableSendfile on(内核支持时),绕过用户态拷贝,降低内存与 CPU 开销

















