sslsessioncache大小需按并发连接数与会话生命周期估算:每会话约80–120字节,峰值会话数=每秒新连接×超时时间,再加20%余量;必须配sslsessioncachetimeout并用openssl验证复用效果。

直接在 Apache 全局配置中设置 SSLSessionCache 的大小,核心是让缓存容量匹配实际并发连接数和会话生命周期——太小会频繁淘汰导致复用率下降,太大则浪费内存且无收益。
缓存大小怎么算才合适
512000(即 512KB)是中小流量站点的常用起点,但高频连接场景需按实际估算:
- 每个 TLS 会话缓存条目平均占 80–120 字节(取决于证书长度、协议版本等)
- 假设你每秒有 500 个新 HTTPS 连接,平均会话存活 300 秒(
SSLSessionCacheTimeout值),理论峰值会话数 ≈ 500 × 300 = 150,000 - 按 100 字节/条估算,所需缓存 ≈ 150,000 × 100 = 15,000,000 字节 ≈ 15MB
- 生产环境建议预留 20% 余量,可设为
shmcb:/var/cache/apache2/ssl_scache(18000000)
路径与权限必须提前处理好
缓存路径不是“写上就行”,Apache 进程必须能读写该文件所在目录:
- 创建目录并赋权(以 Debian/Ubuntu 的 www-data 用户为例):
sudo mkdir -p /var/cache/apache2sudo chown www-data:www-data /var/cache/apache2 - 确保
mod_socache_shmcb已启用:httpd -M | grep socache或a2enmod socache_shmcb(Debian 系) - 路径不能是临时文件系统(如
/tmp),否则重启后缓存丢失
配合超时与验证才能真正提升重用率
只调大缓存不够,必须协同关键参数并确认生效:
-
SSLSessionCacheTimeout 300是底线值;若业务连接周期短(如 API 网关平均 60 秒活跃),可设为60,避免缓存积压无效条目 - 用 OpenSSL 验证是否真复用:
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID"
看到连续输出中出现 Reused, TLSv1.3 才说明命中缓存 - 日志里加
SSLLogLevel info后搜索 reusing session,比浏览器 DevTools 更可靠
别踩这些高频坑
很多配置看似正确,实则根本没生效:
- 把
SSLSessionCache写进<virtualhost></virtualhost>会报错:Invalid command 'SSLSessionCache' —— 它只能出现在全局上下文(httpd.conf或ssl.conf的顶层) - 用
dbm后端替代shmcb:高并发下文件锁争用会导致握手延迟飙升,QPS 超 300 就明显劣化 - 忽略缓存路径权限:Apache 启动用户(如
www-data)对目录无写权限时,缓存静默失效,日志也不报错











