Cómo ejecutar scripts CGI en Nginx

Publicado 20 de enero de 2026

Problema: Ejecutar Scripts CGI en Nginx

Ejecutar scripts CGI en Nginx puede ser complicado debido al diseño de Nginx, que es diferente de otros servidores web. Nginx no admite CGI de forma predeterminada, por lo que necesitas configurar módulos y ajustes adicionales para ejecutar scripts CGI correctamente.

La Solución: Usar FastCGI con Nginx

Configurar FastCGI para Scripts Perl

Para ejecutar scripts CGI en Nginx, necesitas usar FastCGI. Este método es más eficiente que el CGI tradicional y funciona bien con la arquitectura de Nginx. Aquí te explicamos cómo configurarlo:

  1. Instalar paquetes: Instala el software necesario. En CentOS, usa este comando:

    sudo yum install nginx fcgi-perl spawn-fcgi
  2. Configurar Nginx para FastCGI: Edita tu archivo de configuración de Nginx (generalmente en /etc/nginx/nginx.conf) para incluir soporte FastCGI. Agrega estas líneas dentro del bloque server:

    location ~ \.pl$ {
       fastcgi_pass unix:/var/run/fcgiwrap.socket;
       include fastcgi_params;
    }
  3. Crear un script wrapper para tu CGI Perl: Crea un script wrapper para ejecutar tu script CGI Perl. Guárdalo como /usr/local/bin/perl-cgi-wrapper:

    #!/bin/sh
    exec /usr/bin/perl $1

    Establece los permisos correctos:

    sudo chmod +x /usr/local/bin/perl-cgi-wrapper

Siguiendo estos pasos, tendrás la configuración básica para ejecutar scripts CGI Perl en Nginx usando FastCGI. Este enfoque permite que Nginx maneje las solicitudes CGI de forma eficiente mientras mantiene sus beneficios de rendimiento.

Consejo: Optimizar el Rendimiento de FastCGI

Para mejorar el rendimiento de FastCGI, ajusta el número de procesos FastCGI según los recursos de tu servidor y el tráfico. Agrega la siguiente línea a tu configuración de Nginx:

fastcgi_keep_conn on;

Esto mantiene abierta la conexión entre Nginx y FastCGI, reduciendo la sobrecarga para múltiples solicitudes.

Configurar Nginx para FastCGI

Modificar el Archivo de Configuración de Nginx

Para configurar Nginx para FastCGI, necesitas modificar el archivo de configuración de Nginx. Este archivo normalmente está en /etc/nginx/nginx.conf. Aquí te explicamos cómo hacerlo:

  1. Agregar un bloque location para scripts CGI: Abre el archivo de configuración de Nginx y agrega este bloque en la sección server:

    location ~ \.cgi$ {
       fastcgi_pass unix:/var/run/fcgiwrap.socket;
       fastcgi_index index.cgi;
       include fastcgi_params;
    }

    Este bloque le indica a Nginx que procese todos los archivos que terminen con .cgi usando FastCGI.

  2. Configurar los parámetros FastCGI: En el mismo archivo, agrega o modifica la sección fastcgi_params:

    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param QUERY_STRING    $query_string;

    Estos parámetros pasan la información necesaria al proceso FastCGI.

  3. Configurar el socket FastCGI: Agrega esta línea a la sección http de tu configuración de Nginx:

    upstream fcgiwrap {
       server unix:/var/run/fcgiwrap.socket;
    }

    Esto define el socket que Nginx usará para comunicarse con el proceso FastCGI.

Después de hacer estos cambios, guarda el archivo y reinicia Nginx para aplicar la nueva configuración:

sudo systemctl restart nginx

Con estos cambios, Nginx ahora está configurado para trabajar con FastCGI para procesar scripts CGI.

Consejo: Verificar la Configuración de FastCGI

Después de configurar Nginx para FastCGI, es buena idea verificar que la configuración sea correcta. Puedes usar el siguiente comando para probar la configuración de Nginx y detectar errores de sintaxis:

sudo nginx -t

Si la configuración es correcta, verás un mensaje que dice "nginx: configuration file /etc/nginx/nginx.conf test is successful". Si hay algún error, el comando señalará los problemas específicos en tu archivo de configuración.

Ejecutar el Proceso FastCGI

Iniciar el Proceso FastCGI Manualmente

Para iniciar el proceso FastCGI manualmente, usa el comando spawn-fcgi:

  1. Ejecuta este comando:
sudo spawn-fcgi -u nginx -g nginx -s /var/run/fcgiwrap.socket -P /var/run/fcgiwrap.pid -F 1 -- /usr/sbin/fcgiwrap

