如何配置 SSL Session Cache(会话缓存)来减少服务器的重复加密开销?
如何配置 SSL Session Cache(会话缓存)来减少服务器的重复加密开销?
在 TLS 握手过程中,服务器和客户端需要进行非对称加密运算来协商密钥。这个过程非常消耗 CPU 资源,尤其是当您的网站面临高并发访问时,频繁的完整握手会导致服务器性能急剧下降。SSL Session Cache(会话缓存)正是为了解决这一痛点而生的性能优化利器。
SSL Session Cache 的核心原理
当用户首次访问您的 HTTPS 网站并完成完整的 TLS 握手后,服务器会将这次协商好的会话参数(Session ID 和会话密钥)缓存起来。当该用户在短时间内再次访问或刷新页面时,客户端会携带这个 Session ID,服务器从缓存中命中后,双方即可跳过耗时的非对称加密协商阶段,直接利用缓存的会话密钥恢复连接。这种机制被称为“会话复用(Session Resumption)”,能将 TLS 握手的往返次数从 2 次减少到 1 次,大幅降低服务器 CPU 负载并提升页面响应速度。
在 Nginx 中配置会话缓存
Nginx 提供了两种缓存机制,强烈推荐使用性能更优的共享内存缓存。在 http 块中添加以下配置:
定义一个名为 SSL 的共享内存缓存,大小为 10MB,过期时间为 10 分钟
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
这里的 shared:SSL:10m 表示所有 Nginx Worker 进程共享这 10MB 的内存空间。1MB 的内存大约可以存储 4000 个会话,10MB 足以应对绝大多数中小型网站的并发需求。ssl_session_timeout 则限制了会话在缓存中的最长存活时间。
在 Apache 中配置会话缓存
Apache 的配置依赖于 mod_socache_shmcb 模块。在 SSL 配置文件(如 ssl.conf)中添加:
定义共享内存缓存路径及大小(102400 字节)
SSLSessionCache "shmcb:/var/cache/mod_ssl/scache(102400)"
设置会话超时时间为 15 分钟
SSLSessionCacheTimeout 900
同样,请确保 /var/cache/mod_ssl/ 目录存在,并且 Apache 进程对该目录具有读写权限。
验证缓存是否生效
配置完成并重载服务器后,您可以通过连续发起两次 TLS 握手来验证会话复用。使用 OpenSSL 命令:
第一次握手(完整握手)
openssl s_client -connect yourdomain.com:443 -reconnect -no_ticket
观察输出结果,第一次握手会显示 New, TLSv1.x, Cipher is ...,而第二次握手则会显示 Reused, TLSv1.x, Cipher is ...。看到 Reused 字样,即证明会话缓存配置成功。
注意事项:会话缓存大小应根据实际并发量合理分配,过小会导致缓存频繁淘汰,过大则会浪费服务器内存。此外,如果您的网站使用了负载均衡(如 Nginx 反向代理),需要确保请求被路由到同一台后端服务器,或者使用 Redis 等外部集中式缓存来共享会话,否则会话复用将无法生效。