Instal·lació de FcgiWrap i activació dels llenguatges dinàmics Perl, Ruby i Bash a Gentoo LEMP


Aquest tutorial està estrictament relacionat amb l'anterior sobre la instal·lació de LEMP a Gentoo i tracta altres problemes estesos del servidor, com ara l'habilitació de llenguatges de script dinàmic com Perl o Bash o Ruby mitjançant Fcgiwrap Gateway, i editar fitxers de configuració de Nginx Virtual Hosts per oferir contingut dinàmic mitjançant Scripts .pl, .rb i .cgi.

  1. Pila LEMP instal·lada a Gentoo: https://linux-console.net/install-lemp-in-gentoo-linux/

Pas 1: habiliteu FCGIWRAP a Gentoo LEMP

Fcgiwrap és una part de la Interfície de passarel·la comuna Nginx FastCGI que processa altres llenguatges de script dinàmic, com ara scripts Perl o Bash o Ruby, que funciona processant les sol·licituds rebudes de Nginx, mitjançant TCP o Sockets Unix, de manera independent i retorna el resultat produït a Nginx, que, a termini, reenviarà les respostes als clients finals.

1. Comencem primer instal·lant el procés FCcgiwrap a Gentoo Linux mitjançant l'ordre següent.

# emerge --ask www-misc/fcgiwrap

2. Per defecte, el paquet Fcgiwrap no proporciona cap script init a Gentoo per gestionar el procés. Un cop compilats i instal·lats els paquets, creeu els següents scripts init que us ajudin a gestionar el procés Fcgiwrap mitjançant tres enfocaments: o bé llançant el procés mitjançant Sockets de domini Unix o fent servir < locals. b>Sockets TCP o utilitzant tots dos alhora.

Creeu un fitxer d'inici a la ruta /etc/init.d/ amb el contingut del fitxer següent.

# nano /etc/init.d/fcgiwrap

Afegiu el contingut del fitxer següent.

#!/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..."
}

Com podeu veure, el fitxer d'script conté dues variables al principi, respectivament ip i port. Canvieu aquestes variables segons les vostres necessitats i assegureu-vos que no es superposen amb altres serveis del vostre sistema, especialment la variable del port (per defecte aquí és 12345), canvieu en conseqüència.

