fastcgi临时文件优化需从路径隔离、结构分层、写入直通和生命周期四方面入手:使用独立nvme挂载点、两级子目录、use_temp_path=off直写缓存、levels=1:2散列结构、open_file_cache元数据缓存及定时清理。

核心是让 FastCGI 临时文件不抢资源、不堆目录、不拖响应——得从路径隔离、结构分层、写入直通和生命周期四方面一起动。
为 fastcgi_temp_path 配独立高性能存储路径
别用默认的 /var/cache/nginx/fastcgi_temp,它常和系统日志、Nginx 主缓存共盘。高并发 PHP 响应落盘时,小文件密集写入会打满磁盘队列,连带影响 worker 调度。
- 准备一块空闲 NVMe 分区(如
/dev/nvme0n1p2),单独挂载:mount -o noatime,nobarrier /dev/nvme0n1p2 /data/nginx/fastcgi-temp - 在
http块中显式配置:fastcgi_temp_path /data/nginx/fastcgi-temp 1 2;
其中1 2表示两级子目录(最多 65536 个目录),避免单目录 inode 查找瓶颈 - 确保属主为 Nginx worker 用户(如
www-data):chown -R www-data:www-data /data/nginx/fastcgi-temp && chmod 700 /data/nginx/fastcgi-temp
配合 fastcgi_cache_path 实现“零中转”直写
默认情况下,FastCGI 响应先写进 fastcgi_temp_path,再重命名到 fastcgi_cache_path,这带来两次磁盘写 + rename 锁竞争,尤其跨挂载点时易失败返回 500。
- 在
fastcgi_cache_path行末尾加上use_temp_path=off:fastcgi_cache_path /data/nginx/fastcgi-cache levels=1:2 keys_zone=phpcache:256m max_size=10g inactive=30m use_temp_path=off; - 删掉单独的
fastcgi_temp_path配置(它已失效) - 注意:启用后需确保缓存盘有足够 inodes 和连续空间,否则 write() 失败直接 500
优化缓存目录结构与元数据驻留效率
单目录下超万文件会触发 ext4/xfs 的 inode 查找延迟;而元数据反复 stat 又加重 I/O 压力。
- 必须设
levels=1:2(或1:2:2),让缓存文件散列到类似a/ab/abcde.cache的多级路径,百万级仍低延迟 -
keys_zone只存 key、状态、过期时间等元数据,每万缓存项约需 1–1.5MB 内存;phpcache:256m可支撑约 15–20 万 URL,不宜过大或过小 - 搭配
open_file_cache缓存文件元信息:open_file_cache max=10000 inactive=60s; open_file_cache_valid 60s; open_file_cache_min_uses 2;
控制生命周期 + 定时兜底清理
Nginx 不自动清理失败响应残留的临时文件,也不监控磁盘水位——这些都得你补上。
-
inactive=30m表示 30 分钟内未被再次命中的缓存项会被淘汰,适合动态更新频繁的业务;max_size=10g是硬上限,防无限膨胀 - 加定时任务清理失效临时文件(每 10 分钟):
find /data/nginx/fastcgi-temp -type f -mmin +20 -delete - 监控该路径所在磁盘使用率,超过 85% 告警;同时用
iostat -x 1观察对应设备的%util和await,持续高于 70% 或 20ms 就要干预











