Ricerca nel sito web

Installazione di FcgiWrap e abilitazione dei linguaggi dinamici Perl, Ruby e Bash su Gentoo LEMP


Questo tutorial è strettamente correlato a quello precedente sull'installazione LEMP su Gentoo e tratta altri problemi estesi del server come l'abilitazione di linguaggi di scripting dinamici come Perl o Bash o Ruby tramite Fcgiwrap Gateway e la modifica dei file di configurazione Nginx Virtual Hosts per servire contenuti dinamici utilizzando gli script .pl, .rb e .cgi.

Requisiti

  1. Stack LEMP installato su Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Passo 1: Abilita FCGIWRAP su Gentoo LEMP

Fcgiwrap è una parte di Nginx FastCGI Common Gateway Interface che elabora altri linguaggi di scripting dinamici, come Perl o Bash o script Ruby, funziona elaborando le richieste ricevute da Nginx, tramite TCP o Unix Sockets, in modo indipendente e restituisce il risultato prodotto a Nginx, che, a termine, inoltrerà le risposte ai clienti finali.

1. Iniziamo innanzitutto installando il processo FCcgiwrap su Gentoo Linux utilizzando il seguente comando.

emerge --ask www-misc/fcgiwrap

2. Per impostazione predefinita il pacchetto Fcgiwrap non fornisce alcuno script init su Gentoo per gestire il processo. Dopo che i pacchetti sono stati compilati e installati, crea i seguenti script init che ti aiutano a gestire il processo Fcgiwrap utilizzando tre approcci: avviando il processo utilizzando Unix Domain Sockets o utilizzando < b>Socket TCP o utilizzandoli entrambi contemporaneamente.

Utilizzo dello script socket TCP

Crea un file init nel percorso /etc/init.d/ con il seguente contenuto del file.

nano /etc/init.d/fcgiwrap

Aggiungi il seguente contenuto del file.

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

Come puoi vedere il file di script contiene due variabili all'inizio, rispettivamente ip e port. Modifica queste variabili in base alle tue esigenze e assicurati che non si sovrappongano ad altri servizi sul tuo sistema, in particolare la variabile porta (l'impostazione predefinita qui è 12345) - cambia di conseguenza.

L'utilizzo di 0.0.0.0 sulla variabile IP consente al processo di associarsi e ascoltare su qualsiasi IP (accessibile dall'esterno se non si dispone di un firewall), ma per motivi di sicurezza è necessario modificarlo per ascoltare solo localmente, su 127.0.0.1, a meno che tu non abbia altri motivi come la configurazione remota del gateway Fcgiwrap su un nodo diverso per prestazioni o bilanciamento del carico.

3. Dopo aver creato il file, aggiungi i permessi di esecuzione e gestisci il processo del demone utilizzando gli interruttori di avvio, arresto o stato. L'interruttore di stato mostrerà le informazioni rilevanti sul socket come la coppia IP-PORT in ascolto e se qualsiasi connessione attiva è stata inizializzata. Inoltre, se il processo ha connessioni attive nello stato TIME_WAIT non è possibile riavviarlo finché tutte le connessioni TCP non vengono chiuse.

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

Utilizzo dello script socket Unix

Come presentato in precedenza, Fcgiwrap può essere eseguito simultaneamente utilizzando entrambi i socket, quindi cambierà leggermente il nome del secondo script in fcgiwrap-unix-socket, per garantire che entrambi possano essere avviati ed eseguiti contemporaneamente.

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

Utilizzare il seguente contenuto del file per il 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. Assicurati ancora una volta che questo file sia eseguibile e utilizza gli stessi parametri di servizio: start, stop o status. Ho impostato il percorso predefinito per questo socket sul percorso di sistema /run/fcgiwrap-unix.sock. Avviare il processo e verificarlo utilizzando l'interruttore status o elencando il contenuto della directory /run e individuando il socket oppure utilizzando 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

