CGI#

El módulo añade soporte para CGI.

Es importante tener en cuenta que CGI no es adecuado para:

  • QPS altos;

  • tráfico intenso;

  • alta concurrencia.

Instalación#

Para instalar el módulo, use uno de los siguientes paquetes:

  • Angie: angie-module-cgi

  • Angie PRO: angie-pro-module-cgi

Carga del módulo#

Para cargar el módulo en el contexto de main{}:

load_module modules/ngx_http_cgi_module.so;

Ejemplo de configuración#

server {
    listen 80;

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

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

Un bloque location también puede ejecutar el mismo script para cada solicitud que maneja, independientemente del URI de la solicitud:

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

Aquí cgi_pass ejecuta por sí solo el script indicado; cgi on no es necesario en este location. Cada directiva cgi_set_var añade una variable al entorno del script, con un valor que puede construirse a partir de variables de Angie. Un valor literal escrito directamente en cgi_set_var no llega al script sin cambios, así que pase ese valor a través de una variable propia: set $hook_mode test; y luego cgi_set_var HOOK_MODE $hook_mode;. Aparte de las variables CGI estándar, el script no recibe nada del entorno de los procesos de trabajo de Angie: los valores establecidos con la directiva env no le llegan, por lo que todo lo que necesita de la configuración se le pasa mediante cgi_set_var. La salida de error estándar del script va al registro de errores de Angie con el nivel warn, de modo que estos mensajes aparecen solo cuando el nivel de registro es warn o menos severo. Una cabecera Status: en la salida del script establece el código de respuesta; sin esa cabecera, el código de respuesta es 200. El Ejemplo con CGI y octoDNS de la guía de ACME construye un hook DNS-01 de la misma manera, en el bloque location con nombre que acme_hook requiere, pasando las variables ACME al script que actualiza el registro DNS.

Script de prueba#

Un ejemplo de script ejecutable de prueba test.sh:

#!/bin/sh
echo "Content-Type: text/plain" # Añadir cabecera a la respuesta
echo "" # Separador entre cabeceras y cuerpo de la respuesta

# Variables de entorno
echo "query string: $QUERY_STRING"
echo "server addr: $SERVER_ADDR"
echo "server port: $SERVER_PORT"

# Cabeceras de solicitud vía variables de entorno
echo "http host: $HTTP_HOST"
echo "http accept: $HTTP_ACCEPT"
echo "http Some-Field: $HTTP_SOME_FIELD"

body=$(cat) # Lee el cuerpo de la solicitud en una variable
echo "Request body: $body"

Colocación del script#

Según la configuración, el script debe colocarse en el directorio /usr/share/angie/cgi-bin/. La instalación del módulo no crea este directorio, así que créelo primero:

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

El archivo debe tener permisos de lectura y ejecución.

Ejemplo de ejecución de solicitud#

$ 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"}

Información adicional#

Versión: v0.15.2

La documentación detallada y el código fuente están disponibles en: pjincz/nginx-cgi