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-utilsA continuación, descargamos el paquete src.rpm de Thttpd para Fedora 18:
cd /usr/src
yumdownloader --source thttpdls -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.rpmPuedes 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.specAgrega 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.specNuestro 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.rpmLuego 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.serviceA 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.serviceDebido 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 |Hola mundo
\n";
chmod 755 /var/www/cgi-bin/hello_world.cgiAbre un navegador y prueba el script:
http://www.example.com/cgi-bin/hello_world.cgiSi todo va bien, deberías obtener la siguiente salida:

Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.