SSLSessionCache必须配置在Apache全局配置中,不能写在内;语法为SSLSessionCache shmcb:/path(大小),需启用mod_ssl和mod_socache_shmcb,配合SSLSessionCacheTimeout使用,并通过openssl或日志验证复用效果。
不能在虚拟主机(<virtualhost></virtualhost>)里配置 sslsessioncache——它必须放在 apache 全局作用域,否则会报错 invalid command 'sslsessioncache'。多站点共享会话缓存池的关键,是把缓存定义在 httpd.conf 或 ssl.conf 的顶层,而非每个 <virtualhost></virtualhost> 内部。
必须放在全局配置中
SSLSessionCache 是 Apache mod_ssl 的全局指令,只允许出现在服务器主配置(如 /etc/apache2/mods-enabled/ssl.conf 或 /etc/httpd/conf.d/ssl.conf)的 <ifmodule mod_ssl.c></ifmodule> 块内,或直接写在 httpd.conf 顶层。写进 <virtualhost></virtualhost> 会导致启动失败。
- 正确位置示例:
SSLSessionCache shmcb:/var/run/apache2/ssl_scache(1048576)
SSLSessionCacheTimeout 300 - 确保
mod_ssl和mod_socache_shmcb已启用:sudo a2enmod ssl socache_shmcb(Debian/Ubuntu)
或检查httpd -M | grep -E "(ssl|socache)" - 缓存路径目录需提前创建并授权:
sudo mkdir -p /var/run/apache2 && sudo chown www-data:www-data /var/run/apache2
使用 shmcb 后端实现真正共享
只有 shmcb(Shared Memory Cache Backend)能被多个 <virtualhost></virtualhost> 进程安全、高效地共用。它基于操作系统共享内存段,无文件锁、无网络延迟、无序列化开销。
由 ReMe 驱动的记忆管理系统,支持跨会话记忆持久化、自动应用用户偏好以及智能上下文压缩...
- 不推荐
dbm:单文件 + 文件锁,在并发高时握手延迟明显上升 - 慎用
memcache:引入网络调用和反序列化,实际可能退化为 2-RTT 握手 - 缓存大小建议:
512KB(512000)适合中小流量;
1MB(1048576)可支撑约 8000–12000 个活跃 TLS 会话;
超过 2MB 一般没必要,反而增加内存碎片风险
配合 SSLSessionTickets 提升复用率
仅靠 Session ID 复用不够稳定,尤其在客户端重启或跨设备访问时。开启会话票证(Session Tickets)可让客户端自主携带加密票据,服务端无需查缓存即可恢复会话。
- 在全局配置中添加:
SSLSessionTickets on - 可选增强(非必需):
SSLSessionTicketKeyFile /etc/apache2/ssl/ticket.key(手动管理密钥轮换) - 注意:TLS 1.3 默认启用更安全的 PSK 机制,
SSLSessionTickets对其影响有限,但仍建议开启以兼容 TLS 1.2 客户端
验证是否真正共享生效
不能只看 Apache 是否启动成功,要确认不同域名的请求确实命中同一个缓存池。
- 用 OpenSSL 分别测试两个域名:
openssl s_client -connect site1.com:443 -servername site1.com -reconnect 2>/dev/null | grep "Session-ID\|Reused"openssl s_client -connect site2.com:443 -servername site2.com -reconnect 2>/dev/null | grep "Session-ID\|Reused"
若两者都出现 Reused, TLSv1.3 或 Reused, TLSv1.2,说明缓存池已被复用 - 查日志确认(需临时开启):
在全局配置加SSLLogLevel info,然后grep "reusing session" /var/log/apache2/ssl_engine.log,观察不同ServerName的请求是否都触发了复用日志

















