apache https二次握手提效关键在于全局配置sslsessioncache为shmcb后端、设sslsessioncachetimeout为300秒,并通过openssl或日志验证reused会话。

要在 Apache 中真正提升 HTTPS 二次握手效率,关键不是“开了 SSLSessionCache”就行,而是配对、配稳、配准——它必须在全局生效、用对后端、设好老化时间,并验证复用成功。否则只是摆设。
必须放在全局配置里,不能写在 VirtualHost 中
SSLSessionCache 是 Apache 的全局 TLS 层缓存指令,只允许出现在主配置文件(如 httpd.conf 或 ssl.conf)的顶层作用域,绝不能嵌套在 <virtualhost></virtualhost> 块内。否则启动时会报错:
检查方式:运行 httpd -t 测试语法;再用 httpd -M | grep ssl 确认 mod_ssl 已加载,httpd -M | grep socache 确保 mod_socache_shmcb 可用(Apache 2.4.17+ 默认启用)。
推荐 shmcb 后端 + 合理路径与大小
直接使用共享内存(shmcb)是唯一生产就绪方案。其他后端有明显缺陷:
- dbm:基于文件锁,QPS 超过 300 后握手延迟可能翻倍
- memcache:引入网络跳转和序列化,把 1-RTT 握手拖成近 2-RTT
- shmcb:零磁盘 I/O、零网络、零序列化,官方明确标注为 production-ready
典型配置示例:
SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000)
注意三点:
- 路径目录需提前创建:
mkdir -p /var/cache/apache2,并授权给 Apache 进程用户(如chown www-data:www-data /var/cache/apache2) - 括号内数字单位是字节,512000 ≈ 500KB,中小流量站点够用;高并发可升至 1–2MB
- 路径必须真实存在且可写,否则日志中会出现
[warn] Init: Session Cache is not configured
必须搭配 SSLSessionCacheTimeout 使用
缓存条目不会自动过期。若不设超时,旧会话永久滞留,缓存迅速填满,新连接无法插入,反而导致复用率归零。
标准写法:
SSLSessionCacheTimeout 300
即 5 分钟老化,与主流客户端默认行为对齐。太短(如 60 秒)会让移动端频繁重握手;太长(如 3600)易引发缓存溢出或安全风险。
验证是否真正在复用,别只看启动不报错
仅靠 Apache 启动成功,不能说明缓存起效。要实测会话复用:
- 命令行验证:执行两次 OpenSSL 连接,观察 Session-ID 是否复用
openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID"
若输出中第二行含 Reused, TLSv1.3 或 Reused, TLSv1.2,说明服务端成功复用;若两次 Session-ID 完全不同,则未命中缓存。
-
日志验证:临时开启
SSLLogLevel info,查日志中是否有reusing session(命中)或inserting session(新建)关键词 -
状态页验证:启用
mod_status后访问/server-status?auto,应看到类似输出:
SSL/TLS Session Cache Status:<br>cache type: SHMCB, shared memory: 512000 bytes, current sessions: 12<br>total retrieves since starting: 87 hit, 13 miss
其中 hit 数值持续增长,才是真实复用。