Este comando inicia el proceso FastCGI con el usuario y grupo nginx, crea un archivo socket y establece la ruta al binario fcgiwrap.

  1. Verifica si el proceso está en ejecución:
ps aux | grep fcgiwrap

Deberías ver el proceso fcgiwrap en la salida.

Automatizar el Proceso FastCGI

Para iniciar el proceso FastCGI automáticamente cuando tu sistema arranque, crea un archivo de servicio y habilítalo.

  1. Crear un archivo de servicio:

Crea un nuevo archivo llamado fcgiwrap.service en el directorio /etc/systemd/system/:

sudo nano /etc/systemd/system/fcgiwrap.service
  1. Agrega este contenido al archivo:
[Unit]
Description=FastCGI wrapper
After=syslog.target network.target

[Service]
Type=forking
PIDFile=/var/run/fcgiwrap.pid
ExecStart=/usr/bin/spawn-fcgi -u nginx -g nginx -s /var/run/fcgiwrap.socket -P /var/run/fcgiwrap.pid -F 1 -- /usr/sbin/fcgiwrap
ExecStop=/bin/kill -QUIT $MAINPID

[Install]
WantedBy=multi-user.target
  1. Guarda el archivo y sal del editor.

  2. Recarga el daemon systemd para reconocer el nuevo servicio:

sudo systemctl daemon-reload
  1. Habilita el servicio para que inicie al arrancar:
sudo systemctl enable fcgiwrap
  1. Inicia el servicio:
sudo systemctl start fcgiwrap

Ahora, el proceso FastCGI se iniciará automáticamente cuando tu sistema arranque, y puedes administrarlo usando comandos systemctl como start, stop y restart.

Consejo: Monitorear el Proceso FastCGI

Para verificar el estado del proceso FastCGI, usa el comando systemctl status:

sudo systemctl status fcgiwrap

Esto mostrará si el proceso está activo, cuándo se inició y los mensajes de registro recientes. Es una buena manera de verificar si el proceso funciona correctamente o si hay problemas.

Probar tu Configuración CGI

Para verificar que tu configuración CGI funciona, puedes crear un script CGI de ejemplo y abrirlo en un navegador web. Aquí te explicamos cómo:

  1. Crear un script CGI de ejemplo:

Crea un nuevo archivo llamado test.cgi en el directorio CGI de tu servidor web (normalmente /usr/share/nginx/html/cgi-bin/):

sudo nano /usr/share/nginx/html/cgi-bin/test.cgi

Agrega este contenido al archivo:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>";
print "<h1>Script de Prueba CGI</h1>";
print "<p>¡Si puedes ver esto, tu configuración CGI está funcionando!</p>";
print "</body></html>";

Guarda el archivo y sal del editor.

  1. Establecer los permisos correctos:

Haz que el script sea ejecutable:

sudo chmod +x /usr/share/nginx/html/cgi-bin/test.cgi
  1. Abrir el script en un navegador web:

Usa un navegador web e ingresa la URL de tu servidor seguida de la ruta al script CGI. Por ejemplo:

http://tu_ip_servidor/cgi-bin/test.cgi

Si está configurado correctamente, deberías ver una página web con el mensaje "¡Si puedes ver esto, tu configuración CGI está funcionando!"

Si tienes problemas:

  • Revisa el registro de errores de Nginx para ver mensajes de error:

    sudo tail -f /var/log/nginx/error.log
  • Asegúrate de que el proceso FastCGI esté en ejecución:

    sudo systemctl status fcgiwrap
  • Verifica los permisos y la propiedad del archivo del script CGI.

Al ejecutar este script de prueba, puedes confirmar que tu servidor Nginx está configurado para manejar scripts CGI usando FastCGI.

Consejo: Depurar Scripts CGI

Si tu script CGI no funciona como se espera, puedes agregar información de depuración para ayudar a identificar el problema. Modifica tu script test.cgi para incluir variables de entorno:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>";
print "<h1>Script de Prueba CGI</h1>";
print "<p>¡Si puedes ver esto, tu configuración CGI está funcionando!</p>";
print "<h2>Variables de Entorno:</h2>";
print "<ul>";
foreach $key (sort keys %ENV) {
    print "<li><strong>$key:</strong> $ENV{$key}</li>";
}
print "</ul>";
print "</body></html>";

Este script mostrará todas las variables de entorno, lo que puede ayudarte a entender cómo se está ejecutando tu script CGI y qué información está disponible para él.