Búsqueda de sitios web

Instalación de FcgiWrap y habilitación de los lenguajes dinámicos Perl, Ruby y Bash en Gentoo LEMP


Este tutorial está estrictamente relacionado con el anterior sobre la instalación de LEMP en Gentoo y trata otros problemas extendidos del servidor, como habilitar lenguajes de secuencias de comandos dinámicos como Perl, Bash o Ruby a través de Fcgiwrap Gateway y editar archivos de configuración de hosts virtuales Nginx para sirva contenido dinámico utilizando scripts .pl, .rb y .cgi.

Requisitos

  1. Pila LEMP instalada en Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Paso 1: Habilite FCGIWRAP en Gentoo LEMP

Fcgiwrap es parte de Nginx FastCGI Common Gateway Interface que procesa otros lenguajes de secuencias de comandos dinámicos, como secuencias de comandos Perl, Bash o Ruby, funciona procesando solicitudes recibidas de Nginx, a través de TCP o Unix Sockets, de forma independiente y devuelve el resultado producido a Nginx, que, a la larga, enviará las respuestas a los clientes finales.

1. Primero comencemos instalando el proceso FCcgiwrap en Gentoo Linux usando el siguiente comando.

emerge --ask www-misc/fcgiwrap

2. De forma predeterminada, el paquete Fcgiwrap no proporciona ningún script init en Gentoo para administrar el proceso. Después de que los paquetes hayan sido compilados e instalados, cree los siguientes scripts init que le ayudarán a administrar el proceso Fcgiwrap usando tres enfoques: ya sea iniciando el proceso usando Unix Domain Sockets o usando < b>Sockets TCP o usando ambos al mismo tiempo.

Usando el script de socket TCP

Cree un archivo de inicio en la ruta /etc/init.d/ con el siguiente contenido de archivo.

nano /etc/init.d/fcgiwrap

Agregue el siguiente contenido de archivo.

#!/sbin/runscript

ip="0.0.0.0"
port="12345"

