apache的sslsessioncache共享的是tls会话票据(session id或session ticket),而非证书;必须使用shmcb共享内存后端实现跨进程复用,配置需在全局作用域中设置路径、大小(如10mb)和超时(300秒),并确保权限与mod_socache_shmcb启用,通过server-status或openssl验证hit率。

Apache 的 SSLSessionCache 并不共享“证书状态”,它共享的是 TLS 层的会话票据(Session ID 或 Session Ticket),用于跳过完整握手、提升 HTTPS 连接复用率。所谓“跨进程证书共享”是常见误解——证书本身由虚拟主机配置加载,每个进程都独立持有;真正需要跨进程共享的,是已协商完成的 TLS 会话缓存。
必须用 shmcb 共享内存后端
Apache 默认以多进程模型运行(如 prefork 或 event MPM),若使用 dbm 或 none 后端,各子进程各自维护缓存,无法互通,复用率极低。只有 shmcb(Shared Memory Cache Backend)能让所有工作进程读写同一块内存区域:
- 无磁盘 I/O 和网络开销,响应快,适合高并发
- 无需额外依赖(如 Berkeley DB),Apache 自带,开箱即用
- 缓存大小可控,避免频繁淘汰或内存浪费
关键配置项与路径权限
以下两行必须写在全局配置中(如 httpd.conf 或 ssl.conf),不能放在 <virtualhost></virtualhost> 块内:
SSLSessionCache "shmcb:/var/cache/apache2/ssl_scache(10485760)" SSLSessionCacheTimeout 300
-
/var/cache/apache2/ssl_scache是共享内存段的路径,需提前创建并赋权:mkdir -p /var/cache/apache2 && chown www-data:www-data /var/cache/apache2(Debian/Ubuntu)或chown apache:apache /var/cache/apache2(RHEL/CentOS) -
(10485760)表示 10MB 缓存空间,适合 QPS 500–1500 的中高流量场景(1MB ≈ 存 1000–2000 个会话) -
SSLSessionCacheTimeout 300设为 300 秒(5 分钟),与主流客户端默认行为匹配;低于 180 秒易导致复用失败
验证是否真正生效
仅检查配置不报错远远不够,要确认运行时缓存被实际使用:
- 启用
mod_status并访问http://your-server/server-status?auto,查找类似输出:cache type: SHMCB, shared memory: 10485760 bytes, current entries: 942<br>total retrieves since starting: 7215 hit, 312 miss
关注hit显著大于 0,且current entries非零并随流量波动 - 用 OpenSSL 模拟复用:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID"
若第二行显示Reused, TLSv1.3,说明复用成功 - 确保
mod_socache_shmcb已启用:httpd -M | grep socache应有输出
注意:这不是分布式,也不涉及证书状态同步
SSLSessionCache 仅限单机多进程间共享,完全不跨机器。它不处理证书吊销状态(OCSP/CRL)、不共享私钥、不干预 Java 的 HttpSession。若需多台 Apache 实例间复用 TLS 会话,应启用 SSLSessionTickets on 并统一分发 SSLSessionTicketKeyFile;若需共享应用层会话(如登录态),应使用 Redis、Memcached 等外部存储。











