<!-- review: finished -->

<a id="external-cgi"></a>

# 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.

<a id="installation-6"></a>

## Instalación

Para [instalar](https://es.angie.software//angie/docs/installation/index.md#install-packages) el módulo, use uno de los
siguientes paquetes:

- Angie: `angie-module-cgi`
- Angie PRO: `angie-pro-module-cgi`

<a id="loading-the-module-5"></a>

## Carga del módulo

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

```nginx
load_module modules/ngx_http_cgi_module.so;
```

<a id="configuration-example-82"></a>

## Ejemplo de configuración

```nginx
server {
    listen 80;

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

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

<a id="test-script"></a>

## Script de prueba

Un ejemplo de script ejecutable de prueba `test.sh`:

```bash
#!/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 petición 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 petición en una variable
echo "Request body: $body"
```

<a id="placing-the-script"></a>

## Colocación del script

Según la configuración, el script debe colocarse en el directorio
`/usr/share/angie/cgi-bin/`.
El archivo debe tener permisos de lectura y ejecución.

<a id="example-of-request-execution"></a>

## Ejemplo de ejecución de petición

```console
$ 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/|angie_version|
Date: |sampledatelong| 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"}
```

<a id="additional-information-6"></a>

## Información adicional

La documentación detallada y el código fuente están disponibles en:
[https://github.com/pjincz/nginx-cgi](https://github.com/pjincz/nginx-cgi)