start() {
ebegin "Starting fcgiwrap process..."
       /usr/sbin/fcgiwrap -s tcp:$ip:$port &
        tcp_sock=`netstat -tulpn | grep fcgiwrap`
        echo "Socket details: $tcp_sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap process..."
                pid=`ps a | grep fcgiwrap | grep tcp | cut -d" " -f1`
kill -s 1 $pid
                tcp_sock=`netstat -tulpn | grep fcgiwrap`
                 if test $tcp_sock =  2> /dev/null ; then
                 echo "Fcgiwrap process successfully stoped"
                tcp_sock=`netstat -atulpn | grep $port`
                if test $tcp_sock =  2> /dev/null ; then
                echo "No open fcgiwrap connection found..."
                else
                echo "Wait to close fcgiwrap open connections...please verify with 'status'"
                echo -e "Socket details: \n$tcp_sock"
                 fi
                else
                echo "Fcgiwarp process is still running!"
        echo "Socket details: $tcp_sock"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap process..."
      tcp_sock=`netstat -atulpn | grep $port`
    if test $tcp_sock =  2> /dev/null ; then
                       echo "Fcgiwrap process not running"
                     else
                echo "Fcgiwarp process is running!"
                 echo -e "Socket details: \n$tcp_sock"
                fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

Como puede ver, el archivo de secuencia de comandos contiene dos variables al principio, respectivamente ip y puerto. Cambie estas variables según sus propias necesidades y asegúrese de que no se superpongan con otros servicios de su sistema, especialmente la variable de puerto (el valor predeterminado aquí es 12345); cámbielo en consecuencia.

El uso de 0.0.0.0 en la variable IP permite que el proceso se vincule y escuche en cualquier IP (accesible desde fuera si no tiene un firewall), pero por razones de seguridad debe cambiarlo para escuchar solo localmente. en 127.0.0.1, a menos que tenga otros motivos, como configurar remotamente la puerta de enlace Fcgiwrap en un nodo diferente para mejorar el rendimiento o el equilibrio de carga.

3. Después de crear el archivo, agregue permisos de ejecución y administre el proceso del demonio mediante interruptores de inicio, detención o estado. El interruptor de estado le mostrará información relevante del socket, como el par IP-PORT que escucha y si se inicializó alguna conexión activa. Además, si el proceso tiene conexiones activas en estado TIME_WAIT, no puede reiniciarlo hasta que se cierren todas las conexiones TCP.

chmod +x /etc/init.d/fcgiwrap
service start fcgiwrap
/etc/init.d/fcgiwrap status

Usando el script de socket Unix

Como se presentó anteriormente, Fcgiwrap puede ejecutarse simultáneamente usando ambos sockets, por lo que cambiaremos ligeramente el nombre del segundo script a fcgiwrap-unix-socket, para garantizar que ambos puedan iniciarse y ejecutarse al mismo tiempo.

nano /etc/init.d/fcgiwrap-unix-socket

Utilice el siguiente contenido de archivo para el socket UNIX.

#!/sbin/runscript
sock_detail=`ps a | grep fcgiwrap-unix | head -1`

start() {
ebegin "Starting fcgiwrap-unix-socket process..."
        /usr/sbin/fcgiwrap -s unix:/run/fcgiwrap-unix.sock &
        sleep 2
        /bin/chown nginx:nginx /run/fcgiwrap-unix.sock
        sleep 1
        sock=`ls -al /run/fcgiwrap-unix.sock`
        echo "Socket details: $sock"
eend $? "Errors were encountered while starting fcgiwrap process"
}

stop() {
ebegin "Stopping fcgiwrap-unix-socket process..."
                pid=`ps a | grep fcgiwrap | grep unix | cut -d" " -f1`
                rm -f /run/fcgiwrap-unix.sock                 
                kill -s 1 $pid
                echo "Fcgiwrap process successfully stoped"
                #killall /usr/sbin/fcgiwrap
        sleep 1
        echo "Socket details: $sock"
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

status() {
ebegin "Status fcgiwrap-unix-socket process..."
  if test -S /run/fcgiwrap-unix.sock; then
       echo "Process is started with socket: $sock_detail"
        else
        echo "Fcgiwrap process not running!"
        fi
eend $? "Errors were encountered while stopping fcgiwrap process..."
}

4. Asegúrese nuevamente de que este archivo sea ejecutable y utilice los mismos parámetros de servicio: inicio, detener o estado. He configurado la ruta predeterminada para este socket en la ruta del sistema /run/fcgiwrap-unix.sock. Inicie el proceso y verifíquelo usando el modificador status o enumere el contenido del directorio /run y ubique el socket, o use ps -a | comando grep fcgiwrap.

chmod +x /etc/init.d/fcgiwrap-unix-socket
service start fcgiwrap-unix-socket
/etc/init.d/fcgiwrap-unix-socket status
ps -a | grep fcgiwrap

Como se mencionó anteriormente, Fcgiwrap puede ejecutarse con sockets TCP y UNIX simultáneamente, pero si no necesita conexiones de puerta de enlace externas, utilice Unix Domain Socket únicamente, porque utiliza comunicación entre procesos, que es más rápida que la comunicación a través de Conexiones de bucle invertido TCP y utiliza menos sobrecarga de TCP.

Paso 2: habilite los scripts CGI en Nginx

5. Para que Nginx analice y ejecute scripts Perl o Bash a través de la interfaz Fast Common Gateway, los hosts virtuales deben configurarse con definiciones Fcgiwrap en la ruta raíz o en las instrucciones de ubicación.

A continuación se presenta un ejemplo (localhost), que activa los scripts Perl y CGI en todos los archivos ubicados en la ruta raíz (/var/www/localhost/htdocs/) con .pl y la extensión .cgi usando Fcgiwrap TCP Sockets para la ruta predeterminada del documento raíz, la segunda ubicación usando Unix Domain Sockets, con un archivo index.pl y la tercera ubicación utiliza sockets TCP con un archivo index.cgi.

Coloque el siguiente contenido, o solo algunas partes del mismo, en el archivo de configuración de host virtual que desee para activar scripts dinámicos de Perl o Bash con sockets UNIX o TCP en diferentes ubicaciones, modificando la declaración del argumento fastcgi_pass.

nano /etc/nginx/sites-available/localhost.conf

Edite localhost.conf para que se vea como en la plantilla siguiente.

server {
                                listen 80;
                                server_name localhost;

access_log /var/log/nginx/localhost_access_log main;
error_log /var/log/nginx/localhost_error_log info;

               root /var/www/localhost/htdocs/;
                location / {
                autoindex on;
                index index.html index.htm index.php;
                                }

## PHP –FPM Gateway ###
                            location ~ \.php$ {
                            try_files $uri =404;
                            include /etc/nginx/fastcgi.conf;
                            fastcgi_pass 127.0.0.1:9001;
				}

## Fcgiwrap Gateway on all files under root with TCP Sockets###
location ~ \.(pl|cgi|rb)$ {
                fastcgi_index index.cgi index.pl;
                include /etc/nginx/fastcgi.conf;
fastcgi_pass 127.0.0.1:12345;    
                                }                                                                                                                             

## Fcgiwrap Gateway on all files under root second folder with index.pl using UNIX Sockets###
location /second {
                                index index.pl; 
root /var/www/localhost/htdocs/;
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass unix:/run/fcgiwrap-unix.sock;      
                                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                                             }                                                                                                            
                                                }

## Fcgiwrap Gateway on all files under root third folder with index.cgi using TCP Sockets###
location /third {
                                index index.cgi;               
                                location ~ \.(pl|cgi|rb)$ {
                                include /etc/nginx/fastcgi.conf;
                                 fastcgi_pass 127.0.0.1:12345;       
                                }                                                                                             
  }

6. Después de terminar de editar Nginx localhost.conf, o su archivo de configuración de host virtual específico, vaya a la ruta raíz del documento predeterminado de su sitio web y cree esas dos carpetas para reflejar su ubicación. declaración y crear archivos de índice para cada ubicación con su extensión específica.

cd /var/www/localhost/htdocs
mkdir second third

Cree el archivo index.pl en la segunda ubicación con el siguiente contenido.

nano /var/www/localhost/htdocs/second/index.pl

Agregue este contenido para obtener variables de entorno.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<HTML;
                <html>
                <head><title>Perl Index</title></head>
                <body>
                                <div align=center><h1>A Perl CGI index on second location with env variables</h1></div>
                </body>
HTML
print "Content-type: text/html\n\n"; foreach my $keys (sort keys %ENV) { print "$keys =
$ENV{$keys}<br/>\n";
}
exit;

Luego cree el archivo index.cgi en una tercera ubicación con el siguiente contenido.

nano /var/www/localhost/htdocs/third/index.cgi

Agregue este contenido para obtener variables de entorno.

#!/bin/bash
echo Content-type: text/html
echo ""
cat << EOF
<HTML>
<HEAD><TITLE>Bash script</TITLE></HEAD>
<BODY><PRE>
<div align=center><h1>A BASH CGI index on third location with env variables</h1></div>
EOF
env
cat << EOF
</BODY>
</HTML>
EOF

7. Cuando termine de editar, haga que ambos archivos sean ejecutables, reinicie el servidor Nginx y asegúrese de que ambos sockets Fcgiwrap estén ejecutándose.

chmod +x /var/www/localhost/htdocs/second/index.pl
chmod +x /var/www/localhost/htdocs/third/index.cgi
service nginx restart
service fcgiwrap start
service fcgiwrap-unix-socket start

A continuación, redirija su navegador local a la siguiente URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

El resultado debería aparecer como en las capturas de pantalla siguientes.

8. Si todo está en su lugar y configurado correctamente, habilite ambos demonios Fcgiwrap para que se inicien automáticamente, después de reiniciar emitiendo los siguientes comandos (en caso de que haya configurado Nginx para usar ambos sockets CGI).

rc-update add fcgiwrap default
rc-update add fcgiwrap-unix-socket default

Paso 3: active el soporte de Ruby en Fcgiwrap

9. Si necesita ejecutar scripts dinámicos de Ruby en Nginx FCGI, debe instalar el intérprete Ruby en Gentoo con el siguiente comando.

emerge --ask ruby

10. Después de compilar e instalar el paquete, vaya a Nginx sites-available y edite el archivo localhost.conf agregando las siguientes instrucciones antes última llave “ } ”, que activa el soporte para ejecutar scripts Ruby en una cuarta ubicación en la ruta raíz del documento predeterminada proporcionada por Nginx localhost.

nano /etc/nginx/sites-available/localhost.conf

Utilice las siguientes directivas de Nginx.

## Fcgiwrap Gateway on all files under root fourth folder with index.rb under TCP Sockets###
                location /fourth {
                                index index.rb;
                                location ~ \.rb$ {
                                include /etc/nginx/fastcgi.conf;
                                fastcgi_pass 127.0.0.1:12345;       
                                                }                                                                                                             
                               }             
## Last curly bracket which closes Nginx server definitions ##
}

