nginx在http块配置scgi_pass对接scgi标准应用程序

要在 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

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。