page cache 能加速 nginx 启动/重载时读取证书文件、ca bundle 及 ocsp 响应文件等磁盘 i/o,但不加速 tls 握手中的签名验证、证书有效性检查或会话复用等用户态操作。

Page Cache 是内核级文件数据缓存,它不直接处理“证书”本身,也不缓存 TLS/SSL 证书内容(如 PEM 文件中的公钥、私钥或 CA 链)。所谓“二级证书缓存”并非 Linux 或 Nginx 的标准术语——实际场景中,用户常指:对 HTTPS 握手所需证书文件(如 ssl_certificate 和 ssl_certificate_key)的重复读取优化,或更常见的是:对已建立 HTTPS 连接后,由 Nginx 缓存的下游响应(含证书验证结果)进行加速。但严格来说,证书本身不被 Page Cache “智能缓存”用于 TLS 协商;真正能被 Page Cache 显著加速的,是 Nginx 启动/重载时读取证书文件的过程,以及证书相关静态资源(如 OCSP 响应、CA bundle)的访问。
明确:Page Cache 能加速什么,不能加速什么
✅ 可被 Page Cache 加速:
- Nginx 主进程在
nginx -t或systemctl reload nginx时,反复读取fullchain.pem、privkey.pem等证书文件(这些是普通磁盘文件,会被自动载入 Page Cache) - 若使用
ssl_trusted_certificate指向大型 CA bundle(如ca-bundle.crt),其加载也受益于 Page Cache - OCSP 响应缓存文件(如通过
ssl_stapling_file指定的本地响应文件)被频繁 stat/read,同样命中 Page Cache
❌ 不受 Page Cache 影响:
- TLS 握手过程中的证书签名验证、密钥交换等 CPU 密集型运算
- 证书内容是否有效、是否过期、是否被吊销——这些由 OpenSSL 在用户态完成,与内核缓存无关
- Session resumption(会话复用)依赖的 TLS session cache(内存或共享内存),由 Nginx 自己管理,和 Page Cache 无直接关系
让证书文件稳定驻留 Page Cache 的关键操作
证书文件体积小(通常几 KB 到几百 KB),但访问频次高(尤其在 reload 或高频 SNI 切换时)。默认情况下它们极易被 LRU 回收。要提升“命中率与驻留性”,需从内核和文件系统两层入手:
-
避免不必要的 reload:每次 reload 都触发证书文件重读。改用
nginx -s reload而非完整 stop/start;结合certbot --deploy-hook实现平滑证书热更新(仅重载配置,不中断连接) -
预热 Page Cache:在 Nginx 启动后立即读取关键证书文件一次(如
cat /etc/letsencrypt/live/example.com/fullchain.pem > /dev/null),强制其进入缓存;可写入 systemd service 的ExecStartPost -
禁用 atime 更新:在挂载证书目录所在分区时添加
noatime(如/etc/fstab中:/dev/sda1 /etc/letsencrypt ext4 defaults,noatime 0 2),减少元数据写入干扰,间接提升缓存稳定性 -
确保文件不被 swap:证书文件路径不应位于 tmpfs 或被 cgroup 内存限制过严的环境中;检查
vm.swappiness是否设为 0(生产推荐)
Nginx 层配合:减少证书路径访问压力
即使 Page Cache 高效,Nginx 仍可能因配置不当造成冗余读取。以下配置可降低对证书文件 I/O 的依赖频率:
-
合并证书链:使用
fullchain.pem(域名证书 + 中间 CA)而非单独指定ssl_certificate和ssl_trusted_certificate,减少 open() 系统调用次数 -
启用 OCSP stapling 并持久化响应:配置
ssl_stapling on和ssl_stapling_file /var/cache/nginx/ocsp-resp.der,并将该文件定期更新(如 cron 每小时 fetch 一次)。这样每次握手只需读一个固定小文件,极易被 Page Cache 长期保留 - 避免动态证书加载模块(如 ngx_http_ssl_module 的非标准变种):标准 Nginx 在配置加载阶段一次性读取证书并缓存在内存中,后续握手不再访问磁盘——这才是真正的“零磁盘证书 I/O”。确保你用的是主线版 Nginx,且未启用会反复读磁盘的第三方证书插件
验证是否生效的实用命令
不用猜,用工具看真实行为:
- 查证书文件是否在缓存中:
grep -i "fullchain\.pem" /proc/meminfo不行——正确方式是:cat /proc/fs/ext4/*/stats 2>/dev/null | grep -i read(粗略看读计数),或更准:pcstat /etc/letsencrypt/live/example.com/fullchain.pem(需安装pcstat工具) - 监控 Page Cache 压力:
watch -n1 'grep -E "^(Cached|SReclaimable|PageTables)" /proc/meminfo',观察Cached是否稳定包含证书相关页 - 抓取系统调用确认无重复 open:
strace -p $(pgrep nginx) -e trace=openat,read -f 2>&1 | grep -i pem(在 reload 后短时间内运行)











