CGI Scripts · 5 min read · Jan 23, 2026

Sirviendo Scripts CGI Con Nginx En Fedora 18

Sirviendo Scripts CGI Con Nginx En Fedora 18

Versión 1.0
Autor: Falko Timme
Sígueme en Twitter

Este tutorial muestra cómo puedes servir scripts CGI (scripts Perl) con nginx en Fedora 18. Aunque nginx en sí no sirve CGI, hay varias formas de solucionar esto. Esbozaré dos soluciones: la primera es hacer proxy de las solicitudes para scripts CGI a Thttpd, un pequeño servidor web que tiene soporte para CGI, mientras que la segunda solución utiliza un envoltorio CGI para servir scripts CGI.

¡No emito ninguna garantía de que esto funcione para ti!

1 Nota Preliminar

Estoy usando el sitio web www.example.com aquí con la raíz del documento /var/www/www.example.com/web/; la configuración del vhost se encuentra en /etc/nginx/conf.d/www.example.com.vhost.

2 Usando Thttpd

En este capítulo voy a describir cómo configurar nginx para hacer proxy de las solicitudes para scripts CGI (extensiones .cgi o .pl) a Thttpd. Configuraré Thttpd para que se ejecute en el puerto 8000.

Primero instalamos Thttpd. Hay un paquete de Thttpd para Fedora 18, pero la página de ThttpdCGI de nginx dice que Thttpd debe ser parcheado; por lo tanto, descargamos el paquete src.rpm para Fedora 18, lo parcheamos y construimos un nuevo paquete rpm a partir de él.

Necesitamos instalar las herramientas que se requieren para construir un nuevo paquete rpm:

yum groupinstall 'Development Tools'

Instalar yum-utils (el paquete contiene la herramienta yumdownloader que nos permite descargar un src.rpm):

yum install yum-utils

A continuación, descargamos el paquete src.rpm de Thttpd para Fedora 18:

cd /usr/src  
yumdownloader --source thttpd
ls -l
[root@server1 src]# ls -l  
total 164  
drwxr-xr-x. 2 root root   4096 Feb  3  2012 debug  
drwxr-xr-x. 3 root root   4096 Jun  4 18:21 kernels  
-rw-r--r--  1 root root 155690 Mar 28 03:21 thttpd-2.25b-28.fc18.src.rpm  
[root@server1 src]#
rpm -ivh thttpd-2.25b-28.fc18.src.rpm

Puedes ignorar las siguientes advertencias:

[root@server1 src]# rpm -ivh thttpd-2.25b-28.fc18.src.rpm  
   1:thttpd             warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
warning: user mockbuild does not exist - using root  
warning: group mockbuild does not exist - using root  
########################################### [100%]  
[root@server1 src]#

Ahora descargamos el parche en el directorio /root/rpmbuild/SOURCES/ y modificamos el archivo /root/rpmbuild/SPECS/thttpd.spec en consecuencia:

cd /root/rpmbuild/SOURCES/  
wget -O thttpd-2.25b-ipreal.patch http://www.danielclemente.com/amarok/ip_real.txt  
cd /root/rpmbuild/SPECS/  
vi thttpd.spec

Agrega las líneas Patch3: thttpd-2.25b-ipreal.patch y %patch3 -p1 -b .ipreal:

| [...] Patch0: thttpd-2.25b-CVE-2005-3124.patch Patch1: thttpd-2.25b-fixes.patch Patch2: thttpd-2.25b-getline.patch Patch3: thttpd-2.25b-ipreal.patch [...] %prep %setup -q %patch0 -p1 -b .CVE-2005-3124 %patch1 -p1 -b .fixes %patch2 -p1 -b .getline %patch3 -p1 -b .ipreal [...] |

Ahora construimos nuestro paquete rpm de Thttpd de la siguiente manera:

rpmbuild -ba thttpd.spec

Nuestro paquete rpm de Thttpd se crea en /root/rpmbuild/RPMS/x86_64 (/root/rpmbuild/RPMS/i386 si estás en un sistema i386), así que vamos allí:

cd /root/rpmbuild/RPMS/x86_64  
ls -l
[root@server1 x86_64]# ls -l  
total 224  
-rw-r--r-- 1 root root  69881 Sep  3 23:17 thttpd-2.25b-28.fc18.x86_64.rpm  
-rw-r--r-- 1 root root 151685 Sep  3 23:17 thttpd-debuginfo-2.25b-28.fc18.x86_64.rpm  
[root@server1 x86_64]#

Instala el paquete Thttpd de la siguiente manera:

rpm -ivh thttpd-2.25b-28.fc18.x86_64.rpm

Luego hacemos una copia de seguridad del archivo original /etc/thttpd.conf y creamos uno nuevo de la siguiente manera:

mv /etc/thttpd.conf /etc/thttpd.conf_orig  
vi /etc/thttpd.conf

| # CUIDADO : ¡No se permiten líneas vacías! # Esta sección anula los valores predeterminados # Esta sección _documenta_ los valores predeterminados en efecto # port=80 # nosymlink # default = !chroot # novhost # nocgipat # nothrottles # host=0.0.0.0 # charset=iso-8859-1 host=127.0.0.1 port=8000 user=thttpd logfile=/var/log/thttpd.log pidfile=/var/run/thttpd.pid dir=/var/www cgipat=.cgi|.pl |

Esto hará que Thttpd escuche en el puerto 8000 en 127.0.0.1; su raíz del documento es /var/www.

Crea los enlaces de inicio del sistema para Thttpd…

systemctl enable thttpd.service

… y arráncalo:

systemctl start thttpd.service

A continuación, crea /etc/nginx/proxy.conf:

vi /etc/nginx/proxy.conf

| proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 90; proxy_send_timeout 90; proxy_read_timeout 90; |

Ahora abre tu archivo de configuración del vhost…

vi /etc/nginx/conf.d/www.example.com.vhost

… y agrega una sección location /cgi-bin {} al contenedor server {}:

| server { [...] location /cgi-bin { include proxy.conf; proxy_pass http://127.0.0.1:8000; } [...] } |

Recarga nginx:

systemctl reload nginx.service

Debido a que la raíz del documento de Thttpd es /var/www, la ubicación /cgi-bin se traduce en el directorio /var/www/cgi-bin (esto es cierto para todos tus vhosts, lo que significa que cada vhost debe colocar sus scripts CGI en /var/www/cgi-bin; este es un inconveniente para entornos de alojamiento compartido; la solución es usar un envoltorio CGI como se describe en el capítulo 3 en lugar de Thttpd).

Crea el directorio…

mkdir /var/www/cgi-bin

… y luego coloca tus scripts CGI en él y hazlos ejecutables. Para fines de prueba, crearé un pequeño script Perl Hello World (en lugar de hello_world.cgi también puedes usar la extensión .pl -> hello_world.pl):

vi /var/www/cgi-bin/hello_world.cgi

| #!/usr/bin/perl -w # Indica a perl que envíe un encabezado html. # Así tu navegador recibe la salida # en lugar de (línea de comandos # en el servidor.) print "Content-type: text/html\n\n"; # imprime tus etiquetas html básicas. # y el contenido de ellas. print "¡Hola Mundo!! \n"; print "

Hola mundo

\n"; |

chmod 755 /var/www/cgi-bin/hello_world.cgi

Abre un navegador y prueba el script:

http://www.example.com/cgi-bin/hello_world.cgi

Si todo va bien, deberías obtener la siguiente salida:

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.