sslsessioncache必须配置在apache全局配置中,语法为sslsessioncache shmcb:/path(大小),需启用mod_ssl和mod_socache_shmcb,配合sslsessioncachetimeout使用,并通过openssl或日志验证复用效果。

SSLSessionCache 配置位置和基本语法
Apache 的 SSLSessionCache 必须放在全局配置(httpd.conf 或 ssl.conf)中,不能写在 <virtualhost></virtualhost> 里——否则会报错 Invalid command 'SSLSessionCache', perhaps misspelled or defined by a module not included in the server configuration。它依赖 mod_ssl,且需确保该模块已启用。
基础写法是:
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000)
其中 shmcb 是推荐的共享内存缓存后端;路径需真实存在且 Apache 进程(如 www-data 或 apache)有读写权限;括号内数字是缓存大小(字节),512000 ≈ 500KB,够中小流量站点用。
为什么不用 dbm 或 memcache 后端
dbm 缓存(如 dbm:/path/to/cache)在高并发下容易因文件锁导致握手延迟上升,实测 QPS 超过 300 后 TLS 握手耗时可能翻倍;memcache 虽可分布式,但引入额外网络跳转和序列化开销,反而让 1-RTT 握手退化为接近 2-RTT。
shmcb 直接使用进程间共享内存,无磁盘 I/O、无网络、无序列化,是唯一被 Apache 官方标记为「production-ready」的 session cache 后端。
- 必须配合
SSLSessionCacheTimeout使用(默认 300 秒),否则缓存条目永不老化 - 若启用了
mod_socache_shmcb(较新版本 Apache 默认加载),shmcb才可用;检查方法:httpd -M | grep socache - 路径目录需提前创建并设权:
mkdir -p /var/cache/apache2 && chown www-data:www-data /var/cache/apache2
如何验证 SSLSessionCache 是否生效
不能只看 Apache 启动不报错——要确认缓存真正在用。最直接的方法是用 OpenSSL 模拟复用会话:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID"
如果连续两次输出的 Session-ID 相同,且第二行出现 Reused, TLSv1.3 或 Reused, TLSv1.2,说明复用成功。
更底层的验证方式是查 Apache 日志(开启 SSLLogLevel info):搜索 reusing session 或 inserting session 关键词。注意日志量大,建议临时加 SetEnvIf User-Agent "test" debug_ssl 配合 CustomLog 分离记录。
- 浏览器 DevTools 的 Security 标签页只显示当前连接是否复用,无法区分是客户端缓存还是服务端缓存
-
curl -I --http1.1 https://example.com不触发会话复用,因为 curl 默认不保持连接上下文 - 若用 Nginx 做前端代理,Apache 的
SSLSessionCache无效——此时应由 Nginx 配置ssl_session_cache
常见配置冲突和性能陷阱
最常被忽略的是 SSLProtocol 和 SSLCipherSuite 对会话复用的隐性影响:如果客户端首次握手用的是 TLS 1.2 + ECDHE-RSA-AES128-GCM-SHA256,而后续请求因 SNI 或 ALPN 切换到 TLS 1.3,Apache 默认不会复用旧会话——因为协议版本不同,缓存 key 不匹配。
解决办法不是禁用 TLS 1.3,而是确保 SSLSessionCache 的 key 包含足够维度:
- 添加
SSLSessionTickets off(禁用 RFC 5077 票据),强制走服务端缓存路径,避免客户端票据与服务端缓存不一致 - 避免在
<virtualhost></virtualhost>中覆盖SSLProtocol或SSLCipherSuite,否则不同 vhost 的缓存隔离会导致命中率骤降 - 多核机器上,
shmcb缓存本身是线程安全的,但若 Apache 使用eventMPM 且MaxRequestWorkers> 1000,建议把缓存大小提到 1MB+,否则缓存槽位不足会频繁驱逐
缓存大小不是越大越好:超过 2MB 后,shmcb 内部哈希表查找开销上升,实测在 4 核机器上 1MB 是吞吐与延迟的平衡点。











