sslsessioncache必须配置在apache全局配置中,不能写在里;它通过shmcb共享内存段实现多进程间tls会话复用,需配合sslsessioncachetimeout和sslsessiontickets使用,并通过server-status或openssl验证生效。
虚拟主机本身不能配置 sslsessioncache——这个指令必须放在 apache 全局配置中,否则会直接报错。ssl 会话缓存(即 tls 层的 session id 或 session ticket 复用)是进程级资源,跨进程共享靠的是 shmcb 共享内存段,不是靠虚拟主机设置。
SSLSessionCache 必须写在全局配置里
它不支持出现在 <virtualhost></virtualhost> 块内。正确位置是 httpd.conf、ssl.conf 或 Ubuntu 系统中 /etc/apache2/mods-enabled/ssl.conf 这类全局加载的文件里:
- 写法示例:
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000) - 路径需真实存在,且 Apache 运行用户(如
www-data)有读写权限 - 括号内数字单位是字节,512000 ≈ 500KB,适合中小流量站点
为什么虚拟主机里配不了,但能实现跨进程复用
Apache 默认使用 prefork 或 event MPM,启动多个子进程处理请求。SSLSessionCache 的作用对象是这些子进程共同访问的一块共享内存区域:
-
shmcb后端由操作系统提供共享内存段,所有子进程可读写同一地址空间 - 客户端首次握手后,会话信息存入该内存;后续请求无论落到哪个子进程,都能查到并复用
- 这不是“虚拟主机之间共享”,而是“所有启用 HTTPS 的虚拟主机共用同一块缓存”
配合使用的必要参数
单有 SSLSessionCache 不够,还需两个关键项协同工作:
-
SSLSessionCacheTimeout 300:设为 300 秒(5 分钟),与主流客户端默认行为对齐;太长易堆积无效会话,太短则命中率低 -
SSLSessionTickets on:启用会话票据机制,让多台服务器(非单机多进程)也能复用——但注意:这和SSLSessionCache是两套机制,前者用于分布式,后者用于单机多进程
验证是否真正在跨进程生效
不能只看配置是否加载成功,要确认缓存被实际使用:
- 启用
mod_status后访问http://your-server/server-status?auto,看到cache type: SHMCB且hit数明显大于miss - 用 OpenSSL 测试:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID",若第二行出现Reused, TLSv1.3,说明复用成功 - 检查 Apache 错误日志(开启
SSLLogLevel info)是否有reusing session记录











