nginx 不支持 scgi_cache_path 指令,因其原生不提供 scgi 协议缓存机制;正确做法是改用 http 协议配合 proxy_cache,或由 scgi 网关自身实现缓存。

scgi_cache_path 并非 Nginx 官方支持的缓存指令 —— Nginx 没有 scgi_cache_path 这个配置项。你可能是将 proxy_cache_path(用于 HTTP 反向代理)、fastcgi_cache_path(用于 FastCGI)或 uwsgi_cache_path(用于 uWSGI)混淆为 scgi_cache_path。
Nginx 原生不支持 SCGI 协议的缓存机制。SCGI 是一种类似 FastCGI 的简单网关协议,但 Nginx 对 SCGI 的支持仅限于 scgi_pass 转发请求,*不提供 `scgicache系列指令(包括scgi_cache_path、scgi_cache、scgi_cache_key` 等)**。官方文档与源码中均无此类配置。
因此:
- 你无法通过配置
scgi_cache_path来优化 SCGI 后端的磁盘缓存分布; - 所有围绕“SCGI 缓存路径分层”“levels 参数调优”“scgi_cache_key 均衡性”等设想,在 Nginx 中不具备实现基础。
✅ 正确路径:用 proxy_cache 替代 SCGI 缓存需求
若你的“简单通用网关脚本”实际是通过 SCGI 暴露服务(如 Python/Go 编写的轻量网关),而你真正需要的是对这些网关响应做高性能磁盘缓存,推荐以下落地方案:
1. 改用 HTTP 协议暴露网关 + proxy_cache
让网关监听 HTTP(如 127.0.0.1:8080),Nginx 以 proxy_pass 方式接入,并启用完整 proxy_cache 生态:
proxy_cache_path /var/cache/nginx/scgi_gateway
levels=1:2
keys_zone=scgi_cache:256m
max_size=20g
inactive=1h
use_temp_path=off;
server {
location /api/ {
proxy_pass http://127.0.0.1:8080;
proxy_cache scgi_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504;
}
}
✅ 优势:可完整使用
levels=1:2分层、keys_zone内存索引、inactive清理、use_temp_path=off直写等全部成熟优化手段。
2. 若必须走 SCGI 协议,则缓存需下沉到网关侧
即:由你的 SCGI 网关脚本自身实现响应缓存(如 Redis/MemoryCache/LRU 文件缓存),Nginx 仅作纯转发。此时磁盘快照分布、并发读性能完全取决于网关实现,与 Nginx 无关。
常见做法:
- 网关对
$request_uri或签名后 key 做 MD5,生成两级目录路径(如cache/a/b/xxx.bin); - 使用
O_DIRECT+mmap提升小文件读取效率; - 配合
noatime挂载、XFSlogbsize=256k等文件系统调优。
3. 验证是否真需 SCGI?多数场景可替换
SCGI 在现代部署中已基本被 HTTP/1.1、HTTP/2 或 gRPC 取代。除非遗留系统强制要求,否则建议:
- 将网关改造成标准 HTTP 服务;
- 利用 Nginx 的
proxy_cache+proxy_cache_lock防穿透 +proxy_cache_use_stale容错,效果远超 SCGI 自建缓存。
⚠️ 注意:别被误导的配置尝试
以下写法不会生效且可能引发静默错误(Nginx 启动时忽略或报 unknown directive):
# ❌ 错误:Nginx 不识别该指令 scgi_cache_path /tmp/scgi_cache levels=1:2 keys_zone=my_scgi:10m; # ❌ 错误:无对应指令,配置被丢弃 scgi_cache my_scgi; scgi_cache_key $request_uri;
可通过 nginx -t 验证:若出现 unknown directive "scgi_cache_path",即确认不支持。
不复杂但容易忽略:Nginx 的缓存能力严格按协议划分,协议不支持,功能就不存在。与其纠结不存在的 scgi_cache_path,不如把协议栈拉齐到 HTTP,释放全部缓存优化能力。











