Nginx 中如何提升静态资源在内存中的缓存命中率

夜瑶酱_6722

夜瑶酱_6722

2026-07-14

732人浏览

原创

提升静态资源内存缓存命中率的核心是通过open_file_cache减少元数据系统调用、sendfile触发内核page cache复用,配合tcp_nopush等参数实现零拷贝传输,避免directio等破坏cache的行为。

nginx 中如何提升静态资源在内存中的缓存命中率

提升静态资源在内存中的缓存命中率,核心不是“把文件塞进内存”,而是让 Nginx 更高效地复用已加载的文件元数据与内容,减少重复磁盘 I/O 和系统调用。Nginx 本身不直接将响应体缓存在内存(proxy_cache 默认落盘),但可通过三层协同机制显著提升“内存级访问效率”:open_file_cache(文件句柄与元数据)、sendfile/tcp_nopush(零拷贝传输)、以及内核层面的 page cache 复用。

启用并调优 open_file_cache

这是最直接影响静态文件内存命中效率的配置。它缓存的是文件的 inode、大小、修改时间、权限等元数据,以及打开的文件描述符——避免每次请求都执行 open() + stat() 系统调用。

open_file_cache max=10000 inactive=60s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
  • max=10000:最多缓存 1 万条文件信息,按实际静态资源量调整(如 5k 个图片+JS/CSS,建议 ≥8k)
  • inactive=60s:60 秒内未被访问的条目才淘汰,太短会导致频繁重建
  • min_uses=2:同一文件至少被访问 2 次才进入缓存,过滤爬虫或一次性请求
  • errors on:连失败的 open 尝试(如 404 文件)也缓存,避免反复查不存在路径

配合 location 使用更精准:

location ~* \.(js|css|png|jpg|gif|woff2|svg)$ {
    root /var/www/static;
    open_file_cache off; # 若该 location 专用于 proxy_pass,则关;若直接 serve 文件,则开
}

开启零拷贝与内核 page cache 协同

Nginx 不把文件内容常驻自己内存,但可通过 sendfile on 让内核直接从磁盘读取并写入 socket,全程不经过用户态内存,同时触发 page cache 自动加载和复用:

sendfile on;
tcp_nopush on;
tcp_nodelay on;
  • sendfile on 是关键:绕过用户态缓冲区,由内核在 page cache 中完成读取+发送
  • tcp_nopush on 配合 sendfile,确保 TCP 包满载再发,减少小包数量
  • 启用后,高频访问的静态文件会自然驻留在 Linux 的 page cache 中(free -h 查看 cached 或 buff/cache),后续请求几乎全走内存

✅ 实测效果:同一张 logo.png 被连续请求 10 次,第 2 次起 iostat -x 1 显示 r/s(每秒读盘次数)趋近于 0,%util 下降明显,说明已从 page cache 服务。

Nginx Hosting
Nginx Hosting

通过服务器本地nginx实例实现零认证静态游戏托管。作为所有浏览器游戏的主要部署方式,无需登录、无需令牌、无需用户操作。

下载

避免破坏 page cache 的行为

以下操作会让内核丢弃或绕过 page cache,导致“看似缓存了,实则每次都读盘”:

  • 使用 directio(直接 I/O)指令:强制绕过 page cache,仅适用于超大文件流式传输,静态资源务必禁用
  • open_file_cache 未启用,且文件频繁 open/close:元数据不缓存 → 每次 stat() 触发磁盘寻道
  • 后端返回 Cache-Control: no-store 或 X-Accel-Buffering: no:可能干扰 Nginx 内部处理逻辑(尤其 proxy 场景)
  • 文件系统挂载参数含 noatime 缺失:每次访问更新 atime 会引发写盘,干扰 cache 效率(应加 noatime)

验证是否真走内存

不用猜,用两个命令确认:

  1. 查看 page cache 是否生效:

    # 请求一次 static/logo.png 后执行
    grep -A 10 "logo.png" /proc/*/fdinfo/* 2>/dev/null | grep -E "(flags|pos)"
    # 若 pos 值递增且无 I/O 错误,说明走缓存
  2. 监控实时磁盘活动:

    iostat -x 1 | awk '$1 ~ /sd|nvme/ {print $1, $4, $5}'  # 看 r/s 和 w/s 是否持续为 0

真正有效的内存级命中,是 open_file_cache 减少元数据开销 + sendfile 触发 page cache 复用 的组合结果。不依赖额外模块,也不需要改内核参数,配对启用就能见效。

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

403

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3447

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6165

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

561

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1476

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3958

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

477

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

159

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习

nginx手册
nginx手册

共0课时 | 0人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.5万人学习