结合国密算法的特点,合理配置 Apache 的 `SSLSessionCache`,能显著提升 HTTPS 性能。`SSLSessionCache` 的核心作用是让服务器在短时间内复用已建立的 SSL/TLS 会话状态,跳过完整握手流程,从而将握手耗时从 10-30 毫秒缩短至 1-3 毫秒。
简单来说,会话缓存配置的核心就是两行指令。
一、核心配置方法
以下两项配置能保证基础性能提升:
SSLSessionCache:指定共享内存(shmcb)作为缓存后端,这是在高并发场景下的唯一推荐方案,因为它能让 Apache 的所有工作进程共享同一块内存,避免了多进程间无法同步而导致的会话复用失败。
apache
# 示例:512KB缓存,适用于中小流量站点
SSLSessionCache "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout:设置会话缓存的过期时间,建议设置为 300 秒(5 分钟),这通常是最佳选择。
apache
SSLSessionCacheTimeout 300
二、性能优化最佳实践
要获得更高性能,可以参考下面的“黄金配置指南”。
优化项目 核心指令/步骤 配置示例与详解 主要作用
1. 缓存后端 强制使用 **shmcb (共享内存) `SSLSessionCache "shmcb:路径(大小)"`<br>共享内存读写无磁盘 I/O,延迟低,最适合高并发场景。路径需确保 Apache 进程(如 `www-data` 或 `apache` 用户)拥有写入权限。 性能基石<br>实现高效的多进程间会话共享。
2. 缓存大小 根据业务需求精确计算 使用公式 `峰值会话数 = 每秒新建连接数 × 超时时间(秒)` 计算所需缓存容量。如需支持较大容量,使用字节数设置(如 10MB 即 10485760 字节)。 精准资源规划<br>避免频繁淘汰或内存浪费,最大化复用率。
3. 会话票证 `SSLSessionTickets on` 现代 TLS 复用机制,对客户端更友好。可配合 `SSLSessionTicketKeyFile` 在多台 Apache 间共享 Ticket,实现集群下的会话复用。 现代化复用<br>简化服务端状态管理,是实现集群复用的关键。
4. 高级性能组合 结合其他优化项 (a) 开启 OCSP Stapling:`SSLUseStapling on`<br>`SSLStaplingCache shmcb:/var/run/ocsp-stapling-cache(128000)`<br>让服务器代客户端验证证书状态,减少客户端延迟。<br>(b) 启用 HTTP/2:`Protocols h2 http/1.1`<br>多路复用减少连接数,与会话缓效果叠加。 整体性能倍增<br>从多个环节降低 HTTPS 延迟。
三、验证与监控
检查配置是否生效、复用率是否提升至关重要:
使用 `server-status`:启用 `mod_status` 模块,访问 `https://your-server.com/server-status`,在输出中查找 `SSL/TLS Session Cache Status` 部分,观察 `hit`(命中)** 和 `miss`(未命中) 计数是否正常。
使用 OpenSSL 命令行测试:运行以下命令,检查第二个 "Session-ID" 行是否显示 `Reused, TLSv1.3`。注意,部分国密命令行工具可能使用不同的输出格式,请以工具官方文档为准。
bash
openssl s_client -connect yourdomain.com:443 -reconnect
使用 `curl` 验证:`curl -v https://yourdomain.com --session <(echo)` 等工具亦可观察握手细节。
启用详细日志:配置 `SSLLogLevel info`,在错误日志中搜索 "reusing session" 来追踪复用情况。
四、国密场景下的注意事项与 FAQ
在国密环境下配置会话缓存,有几点需要特别注意:
Apache 如何支持国密?
官方的 Apache 和 OpenSSL 并不直接支持国密算法。你需要安装第三方国密增强版,主要有两种方案:
使用国密模块:安装厂商(如 Wosign/GMSSL 等)提供的专用模块。
替换为 GMSSL:将 OpenSSL 替换为支持国密算法的 GMSSL 版本,并重新编译 Apache。
注意:具体实施请参考您选择的国密软件或模块官方文档。
五、国密算法性能如何?
在对称加密(如 SM4)和数据签名验签方面,国密算法相比国际算法(如 RSA)通常有30%-50%的性能优势。选择支持国密的硬件或云实例,也能进一步释放算力潜力。
SSLSessionCache 指令与国密模块兼容吗?
通常 是兼容的。这些配置位于 `mod_ssl` 层面,Apache 会调用底层加密库(无论是 OpenSSL 还是国密增强版)执行会话复用。不过,建议查阅所选国密模块的官方文档,确认其与 `SSLSessionCache` 的兼容性。
可以同时配置国密证书和国际证书吗?
理论上可以通过 SNI(Server Name Indication)技术同时配置国密和国际两套证书,但配置较复杂,需详细指导可进一步咨询。
SSLSessionCache 可以与外部缓存(如 Redis)集成吗?
不可以。`SSLSessionCache` 仅支持本地 `shmcb` 或 `dbm` 后端,无法直接与 Redis、Memcached 等外部存储联动。对于分布式环境下的会话复用,建议启用 `SSLSessionTickets` 并统一分发 `SSLSessionTicketKeyFile` 来间接实现。
为什么不建议使用 dbm 后端?
因为 `dbm` 后端基于磁盘文件,并发高时会因文件锁争用导致性能急剧下降。而 `shmcb` 基于内存,避免了磁盘 I/O 和文件锁问题,性能远超 `dbm`。
正确配置会话缓存是优化 Apache 国密 HTTPS 性能最直接有效的方法之一。通过推荐配置“黄金组合”并做好验证,你的服务器将能在合规的同时,展现出更优的性能。如果在配置过程中遇到问题,随时可以与我讨论。