sslsessioncache 通过 shmcb 共享 tls 会话状态以实现跨子进程复用,必须配置在全局作用域、使用共享内存后端、设置超时时间并确保路径权限正确。

Apache 的 SSLSessionCache 本身不共享“证书状态”,它共享的是 TLS 会话状态(Session ID 或 Session Ticket),用于加速后续 HTTPS 连接的复用。所谓“跨子进程的证书状态共享”实际是指:多个 Apache 工作进程(worker、event 或 prefork 模式下的子进程)能共同读写同一份 TLS 会话缓存,避免各自重复握手。实现这一点的关键是使用支持进程间共享的缓存后端——shmcb。
必须用 shmcb 后端,不能放在虚拟主机内
shmcb(Shared Memory Cache Backend)基于 Apache 自带的共享内存段机制,天然支持多进程并发访问,无需锁竞争或网络通信。配置必须写在全局作用域(如 httpd.conf 或 ssl.conf 的顶层),不能嵌入 <virtualhost></virtualhost> 块中,否则会报错:
- Invalid command 'SSLSessionCache', perhaps misspelled...
- 因为该指令仅在服务器主配置阶段解析,且依赖
mod_socache_shmcb模块提前加载
正确配置路径与权限
缓存路径需真实存在,且 Apache 主进程启动用户(如 www-data、apache 或 daemon)对该路径有读写权限:
- 创建目录并授权:
mkdir -p /var/cache/apache2/ssl && chown www-data:www-data /var/cache/apache2/ssl - 配置示例:
SSLSessionCache "shmcb:/var/cache/apache2/ssl/ssl_scache(512000)" - 括号内数字单位为字节,512000 ≈ 500KB,适合中小流量;高并发站点可设为
2097152(2MB)
必须搭配 SSLSessionCacheTimeout 控制生命周期
缓存条目不会自动过期,必须显式设置超时时间,否则旧会话长期驻留,占用空间且可能影响安全性:
- 推荐值:
SSLSessionCacheTimeout 300(5 分钟),与多数客户端默认行为对齐 - 若设为 0 或不配置,缓存永不老化,可能导致缓存膨胀或复用陈旧会话
- 该值应略小于客户端发送的
max_early_data或session_timeout(TLS 1.3 下)
验证是否真正跨进程生效
仅靠配置不等于生效,需确认三点:
- 模块已启用:
httpd -M | grep -E '(ssl|socache_shmcb)'应同时输出ssl_module和socache_shmcb_module - 缓存路径可写:
sudo -u www-data touch /var/cache/apache2/ssl/test && rm /var/cache/apache2/ssl/test - 观察复用效果:启用
mod_status并访问/server-status?auto,关注SSLSessionCacheSize和SSLSessionCacheCurrent字段变化;或用openssl s_client -connect example.com:443 -reconnect多次连接,查看日志中Reused session出现频次











