sslsessioncache 不支持分布式共享,它仅限单机进程间共享,依赖 shmcb 或 dbm,无法跨机器或对接 redis;分布式 tls 会话复用需启用 sslsessiontickets 并统一 ticket key。

SSLSessionCache 不支持分布式共享,别被名字误导
直接说结论:SSLSessionCache 是 Apache 自带的本地会话缓存机制,只在单个进程或同一台机器的多个子进程中生效。它底层依赖 shmcb(共享内存)或 dbm(磁盘文件),**完全不跨机器**,也无法与 Redis、Memcached 等外部存储联动。所谓“分布式 SSL 会话共享”本身是个伪命题——TLS 层面没有标准的分布式会话同步协议。
真正能用于分布式环境的是 SSLSessionTickets
如果你的目标是让多个 Apache 实例(比如负载均衡后端)都能识别并复用同一个客户端的 TLS 会话,必须启用会话票据(Session Tickets),而不是依赖 SSLSessionCache:
-
SSLSessionTickets on必须开启,这是前提 - 所有 Apache 实例必须使用**相同的会话密钥(ticket key)**,否则票据无法解密;可通过
SSLSessionTicketKeyFile指定一个共享的二进制密钥文件(建议 48 字节,AES256 加密) - 密钥文件需手动分发到每台服务器,且权限设为
600(仅 root 可读) - Apache 2.4.12+ 才完整支持密钥轮换,旧版本只能用静态密钥
示例配置片段:
SSLSessionTickets on SSLSessionTicketKeyFile /etc/apache2/ssl/ticket.key
为什么不能用 SSLCacheKeyLog 或 shmcb 做分布式
常见误解是以为 SSLCacheKeyLog 或 SSLSessionCache "shmcb:..." 能导出会话状态供其他节点使用。实际上:
-
SSLCacheKeyLog只用于调试(如 Wireshark 解密 TLS 流),输出的是明文 master secret,**不是会话状态本身**,也不可用于恢复握手 -
shmcb缓存路径如/var/run/apache2/ssl_scache是操作系统级共享内存段,仅限本机进程访问,网络不可见 - 即使你把
shmcb文件复制到另一台机器,Apache 启动时会校验其结构和大小,直接拒绝加载
分布式场景下真正要关注的是应用层会话,不是 TLS 层
TLS 会话复用解决的是「单次连接建立开销」,而分布式系统里用户登录态、购物车等数据属于应用层会话,两者完全无关。如果你遇到多台 Apache 后面接 Java/PHP 应用时 session 丢失:
- 不要折腾
SSLSessionCache,它管不了 HTTP Cookie 或 JWT - 该配 Redis 共享 PHP 的
session.save_handler = redis,或 Spring Session 集成 Redis - 网关类服务(如 ShenYu、Linkis)需单独配置
linkis.session.redis.cache.enabled=true这类开关
混淆 TLS 会话和应用会话,是线上故障最常被忽略的根源之一。











