要让proxy_cache稳定支撑1GB+大缓存,必须同步解除文件描述符限制:配置worker_rlimit_nofile 65535、fs.file-max=2000000、limits.conf及systemd LimitNOFILE,并优化proxy_cache_path层级与淘汰策略。

要让 proxy_cache 在 Linux 上稳定支撑大缓存(比如 1GB+),光配好 proxy_cache_path 不够,必须同步解除文件描述符(file descriptor)限制。Nginx 每个缓存文件、临时文件、日志句柄、连接套接字都会占用 fd,缓存目录层级深、文件数量多时极易触达系统默认上限(通常 1024),导致缓存写入失败、open() failed (24: Too many open files) 报错。
调整 Nginx 进程级文件描述符限制
在 nginx.conf 的主配置块(main context)中设置:
-
worker_rlimit_nofile 65535;—— 让每个 worker 进程最多打开 65535 个文件句柄 - 确保
events块中worker_connections值 ≤ 该限制(例如设为32768),留出余量给缓存文件、日志、临时文件等
放宽系统全局文件描述符上限
编辑 /etc/sysctl.conf,追加:
-
fs.file-max = 2000000—— 系统级最大可分配 fd 数 - 执行
sysctl -p生效
同时修改 /etc/security/limits.conf(对 nginx 启动用户生效):
nginx soft nofile 65535nginx hard nofile 65535- 若用 systemd 启动,还需在
/etc/systemd/system/nginx.service.d/override.conf中添加:[Service]LimitNOFILE=65535
优化 proxy_cache_path 减少文件句柄压力
大缓存不等于高 fd 开销,关键在目录结构和淘汰策略:
- 用
levels=1:2而非levels=1:2:2,控制子目录层级深度,避免单目录下文件过多(Linux ext4 单目录性能随文件数下降明显) -
keys_zone=STATIC:10m中的内存区仅存元数据,10MB 可管理约 8–10 万缓存项,足够支撑 GB 级缓存 -
inactive=24h配合max_size=1g实现 LRU 自动清理,避免手动清理触发大量 fd 扫描 - 禁用
proxy_cache_lock(除非强一致性要求),它会为每个 key 创建互斥锁文件,显著增加 fd 消耗
验证与监控关键指标
上线后检查是否真正生效:
- 运行
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确认软硬限制均为 65535+ - 用
lsof -p $(pgrep nginx) | wc -l查看当前 nginx 进程实际打开的 fd 数,持续高于 80% 需扩容 - 观察
nginx -t和错误日志中是否还有Too many open files或open() failed条目


