L'ús de 0.0.0.0 a la variable IP permet que el procés s'uneixi i escolti a qualsevol IP (s'hi pot accedir fora si no teniu un tallafoc), però per raons de seguretat hauríeu de canviar-lo per escoltar-lo només localment, a 127.0.0.1, tret que tingueu altres motius com ara configurar de manera remota la passarel·la Fcgiwrap en un node diferent per al rendiment o l'equilibri de càrrega.

3. Un cop creat el fitxer, afegiu els permisos d'execució i gestioneu el procés del dimoni mitjançant interruptors d'inici, aturada o d'estat. L'interruptor d'estat us mostrarà la informació rellevant del sòcol, com ara IP-PORT, el parell escolta i si hi ha una connexió activa s'ha inicialitzat. A més, si el procés té connexions actives a l'estat TIME_WAIT, no podeu reiniciar-lo fins que es tanquin totes les connexions TCP.

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

Com s'ha presentat anteriorment, Fcgiwrap es pot executar simultàniament utilitzant ambdós sockets, de manera que canviarà lleugerament el nom del segon script a fcgiwrap-unix-socket, per assegurar-se que tots dos es poden iniciar i executar al mateix temps.

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

Utilitzeu el contingut del fitxer següent per al sòcol 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. Assegureu-vos de nou que aquest fitxer sigui executable i utilitzeu els mateixos interruptors de servei: inici, aturar o estat. He establert el camí predeterminat per a aquest sòcol al camí del sistema /run/fcgiwrap-unix.sock. Inicieu el procés i verifiqueu-lo mitjançant l'interruptor estat o l'enumereu el contingut del directori /run i localitzeu el sòcol o utilitzeu ps -a | comanda 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

Com s'ha esmentat anteriorment, Fcgiwrap es pot executar amb sòcols TCP i UNIX simultàniament, però si no necessiteu connexions de passarel·la externes, només cal que us adheriu a Socket de domini Unix, perquè utilitza la comunicació entre processos, que és més ràpida que la comunicació a través. Connexions de loopback TCP i utilitza menys sobrecàrrega TCP.

Pas 2: habiliteu els scripts CGI a Nginx

5. Perquè Nginx analitzi i executi scripts Perl o Bash a través de la Fast Common Gateway Interface, els hosts virtuals s'han de configurar amb definicions Fcgiwrap a les declaracions de ruta o ubicació arrel.

A continuació es presenta un exemple (localhost), que activa els scripts Perl i CGI a tots els fitxers col·locats a la ruta arrel (/var/www/localhost/htdocs/) amb .pl i l'extensió .cgi utilitzant Fcgiwrap TCP Sockets per a la ruta predeterminada del document arrel, la segona ubicació utilitzant Sockets de domini Unix, amb un fitxer index.pl i la tercera ubicació utilitza sockets TCP amb un fitxer index.cgi.

Col·loqueu el contingut següent, o només algunes parts, al fitxer de configuració de l'amfitrió virtual que vulgueu per activar scripts dinàmics Perl o Bash amb sòcols UNIX o TCP en diferents ubicacions, modificant la declaració d'argument fastcgi_pass.

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

Editeu localhost.conf perquè sembli a la plantilla següent.

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. Quan hàgiu acabat d'editar Nginx localhost.conf, o el vostre fitxer de configuració de Virtual Host específic, aneu a la ruta d'arrel del document predeterminada del vostre lloc web, creeu aquestes dues carpetes per reflectir la vostra declaració d'ubicació i creeu fitxers d'índex per a cada lloc amb la seva extensió específica.

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

Creeu el fitxer index.pl a la segona ubicació amb el contingut següent.

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

Afegiu aquest contingut per obtenir variables d'entorn.

#!/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;

A continuació, creeu el fitxer index.cgi a la tercera ubicació amb el contingut següent.

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

Afegiu aquest contingut per obtenir variables d'entorn.

#!/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. Quan acabeu d'editar, feu que els dos fitxers siguin executables, reinicieu el servidor Nginx i assegureu-vos que els dos sòcols Fcgiwrap s'estan executant.

# 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ó, redirigeu el vostre navegador local a l'URL següent.

http://localhost 

http://localhost/second/ 

http://localhost/third/

El resultat hauria d'aparèixer com a les captures de pantalla següents.

8. Si tot està al seu lloc i està configurat correctament, activeu els dos dimonis Fcgiwrap per iniciar automàticament, després de reiniciar, emetent les ordres següents (en cas que hàgiu configurat Nginx per utilitzar els dos sòcols CGI).

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

Pas 3: activeu el suport de Ruby a Fcgiwrap

9. Si necessiteu executar scripts de Ruby dinàmics a Nginx FCGI, heu d'instal·lar l'intèrpret Ruby a Gentoo amb l'ordre següent.

# emerge --ask ruby

10. Després de compilar i instal·lar el paquet, aneu a llocs disponibles de Nginx i editeu el fitxer localhost.conf afegint les declaracions següents abans de l'últim claudàtor \ } , que activa el suport per executar scripts de Ruby en una quarta ubicació sota la ruta arrel del document predeterminada servida per Nginx localhost.

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

Utilitzeu les següents directives 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. Ara, per provar la configuració, creeu el quart directori a la ruta /var/www/localhost/htdocs, creeu un script d'índex de Ruby executable amb l'extensió .rb i afegiu el següent contingut.

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

Exemple 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. Després d'afegir permisos d'execució al fitxer, reinicieu el dimoni Nginx per aplicar configuracions.

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

Obriu el vostre navegador i navegueu a l'URL http://localhost/fourth/, que us hauria de presentar el contingut següent.

Això és tot de moment, heu configurat Nginx per servir scripts dinàmics Perl, Ruby i Bash a FastCGI Gateway, però tingueu en compte que executar aquest tipus d'scripts interpretats a Nginx CGI Gateway pot ser perillós i imposar seriosos riscos de seguretat al vostre servidor perquè s'executa utilitzant intèrprets d'ordres actius al vostre sistema, però pot ampliar la barrera estàtica imposada per l'HTML estàtic, afegint funcionalitat dinàmica al vostre lloc web.