需在 location 块中配置 scgi_pass 指向后端地址,显式设置 scgi_param SCGI 1 并禁用 CGI 风格头注入,手动定义必要参数,调优超时与缓冲,并验证后端可达性及权限。

要在 Nginx 的 http 块中通过 scgi_pass 对接符合 SCGI 协议的应用程序,核心是正确声明 SCGI 后端地址,并关闭默认的 CGI 兼容头转发行为(因为 SCGI 不使用 CGI 环境变量方式传递元数据)。
启用 scgi_pass 并指定后端地址
scgi_pass 必须写在 location 块内,不能直接放在 http 块顶层。它用于将请求以 SCGI 协议转发给上游服务,支持 unix: 套接字路径或 ip:port 地址:
-
scgi_pass 127.0.0.1:9001;—— 转发到本地 TCP 端口 -
scgi_pass unix:/var/run/myapp.scgi.sock;—— 转发到 Unix 域套接字
必须禁用 CGI 模式头转发(关键!)
SCGI 协议要求请求头以 SCGI 字符串开头,并将所有环境变量序列化为 key:value 格式拼接在请求体前,不依赖 HTTP 头传递元数据。因此需显式关闭 Nginx 默认的 CGI 风格头注入:
- 设置
scgi_param SCGI 1;—— 这是 SCGI 协议握手必需字段 - 清空或覆盖默认的
scgi_params文件中可能注入的CONTENT_LENGTH、PATH_INFO等 CGI 变量(除非你的应用明确需要) - 推荐做法:不引入
include scgi_params;,而是手动定义真正需要的参数,例如:
scgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; scgi_param QUERY_STRING $query_string; scgi_param REQUEST_METHOD $request_method; scgi_param CONTENT_TYPE $content_type; scgi_param CONTENT_LENGTH $content_length; scgi_param SCGI 1;
配置必要的 SCGI 代理缓冲与超时
SCGI 应用通常不像 FastCGI 那样健壮,建议调优连接行为以防挂起或截断:
-
scgi_read_timeout 60;—— 等待上游响应的最长时间 -
scgi_send_timeout 60;—— 向上游发送完整请求的超时 -
scgi_buffering on;—— 开启缓冲,避免流式响应异常(多数 SCGI 实现不支持 chunked) -
scgi_buffers 8 16k;和scgi_busy_buffers_size 32k;—— 适配常见响应体大小
验证 SCGI 服务可达性
Nginx 不会主动探测 SCGI 后端是否就绪。上线前请确认:
- SCGI 应用已启动并监听指定地址(可用
telnet 127.0.0.1 9001或nc -U /path/to.sock测试连通) - 若用 Unix 套接字,确保 Nginx worker 进程有读写权限(注意用户组和 socket 文件权限)
- 检查 Nginx 错误日志(
error_log)中是否出现no live upstreams或Connection refused

















