Apache mod_ssl 通过 shmcb 共享内存缓存 TLS 会话票据(非证书),实现多进程间会话复用;需配置 SSLSessionCache "shmcb:路径(大小)" 和 SSLSessionCacheTimeout,确保 Apache 用户对路径有读写权限,并通过 server-status 验证 hit/miss 比率。

Apache 的 mod_ssl 本身不处理 Java 应用的 HttpSession,它管理的是 TLS 层的会话复用状态(即 SSL/TLS Session Cache),目标是让客户端重复访问时跳过完整握手,降低 CPU 开销和延迟。所谓“跨进程证书共享”其实是个常见误解——SSLSessionCache 共享的不是证书,而是已建立的 TLS 会话票据(Session ID 或 Session Ticket),且必须由 Apache 多个工作进程共同访问同一块内存区域才能实现跨进程复用。
为什么需要 shmcb 而不是文件或数据库后端
Apache 默认以多进程模型运行(prefork MPM),每个子进程独立处理请求。若用 dbm 或 none 后端,会话信息无法互通,导致复用率极低;而 shmcb(Shared Memory Cache Backend)基于 Apache 自带的共享内存段,所有子进程可读写同一块内存,天然支持跨进程共享:
- 无磁盘 I/O,响应快,适合高并发场景
- 无需额外依赖(如 Berkeley DB),开箱即用
- 缓存大小可控,避免内存溢出或频繁淘汰
启用 shmcb 缓存的关键配置项
在 httpd.conf 或全局 SSL 配置中添加以下两行(位置需早于虚拟主机配置加载):
SSLSessionCache "shmcb:/var/cache/apache2/ssl_scache(512000)" SSLSessionCacheTimeout 300
说明:
-
/var/cache/apache2/ssl_scache是共享内存文件路径,需确保 Apache 运行用户(如www-data或apache)对该目录有读写权限 -
(512000)表示分配 512KB 内存,通常可缓存约 4000–6000 个会话(具体取决于证书长度和 TLS 版本) -
SSLSessionCacheTimeout 300设为 300 秒(5 分钟),与多数客户端默认行为匹配;过长易积压无效会话,过短则复用率下降
验证缓存是否生效
启用 mod_status 后访问 http://your-server/server-status?auto,应看到类似输出:
SSL/TLS Session Cache Status: cache type: SHMCB, shared memory: 512000 bytes, current sessions: 127 sub-caches: 32, indexes per sub-cache: 133 total retrieves since starting: 892 hit, 103 miss
关键指标:
-
hit数远大于miss,说明复用正常 -
current sessions值稳定波动,非持续归零 - cache type: none 或无统计行,说明配置未加载或路径权限错误
配合反向代理场景的注意事项
当 Apache 作为前置 HTTPS 终止代理(如反代 Tomcat),务必确认 TLS 在 Apache 层结束:
- Java 应用只需走 HTTP 或 AJP,不再承担 TLS 计算压力
- 此时优化 SSLSessionCache 才真正起效;若 Tomcat 自己也启用了 HTTPS(如
sslEnabled="true"),会造成双重握手,反而拖慢性能 - 检查 Tomcat 的
server.xml,确保 Connector 的secure="false"、scheme="http",并关闭其 SSL 相关配置


















