mod_ssl本身非内存主因,但HTTPS启用后会显著增加每个子进程TLS开销;应优化SSLSessionCache(如shmcb+512KB+300秒超时)、禁用旧TLS版本与弱加密套件、设置MaxRequestsPerChild、启用OCSP Stapling,并确保私钥无密码、证书链合并规范。
mod_ssl 本身不是内存占用高的主因,但它会显著增加每个 apache 子进程的内存开销——尤其在启用 https 后,每个连接需维护 tls 会话状态、证书链验证、密钥交换等,若配置不当,容易放大内存压力。解决思路不是禁用 mod_ssl(除非你确实不需要 https),而是优化其使用方式和配套机制。
关闭冗余 SSL 会话缓存或改用高效模式
默认配置中,SSLSessionCache 若设为 shmcb 且缓存过大,或未设超时,会导致共享内存段长期驻留、无法释放;若设为 none,又会引发高频 TLS 握手,CPU 和内存双重升高。
- 推荐配置(平衡性能与内存):
SSLSessionCache shmcb:${APACHE_LOG_DIR}/ssl_scache(512000)SSLSessionCacheTimeout 300
缓存大小控制在 512KB 内,超时设为 300 秒(5 分钟),避免长期堆积。 - 若服务器内存极小(如 512MB VPS),可临时改用
dbm缓存(磁盘后端),但性能略降:SSLSessionCache dbm:${APACHE_LOG_DIR}/ssl_scache
禁用不必要 TLS 版本与加密套件
旧版 TLS(如 TLSv1.0/TLSv1.1)和弱加密套件(如 CBC 模式 + SHA1)不仅不安全,还会让 OpenSSL 分配更多上下文结构体,加重内存负担。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 在虚拟主机或全局 SSL 配置中明确限定:
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
(仅保留现代、AEAD 类型套件,减少协商开销与内存分配) - 添加
SSLHonorCipherOrder on强制服务端优先选择高效套件。
配合 MPM 模式与进程回收策略
mod_ssl 在 prefork 模式下影响最明显:每个子进程独占一份 SSL 上下文,若 MaxRequestsPerChild=0,进程长期存活,SSL 相关内存(如 session 缓存、OCSP 响应缓存)无法释放。
- 务必设置合理的
MaxRequestsPerChild(如 50–200),尤其在小内存环境; - 更彻底的方案:切换到
mpm_event(Ubuntu 默认已支持),它用单个主线程管理多个异步连接,SSL 握手由专用线程池处理,大幅降低 per-connection 内存 footprint; - 启用 OCSP Stapling 可减少客户端向 CA 查询证书状态的开销,间接缓解主线程压力:
SSLUseStapling onSSLStaplingCache shmcb:${APACHE_LOG_DIR}/ssl_stapling(128000)
检查私钥与证书加载方式
Apache 启动时会将私钥解密并常驻内存。若私钥受密码保护(passphrase),每次重启需人工输入;若用脚本自动解密但未清理临时文件,可能引发权限或泄漏风险;更隐蔽的是,某些自签名或非标准格式证书(如含多余 PEM 块)会让 OpenSSL 解析时分配异常缓冲区。
- 确保私钥无密码(
openssl rsa -in key.pem -out key_nopass.pem),避免运行时解密开销; - 合并证书链为单文件(server.crt + chain.crt),避免多次读取与解析;
- 用
openssl x509 -in your.crt -text -noout检查证书是否含异常扩展或过长字段。

