11. Ahora, para probar la configuración, cree el cuarto directorio en la ruta /var/www/localhost/htdocs, cree un script de índice Ruby ejecutable con .rb extensión y agregue el siguiente contenido.

mkdir /var/www/localhost/htdocs/fourth
nano /var/www/localhost/htdocs/fourth/index.rb

Ejemplo de Ruby index.rb.

#!/usr/bin/ruby
puts "HTTP/1.0 200 OK"
puts "Content-type: text/html\n\n"
puts "<html><HEAD><TITLE>Ruby script</TITLE></HEAD>"
puts "<BODY><PRE>"
puts "<div align=center><h1>A Ruby CGI index on fourth location with env variables</h1></div>"
system('env')

12. Después de agregar permisos de ejecución en el archivo, reinicie el demonio Nginx para aplicar las configuraciones.

chmod +x /var/www/localhost/htdocs/fourth/index.rb
service nginx restart

Abra su navegador y navegue hasta la URL http://localhost/fourth/, que debería presentarle el siguiente contenido.

Eso es todo por ahora, ha configurado Nginx para servir scripts dinámicos de Perl, Ruby y Bash en FastCGI Gateway, pero tenga en cuenta que ejecutar este tipo de scripts interpretados en Nginx CGI Gateway puede ser peligroso e imponer serios riesgos de seguridad en su servidor porque se ejecuta utilizando shells activos en su sistema, pero puede expandir la barrera estática impuesta por HTML estático, agregando funcionalidad dinámica a su sitio web.