关键是要用shmcb后端、按流量公式算缓存大小(如800新会话/秒×14400秒×512≈6MB)、设SSLSessionCacheTimeout 14400秒、开SSLSessionTickets并配48字节密钥,最后用openssl s_client验证Reused。

要真正提升 Apache 在高负载 HTTPS 场景下的握手复用率,关键不是堆参数,而是让缓存“能用、够用、稳用”。核心是选对后端、算准大小、配好超时,并验证是否真在复用。
必须用 shmcb 共享内存后端
dbm 会因文件锁拖慢高并发握手;memcache 增加网络和序列化开销;只有 shmcb 是 Apache 官方认证的生产级方案——它直接使用进程间共享内存,无磁盘、无网络、无锁竞争。
- 写法必须是:SSLSessionCache shmcb:/var/cache/apache2/ssl_scache(512000)
- 路径需提前创建并赋权:mkdir -p /var/cache/apache2 && chown www-data:www-data /var/cache/apache2
- 确保 mod_ssl 和 mod_socache_shmcb 已启用:httpd -M | grep -E "(ssl|socache)"
- 该指令只能放在全局配置(httpd.conf 或 ssl.conf)中,不能写在
里,否则报错
按真实流量算缓存大小,别拍脑袋
缓存太小,刚存进去就被挤掉;太大,浪费内存还可能影响 shm 分配。用这个公式估算:
审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他
缓存大小(字节)≈ 新建 TLS 会话数/秒 × 超时秒数 × 512
- 新建会话数/秒 ≠ QPS,要从日志统计 $ssl_session_reused 字段中值为 0 的行数
- 超时建议设为 14400 秒(4 小时),比默认 300 秒更利于复用
- 例如:峰值 800 次新握手/秒 → 800 × 14400 × 512 ≈ 5.9 MB → 直接配 (6291456) 或起步用 (10485760)(10MB)
必须搭配 SSLSessionCacheTimeout 和 SSLSessionTickets
只配缓存不设超时,条目永不老化;只开票据不配密钥,票据形同虚设。
- SSLSessionCacheTimeout 14400:与缓存大小匹配,保持生命周期一致
- SSLSessionTickets on:开启 RFC 5077 会话票据,客户端自带状态,对 IP 变更、负载均衡漂移更友好
- SSLSessionTicketKeyFile /etc/ssl/private/ticket.key:密钥必须是 48 字节二进制文件(openssl rand -out ticket.key 48),权限 600,多节点集群必须完全一致
验证是否真生效,别信“启动不报错”
配置加载成功 ≠ 握手真复用。必须实测:
- 用 OpenSSL 连续重连:openssl s_client -connect example.com:443 -reconnect -servername example.com 2>/dev/null | grep "Session-ID\|Reused",看到 Reused, TLSv1.3 才算成功
- 查 Apache 日志(需先设 SSLLogLevel info):搜索 reusing session 或 inserting session,确认有读写行为
- 压测时观察 CPU 使用率:完整握手时 openssl RSA 运算占 CPU 明显,复用后应大幅回落

















