Instalación de FcgiWrap y habilitación de 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 scripting dinámico como Perl o Bash o Ruby a través de Fcgiwrap Gateway, y editar archivos de configuración de Nginx Virtual Hosts para servir contenido dinámico usando Secuencias de comandos .pl , .rb y .cgi .

  1. Pila LEMP instalada en Gentoo - https://www.tecmint.com/install-lemp-in-gentoo-linux/

Paso 1: Habilite FCGIWRAP en Gentoo LEMP

Fcgiwrap es parte de la Interfaz de puerta de enlace común Nginx FastCGI que procesa otros lenguajes de secuencias de comandos dinámicos, como las secuencias de comandos Perl o Bash o Ruby, funciona procesando las solicitudes recibidas de Nginx, a través de TCP o Unix Sockets, de manera independiente, devuelve el resultado producido a Nginx, que, a su vez, reenviará 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. Por defecto, el paquete Fcgiwrap no proporciona ningún script init en Gentoo para administrar el proceso. Después de que los paquetes se hayan compilado e instalado, cree los siguientes scripts init que le ayudarán a administrar el proceso Fcgiwrap usando tres enfoques: ya sea iniciando el proceso usando Sockets de dominio Unix o usando local < b> TCP Sockets o usando ambos al mismo tiempo.

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 script 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; aquí el valor predeterminado es 12345 ; cambie 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 afuera 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 otras razones, como configurar remotamente la puerta de enlace Fcgiwrap en un nodo diferente para el rendimiento o el equilibrio de carga.

3. Una vez creado el archivo, agregue los permisos de ejecución y administre el proceso del demonio utilizando interruptores de inicio, detención o estado. El interruptor de estado le mostrará información de socket relevante, como el par IP-PORT que escucha y si alguna conexión activa se inicializó. Además, si el proceso tiene conexiones activas en el 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

Como se presentó anteriormente, Fcgiwrap puede ejecutarse simultáneamente usando ambos sockets, por lo que cambiará 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. Una vez más, asegúrese de que este archivo sea ejecutable y utilice los mismos interruptores de servicio: iniciar , detener o estado . Establecí la ruta predeterminada para este socket en la ruta del sistema /run/fcgiwrap-unix.sock . Inicie el proceso y verifíquelo usando el interruptor status o lista el contenido del directorio /run y localice 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 solo Socket de dominio Unix , ya que utiliza comunicación entre procesos, que es más rápida que la comunicación a través de Conexiones de bucle de retorno TCP y utiliza menos gastos generales de TCP.

Paso 2: Habilite los scripts CGI en Nginx

5. Para que Nginx analice y ejecute scripts de 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 Sockets de dominio Unix , con un archivo index.pl y la tercera ubicación está usando 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 de argumento fastcgi_pass .

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

Edite localhost.conf para que se vea como en la plantilla a continuación.

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. Una vez que termine de editar Nginx localhost.conf , o su archivo de configuración de Virtual Host específico, muévase a la ruta raíz del documento predeterminada de su sitio web, cree esas dos carpetas para reflejar su declaración de ubicación y cree archivos de índice para cada lugar 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 la 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 se estén ejecutando.

# 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 siguientes capturas de pantalla.

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: activar la compatibilidad con Ruby en Fcgiwrap

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

# emerge --ask ruby

10. Una vez compilado e instalado el paquete, vaya a Nginx sitios disponibles y edite el archivo localhost.conf agregando las siguientes declaraciones antes del último corchete " } ”, que activa el soporte para ejecutar scripts Ruby en una cuarta ubicación bajo la ruta raíz predeterminada del documento 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 la extensión .rb y agregue lo 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/cuarto/, 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 graves riesgos de seguridad en su servidor porque se ejecutan usando shells activos debajo de su sistema, pero pueden expandir la barrera estática impuesta por HTML estático, agregando funcionalidad dinámica a su sitio web.