CGI#

该模块添加了对 CGI 的支持。

需要注意的是,CGI 不 适用于:

  • 高 QPS;

  • 大流量;

  • 高并发。

安装#

要 安装 该模块,请使用以下软件包之一:

  • Angie: angie-module-cgi

  • Angie PRO: angie-pro-module-cgi

加载模块#

在 main{} 上下文中加载模块:

load_module modules/ngx_http_cgi_module.so;

配置示例#

server {
    listen 80;

    root /usr/share/angie/html;
    index index.html index.htm;

    location /cgi {
        alias /usr/share/angie/cgi-bin;
        cgi on;
    }
}

location 块也可以对其处理的每个请求运行同一个脚本,而与请求的 URI 无关:

location /hook {
    cgi_set_var HOOK_CLIENT $remote_addr;
    cgi_set_var HOOK_HOST $host;
    cgi_pass /usr/share/angie/cgi-bin/hook.sh;
}

这里 cgi_pass 单独运行指定的脚本;此 location 中不需要 cgi on。 每条 cgi_set_var 指令向脚本的环境添加一个变量,其值可以由 Angie 变量构建。 直接写在 cgi_set_var 中的字面值到达脚本时会发生改变,因此请通过自己的变量传递这类值: 先 set $hook_mode test;,再 cgi_set_var HOOK_MODE $hook_mode;。 除标准 CGI 变量外,脚本不会从 Angie 工作进程的环境中获得任何内容:通过 env 指令设置的值不会传给它, 因此脚本从配置中所需的一切都通过 cgi_set_var 传递。 脚本的标准错误输出以 warn 级别写入 Angie 的 错误日志, 因此只有当日志级别为 warn 或更低时,这些消息才会出现。 脚本输出中的 Status: 头设置响应代码;没有该头时,响应代码为 200。 ACME 指南中的 CGI 和 octoDNS 示例 以同样的方式构建了一个 DNS-01 钩子, 放在 acme_hook 所要求的命名 location 块中,并将 ACME 变量传递给更新 DNS 记录的脚本。

测试脚本#

一个示例测试可执行脚本 test.sh:

#!/bin/sh
echo "Content-Type: text/plain" # Add header to the response
echo "" # Separator between headers and body of the response

# Environment variables
echo "query string: $QUERY_STRING"
echo "server addr: $SERVER_ADDR"
echo "server port: $SERVER_PORT"

# Request headers via environment variables
echo "http host: $HTTP_HOST"
echo "http accept: $HTTP_ACCEPT"
echo "http Some-Field: $HTTP_SOME_FIELD"

body=$(cat) # Reads the request body into a variable
echo "Request body: $body"

放置脚本#

根据配置,脚本必须放置在 /usr/share/angie/cgi-bin/ 目录中。 安装模块不会创建该目录,因此请先创建它:

$ sudo install -d /usr/share/angie/cgi-bin

该文件必须具有读取和执行权限。

请求执行示例#

$ curl  -H 'Some-Field:some text' -d '{"key1":"value1", "key2":"value2"}' -i \
  'http://127.0.0.1/cgi/hello.sh?a=valueA&b=valueB'

HTTP/1.1 200 OK
Server: Angie/1.12.4
Date: Fri, 16 Oct 2026 19:15:35 GMT
Transfer-Encoding: chunked
Connection: keep-alive
Content-Type: text/plain

query string: a=valueA&b=valueB
server addr: 127.0.0.1
server port: 80
http host: 127.0.0.1
http accept: */*
http Some-Field: some text
Request body: {"key1":"value1", "key2":"value2"}

其他信息#

版本: v0.15.2

详细文档和源代码可在以下位置获取: pjincz/nginx-cgi