CGI - NGINX
y PHP
Unos chiquillos de ASIX2 están trabajando con Arduino en su proyecto y necesitan habilitar el uso de CGI shell script en un equipo que ejecuta Ubuntu Server, así que vamos a ayudarles. Tenemos que habilitar la característica CGI y permitir que se ejecute un CGI en el servidor Nginx.
Dado que nos interesa que esté configurado PHP y MySQL vamos a dar un repaso a toda la instalación y configuración de PHP con PHP-FPM para un servidor HTTP de Nginx 1.18. La parte de MySQL la dejamos para la siguiente ocasión.
Para realizar este tutorial estoy utilizando:
una VM con Ubuntu Server 22.04 que tiene instalado y configurado el servicio DNS y DHCP
está conectada en red NAT a otra VM que hace de cliente con un Debian.
Instalación de PHP
Procedemos a la instalación de los paquetes necesarios de PHP:
Los paquetes a instalar son extensiones de PHP 8.1 que proporcionan funcionalidades adicionales para desarrollar aplicaciones web en PHP. Por ejemplo:
php8.1-mbstring: Proporciona funciones para manejar cadenas que contienen caracteres no ASCII. Útil para trabajar con texto en diferentes idiomas.
php8.1-zip: Para trabajar con archivos y directorios comprimidos en formato ZIP.
php8.1-gd: Se trata de una biblioteca gráfica de manipulación de imágenes en PHP. Esta extensión permite a PHP crear y manipular imágenes de forma dinámica, como la creación de miniaturas, la composición de imágenes y la manipulación de formatos de imagen.
php8.1-json: Brinda funciones para trabajar con JSON en PHP. Permite codificar y decodificar datos en formato JSON. Realmente útil para el intercambio de datos entre aplicaciones web y servicios web, así como para el almacenamiento de datos estructurados.
php8.1-curl: Para realizar solicitudes HTTP y otras operaciones relacionadas con la transferencia de datos a través de URL utilizando la biblioteca libcurl.
php8.1-fpm: FastCGI Process Manager (FPM) es un gestor de procesos FastCGI para PHP que proporciona un entorno de ejecución de PHP más eficiente y escalable para servidores web. FPM gestiona múltiples instancias de intérpretes o procesos PHP que están listos para procesar solicitudes de forma rápida y eficiente. FPM suele ser utilizado con servidores web como Nginx o Apache utilizando el módulo de proxy FastCGI para redirigir las solicitudes PHP al pool de procesos de FPM.
php8.1-cgi: Se trata de una interfaz común que permite a los servidores web comunicarse con programas externos, incluidos los scripts PHP.
php8.1-cgi
es una implementación de PHP que funciona como un intérprete CGI. Cada vez que se recibe una solicitud PHP, el servidor web inicia un nuevo proceso php8.1-cgi para ejecutar el script PHP correspondiente. Aunque es fácil de configurar y usar, el rendimiento puede ser menor en comparación con FPM, ya que php8.1-cgi debe iniciarse y detenerse para cada solicitud.
Lo siguiente fue configurar NGINX para que pudiera servir páginas en PHP. Para ello tengamos en cuenta que en /var/www/punky.com es donde se hospedará nuestro sitio web.
Almacenaremos los logs del sitio en /var/log/nginx/error_punky.log
y /var/log/nginx/access_punky.log
.
SI revisamos alguna de las opciones de la configuración vemos que tenemos una carpeta llamada snippets en /etc/nginx/snippets/
que contiene dos archivos de configuración:
Y nos aseguramos ahora que todo funciones correctamente. Para ello he creado un archivo index.php
en /var/www/punky.com/
como se muestra en la imagen:
Si nos vamos al navegador del equipo cliente (Debian) y llamamos a nuestra página web se nos mostrará lo siguiente:
La parte del CGI
Llegamos a este punto me instalé el paquete fcgiwrap
que es un programa que se utiliza de interfaz entre los servidores web y las aplicaciones FastCGI. Digamos que permite a los servidores web la comunicación con aplicaciones externas de un modo más eficiente que la manera tradicional con CGI.
Al usar FastCGI, las aplicaciones se pueden mantener en ejecución, reduciendo el tiempo de carga con lo que se mejora el rendimiento general del servidor web.Por tanto, fcgiwrap
actúa como un puente entre el servidor web y las aplicaciones FastCGI. Gestiona las solicitudes entrantes, y se las pasa a la aplicación FastCGI correspondiente y devuelve las respuestas al servidor web.
Una vez instalado el paquete vamos a copiar el archivo /usr/share/doc/fcgiwrap/examples/nginx.conf en el directorio de configuración de nginx, o sea vamos a crear un archivo de configuración para la puerta de enlace CGI.
El directorio cgi-bin
Vamos a crear un directorio para almacenar nuestros archivos CGI.
Configurando nginx
Editamos el archivo de configuración /etc/nginx/sites-available/punky.conf para el sitio web predeterminado.
Y vamos a insertamos la siguiente línea al final del archivo:
Adaptando el archivo /etc/nginx/fcgiwrap.conf
Si vamos a almacenar nuestros archivos cgi dentro de un directorio en la carpeta de nuestro sitio, tenemos que modificar el fcgiwrap.conf para que autorice la ejecución de esos archivos. Para realizar esos cambios lo que tenemos que hacer es escribir nuestra "location" para que todo apunte al directorio cgi-bin
:
Creando un CGI de prueba
Ahora necesitamos crear un contenido de prueba. Para ello vamos a escribir un pequeño script en C que mostrará una página web estática. Escribimos:
Y escribimos nuestro pequeño script en C:
Ahora solo nos queda compilar el código para generar un archivo ejecutable:
Le damos permisos de ejecución al archivo creado:
Visualizando el cgi
Ahora nos vamos al navegador en el equipo cliente y escribimos la dirección IP del servidor web y le agregamos /cgi-bin/test.cgi
. Esto es:
Y se nos mostrará el contenido escrito en C.
Creando otro CGI de prueba
Esta vez vamos a crear un CGI de prueba pero con PHP. Vamos a editar un archivo llamado hello.cgi.
Y escribimos algo sencillo como lo siguiente:
Le damos permisos de ejecución al archivo creado en php:
Visualizando el CGI en PHP
Ahora nos vamos al navegador en el equipo cliente y escribimos la dirección IP del servidor web y le agregamos /cgi-bin/hello.cgi
. Esto es:
Y se nos mostrará el contenido escrito en PHP.
Links
Last updated
Was this helpful?