nginx 内置 scgi 支持,只需 location 配合 scgi_pass 即可接入后端;必须显式设置 scgi_param(如 scgi 1、request_method 等)、指定 scgi_pass 地址,并推荐关闭 scgi_buffering;include scgi_params 可复用标准参数,script_name "" 防路径误解析;需手动配置超时与重试,不建议启用 scgi_cache。

直接用 location 配合 scgi_pass 就能快速把后端 SCGI 应用接入 Nginx,不需要额外模块或编译选项——SCGI 支持是 Nginx 内置功能,只要配置对路径和协议参数即可生效。
基础配置结构:location + scgi_pass
SCGI 协议本身不带 HTTP 语义,所以 Nginx 不会像 proxy_pass 那样自动补全 Host 或 Transfer-Encoding。必须显式传递关键头信息:
-
必须设置
scgi_param:至少包含SCGI 1、REQUEST_METHOD、REQUEST_URI、CONTENT_LENGTH(若需接收请求体) -
必须指定
scgi_pass:指向你的 SCGI 后端地址,支持127.0.0.1:9001或unix:/tmp/myapp.sock -
推荐关闭
scgi_buffering:避免小响应被缓冲延迟,尤其对流式或实时接口更友好
一个可直接运行的最小示例
假设你的 Python/Go/Node SCGI 服务监听在 127.0.0.1:9001,只需在 server 块中加一段:
location /api/ {
scgi_pass 127.0.0.1:9001;
include scgi_params; # 自带标准参数集,位于 conf/scgi_params
scgi_param SCRIPT_NAME "";
scgi_buffering off;
}
说明:include scgi_params 已预设好 SCGI 1 和多数常用字段;SCRIPT_NAME "" 是为避免后端误解析路径前缀,适配大多数 SCGI 实现。
常见问题与绕过技巧
SCGI 没有原生超时/重试机制,Nginx 层需主动兜底:
-
连接超时:用
scgi_connect_timeout 5s防止后端挂死卡住 worker -
响应超时:用
scgi_read_timeout 30s控制长任务等待上限 -
失败重试:默认只重试“连接失败”,如需响应失败也重试,加
scgi_next_upstream error timeout http_500 -
路径透传注意:Nginx 默认把
/api/user传给后端为/user(去掉 location 前缀),若后端依赖完整路径,改用rewrite ^/api/(.*)$ /$1 break;+scgi_pass组合
是否需要缓存?谨慎对待
SCGI 协议本身不支持标准缓存头(如 ETag、Cache-Control),Nginx 的 scgi_cache 功能极弱且无实际维护——官方文档明确标注“仅作兼容保留”。
如需缓存,应由 SCGI 应用自身实现(如 Redis 缓存响应),Nginx 保持纯转发角色。强行启用 scgi_cache_path 不仅无效,还会引入额外磁盘 I/O 和锁竞争,降低吞吐。











