Apache SSL CPU飙升本质是高并发下TLS握手与加密解密集中耗CPU,需禁用旧协议(SSLv2/v3、TLSv1.0/1.1)和弱套件,启用TLSv1.3、ECDHE-AES-GCM/ChaCha20套件、SSLSessionCache、OCSP Stapling、HTTP/2及AES-NI硬件加速,并调优系统文件描述符与内核参数。

检查并禁用低效 SSL/TLS 协议与弱密码套件
旧协议(SSLv2/v3、TLSv1.0/1.1)和弱算法(RC4、3DES、MD5、NULL)不仅不安全,还会强制使用软件模拟加密,极大拖慢 CPU。必须显式关闭:
- 在虚拟主机或全局 SSL 配置中添加:
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1 - 设置高性能密码套件,优先 ECDHE + AES-GCM 或 ChaCha20:
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 - 强制服务器选择顺序:
SSLHonorCipherOrder on
启用并调优 SSL 会话复用机制
每次完整 TLS 握手需数次非对称运算(如 RSA 解密或 EC 签名),CPU 开销大。启用会话缓存(Session Cache)或会话票证(Session Tickets)可跳过大部分计算。
- 配置共享内存缓存(推荐 shmcb),大小按并发估算:
SSLSessionCache "shmcb:/var/run/apache2/ssl_scache(1048576):32"(1MB + 显式 32 子缓存) - 设合理超时(通常 300 秒足够):
SSLSessionCacheTimeout 300 - 启用会话票证(客户端兼容性好,尤其移动端):
SSLSessionTickets on
开启 OCSP Stapling 并验证有效性
默认情况下,客户端需自行向 CA 查询证书吊销状态,引发额外 DNS、HTTP 请求及 TLS 连接,既拖慢首屏又增加服务端连接压力。OCSP Stapling 让 Apache 主动获取并缓存响应,一次查询服务多个客户端。
- 启用 stapling:
SSLUseStapling on - 配置独立缓存(避免与 session cache 冲突):
SSLStaplingCache "shmcb:/var/run/apache2/stapling_cache(131072)"(128KB 足够) - 确保证书链完整(含中间 CA),否则 stapling 会失败,Apache 会退回到客户端直连模式,CPU 反而更高
确认硬件加速已生效并启用 HTTP/2
现代 CPU(Intel/AMD)普遍支持 AES-NI 指令集,但 Apache 默认不一定启用。若未触发硬件加速,所有 AES 加解密都走软件实现,CPU 利用率会成倍上升。
- 检查是否加载 mod_ssl 且 OpenSSL 版本 ≥ 1.0.2(推荐 1.1.1+ 或 3.x):
openssl version -a 和 httpd -M | grep ssl - 无需额外配置模块,只要 OpenSSL 编译时启用了 AES-NI(主流发行版默认开启),Apache 就自动受益
- 启用 HTTP/2 进一步降低连接建立频次:
Protocols h2 http/1.1(要求 mod_http2 已启用)
补充关键系统与运行时优化
CPU 飙升有时不是 Apache 配置本身的问题,而是底层支撑不足或资源限制导致的连锁反应。
- 增大文件描述符限制(避免连接排队、重试激增):
在 /etc/security/limits.conf 中添加:
apache soft nofile 65536
apache hard nofile 65536 - 调整内核网络参数(提升连接吞吐):
net.core.somaxconn = 65535
net.ipv4.tcp_tw_reuse = 1 - 禁用不必要的 Apache 模块(如 mod_php 若用 PHP-FPM,则卸载 mod_php;禁用 mod_info、mod_status 等调试模块)


