Come accennato in precedenza, Fcgiwrap può essere eseguito contemporaneamente con entrambi i socket TCP e UNIX, ma se non sono necessarie connessioni gateway esterne attenersi solo a Unix Domain Socket, poiché utilizza la comunicazione interprocesso, che è più veloce della comunicazione su Connessioni di loopback TCP e utilizza meno sovraccarico TCP.

Passaggio 2: abilita gli script CGI su Nginx

5. Affinché Nginx possa analizzare ed eseguire script Perl o Bash tramite Fast Common Gateway Interface, gli host virtuali devono essere configurati con le definizioni Fcgiwrap sul percorso root o sulle istruzioni di posizione.

Di seguito è presentato un esempio (localhost), che attiva gli script Perl e CGI su tutti i file posizionati nel percorso root (/var/www/localhost/htdocs/) con .pl e l'estensione .cgi che utilizza Fcgiwrap TCP Sockets per il percorso root predefinito del documento, la seconda posizione che utilizza Unix Domain Sockets, con un file index.pl e la terza posizione utilizza socket TCP con un file index.cgi.

Inserisci il seguente contenuto, o solo alcune parti di esso, nel file di configurazione dell'host virtuale desiderato per attivare gli script Perl o Bash dinamici con socket UNIX o TCP in posizioni diverse, modificando l'istruzione dell'argomento fastcgi_pass.

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

Modifica localhost.conf in modo che assomigli al modello seguente.

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. Dopo aver finito di modificare Nginx localhost.conf o il file di configurazione del tuo host virtuale specifico, spostati nel percorso root del documento predefinito del tuo sito web, crea queste due cartelle per riflettere la tua posizione istruzione e creare file di indice per ogni posizione con la sua estensione specifica.

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

Crea il file index.pl nella seconda posizione con il seguente contenuto.

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

Aggiungi questo contenuto per ottenere variabili di ambiente.

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

Quindi crea il file index.cgi nella terza posizione con il seguente contenuto.

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

Aggiungi questo contenuto per ottenere variabili di ambiente.

#!/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. Al termine della modifica, rendi eseguibili entrambi i file, riavvia il server Nginx e assicurati che entrambi i socket Fcgiwrap siano in esecuzione.

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

Successivamente, reindirizza il tuo browser locale al seguente URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Il risultato dovrebbe apparire come negli screenshot seguenti.

8. Se tutto è a posto e configurato correttamente, abilita entrambi i demoni Fcgiwrap ad avviarsi automaticamente, dopo il riavvio emettendo i seguenti comandi (nel caso in cui tu abbia configurato Nginx per utilizzare entrambi i socket CGI).

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

Passaggio 3: attiva il supporto Ruby su Fcgiwrap

9. Se hai bisogno di eseguire script Ruby dinamici su Nginx FCGI devi installare l'interprete Ruby su Gentoo con il seguente comando.

emerge --ask ruby

10. Dopo che il pacchetto è stato compilato e installato, passa a Nginx sites-available e modifica il file localhost.conf aggiungendo le seguenti istruzioni prima ultima parentesi graffa “ } ”, che attiva il supporto per eseguire script Ruby su una quarta posizione nel percorso root del documento predefinito servito da Nginx localhost.

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

Utilizza le seguenti direttive 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. Ora, per testare la configurazione, crea la quarta directory nel percorso /var/www/localhost/htdocs, crea uno script di indice Ruby eseguibile con .rb estensione e aggiungi il seguente contenuto.

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

Esempio di 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. Dopo aver aggiunto le autorizzazioni di esecuzione sul file, riavvia il demone Nginx per applicare le configurazioni.

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

Apri il browser e vai all'URL http://localhost/fourth/, che dovrebbe presentarti il seguente contenuto.

Per ora è tutto, hai configurato Nginx per servire script dinamici Perl, Ruby e Bash su FastCGI Gateway, ma tieni presente che eseguire questo tipo di script interpretati su Nginx CGI Gateway può essere pericoloso e imporre seri rischi per la sicurezza sul tuo server perché essi esegui utilizzando shell attive nel tuo sistema, ma puoi espandere la barriera statica imposta dall'HTML statico, aggiungendo funzionalità dinamiche al tuo sito web.