优化 nginx 磁盘 io 的核心在于减少不必要的文件读写并提升缓存命中率,具体做法是启用 proxy_cache 配合合理的 cache_key,利用 open_file_cache 缓存文件描述符和元数据,并通过 proxy_cache_valid 设置合适的过期时间。这样可以将动态请求转化为静态文件读取,显著降低后端压力与磁盘 iops。

Nginx 如何配置代理缓存以减少后端请求
通过配置 proxy_cache_path 定义缓存目录及参数,并在 location 块中启用 proxy_cache,Nginx 会拦截匹配的请求,若命中则直接返回缓存内容,否则向后端获取并存储。合理设置 max_size 可防止磁盘占满,而 inactive 参数控制非活跃缓存的清理周期。

http {
# 定义缓存路径、级别、最大容量和空闲清理时间
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_server;
# 启用缓存并使用 keys_zone
proxy_cache my_cache;
# 设置缓存键,通常包含 URI 和查询参数
proxy_cache_key $scheme$request_method$host$request_uri;
# 设置不同状态码的缓存时间
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
# 添加头部标识缓存命中情况
add_header X-Cache-Status $upstream_cache_status;
}
}
}
上述配置中,levels=1:2 表示使用两级目录结构存储缓存文件,有助于避免单目录下文件过多导致的文件系统性能下降。keys_zone=my_cache:10m 在共享内存中存储缓存键和元数据,提高查找速度。max_size=1g 限制缓存总大小,当超出时 Nginx 会根据 LRU 算法移除旧缓存。inactive=60m 表示如果缓存项在 60 分钟内未被访问,则会被删除。通过 X-Cache-Status 头部可以观察缓存命中状态(HIT/MISS),便于调优。
open_file_cache 如何优化文件描述符开销
启用 open_file_cache 可以让 Nginx 缓存打开的文件描述符、目录结构和统计信息,避免每次请求都进行系统调用 stat() 和 open()。这对于高并发场景下频繁访问相同静态资源或缓存文件的场景尤为有效,能大幅降低 CPU 和磁盘 IO 开销。

server {
listen 80;
server_name example.com;
# 全局或 server 级别启用 open_file_cache
open_file_cache max=1000 inactive=20s;
# 可选:验证缓存中的文件是否仍然有效
open_file_cache_valid 30s;
# 可选:在无效期间最少访问次数才保留缓存
open_file_cache_min_uses 2;
# 可选:禁用日志文件描述的缓存(通常不需要)
open_file_cache_errors on;
location /static/ {
root /var/www/html;
}
}
open_file_cache 的参数包括 max(缓存的最大文件描述符数量)、inactive(未访问多久后从缓存中移除)。open_file_cache_valid 指定检查缓存条目有效性的频率。open_file_cache_min_uses 定义在 inactive 时间段内,文件至少被访问多少次才会被保留在缓存中。这些设置共同作用,确保只有真正常用的文件才占用内存和文件描述符资源,从而优化整体 IO 性能。
缓存命中率高时磁盘 IO 的具体表现
当缓存命中率较高时,Nginx 主要执行的是对本地缓存文件的读取操作,而非向后端发起网络请求。此时磁盘 IO 表现为顺序读或小随机读,IOPS 需求大幅降低,响应时间稳定且较短。通过监控 X-Cache-Status 为 HIT 的比例,可以评估当前配置是否有效减少了后端负载和磁盘写入压力。



















