Installere FcgiWrap og aktivere Perl, Ruby og Bash Dynamic Languages på Gentoo LEMP


Denne opplæringen er strengt knyttet til tidligere en på LEMP-installasjon på Gentoo og behandler andre serverutvidede problemer som å aktivere dynamiske skriptspråk som Perl eller Bash eller Ruby gjennom Fcgiwrap Gateway, og redigere Nginx Virtual Hosts-konfigurasjonsfiler for å vise dynamisk innhold ved hjelp av .pl-, .rb- og .cgi-skript.

Krav

  1. LEMP-stack installert på Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Trinn 1: Aktiver FCGIWRAP på Gentoo LEMP

Fcgiwrap er en del av Nginx FastCGI Common Gateway Interface som behandler andre dynamiske skriptspråk, som Perl- eller Bash- eller Ruby-skript, fungerer ved å behandle forespørsler mottatt fra Nginx, gjennom TCP eller Unix Sockets, på en uavhengig måte og returnerer det produserte resultatet tilbake til Nginx, som på sikt vil videresende svar tilbake til sluttkunder.

1. La oss først starte med å installere FCcgiwrap-prosessen på Gentoo Linux ved å bruke følgende kommando.

emerge --ask www-misc/fcgiwrap

2. Som standard gir ikke Fcgiwrap-pakken noen init-skript på Gentoo for å administrere prosessen. Etter at pakkene er kompilert og installert, oppretter du følgende init-skript som hjelper deg å administrere Fcgiwrap-prosessen ved å bruke tre tilnærminger: enten starte prosessen ved å bruke Unix Domain Sockets eller bruke lokale < b>TCP-sockets eller bruk av begge samtidig.

Bruker TCP Socket Script

Opprett en init-fil på /etc/init.d/-banen med følgende filinnhold.

nano /etc/init.d/fcgiwrap

Legg til følgende filinnhold.

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

Som du kan se har skriptfilen to variable i begynnelsen, henholdsvis ip og port. Endre disse variablene med dine egne behov og sørg for at de ikke overlapper med andre tjenester på systemet ditt, spesielt portvariabel – standard her er 12345 – endre tilsvarende.

Bruk av 0.0.0.0 på IP-variabelen gjør at prosessen kan binde og lytte på hvilken som helst IP (utenfor tilgjengelig hvis du ikke har en brannmur ), men av sikkerhetsgrunner bør du endre den til kun å lytte lokalt, på 127.0.0.1, med mindre du har andre grunner som fjernoppsett Fcgiwrap-gateway på en annen node for ytelse eller lastbalansering.

3. Etter at filen er opprettet, legg til utførelsestillatelser og administrer demonprosessen ved å bruke start-, stopp- eller statusbrytere. Statusbryteren vil vise deg relevant kontaktinformasjon, for eksempel IP-PORT-paret den lytter og om en aktiv tilkobling ble initialisert. Dessuten, hvis prosessen har aktive tilkoblinger i tilstanden TIME_WAIT, kan du ikke starte den på nytt før alle TCP-tilkoblinger lukkes.

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

Bruker Unix Socket Script

Som presentert tidligere kan Fcgiwrap kjøres samtidig ved å bruke begge sockets, så vil endre navnet på det andre skriptet litt til fcgiwrap-unix-socket, for å sikre at begge kan startes og kjøres samtidig.

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

Bruk følgende filinnhold for UNIX-socket.

#!/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. Forsikre deg om at denne filen er kjørbar og bruk de samme tjenestebryterne: start, stopp eller status. Jeg har satt standardbanen for denne sokkelen på /run/fcgiwrap-unix.sock systembanen. Start prosessen og bekreft den ved å bruke status-bryteren eller liste /run-kataloginnhold og finn kontakten, eller bruk ps -a | grep fcgiwrap-kommandoen.

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

Som tidligere nevnt kan Fcgiwrap kjøre med både TCP- og UNIX-socketer samtidig, men hvis du ikke trenger eksterne gateway-tilkoblinger, hold deg kun til Unix Domain Socket, fordi den bruker interprosesskommunikasjon, som er raskere enn kommunikasjon over TCP loopback-tilkoblinger, og bruker mindre TCP-overhead.

Trinn 2: Aktiver CGI-skript på Nginx

5. For at Nginx skal analysere og kjøre Perl- eller Bash-skript gjennom Fast Common Gateway Interface, må virtuelle verter konfigureres med Fcgiwrap-definisjoner på rotbane- eller plasseringssetninger.

Et eksempel er presentert nedenfor (localhost), som aktiverer Perl- og CGI-skript på alle filer plassert i rotbanen (/var/www/localhost/htdocs/) med .pl og .cgi utvidelse som bruker Fcgiwrap TCP Sockets for standard rotdokumentbane, den andre plasseringen bruker Unix Domain Sockets, med en index.pl fil og den tredje plasseringen bruker TCP-sockets med en index.cgi-fil.

Plasser følgende innhold, eller bare noen deler av det, til ønsket Virtual Host-konfigurasjonsfil du vil aktivere dynamiske Perl- eller Bash-skript med UNIX- eller TCP-sockets på forskjellige steder, ved å endre fastcgi_pass-argumentsetningen.

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

Rediger localhost.conf slik at den ser ut som i malen nedenfor.

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. Etter at du er ferdig med å redigere Nginx localhost.conf, eller den spesifikke konfigurasjonsfilen for Virtual Host, flytter du til standarddokumentrotbanen for nettstedet ditt, oppretter de to mappene for å gjenspeile plasseringen din uttalelse, og lag indeksfiler for hvert sted med dens spesifikke utvidelse.

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

Opprett index.pl-fil på andre plassering med følgende innhold.

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

Legg til dette innholdet for å få miljøvariabler.

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

Opprett deretter index.cgi-fil på tredje plassering med følgende innhold.

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

Legg til dette innholdet for å få miljøvariabler.

#!/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. Når du er ferdig med redigeringen, gjør begge filene kjørbare, start Nginx-serveren på nytt og sørg for at begge Fcgiwrap-kontaktene kjører.

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

Deretter omdirigerer du din lokale nettleser til følgende URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Resultatet skal vises som på skjermdumpene nedenfor.

8. Hvis alt er på plass og riktig konfigurert, aktiver begge Fcgiwrap-demonene til å starte automatisk, etter omstart ved å utstede følgende kommandoer (i tilfelle du har konfigurert Nginx til å bruke begge CGI-sockets).

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

Trinn 3: Aktiver Ruby-støtte på Fcgiwrap

9. Hvis du trenger å kjøre dynamiske Ruby-skript på Nginx FCGI, må du installere Ruby-tolken på Gentoo med følgende kommando.

emerge --ask ruby

10. Etter at pakken er kompilert og installert, flytt til Nginx sites-available og rediger filen localhost.conf ved å legge til følgende setninger før siste krøllete parentes “ } ”, som aktiverer støtte for å kjøre Ruby-skript på en fjerde plassering under standard dokumentrotbane servert av Nginx localhost.

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

Bruk følgende Nginx-direktiver.

## 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. Nå, for å teste konfigurasjonen, oppretter du den fjerde katalogen under /var/www/localhost/htdocs banen, og lag et kjørbart Ruby-indeksskript med .rb b> utvidelse og legg til følgende innhold.

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

Ruby index.rb eksempel.

#!/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. Etter at du har lagt til utførelsestillatelser på filen, start Nginx daemon på nytt for å bruke konfigurasjoner.

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

Åpne nettleseren din og naviger til URL-en http://localhost/fourth/, som skal presentere deg følgende innhold.

Det er det for nå, du har konfigurert Nginx til å tjene dynamiske Perl-, Ruby- og Bash-skript på FastCGI Gateway, men vær oppmerksom på at å kjøre denne typen tolkede skript på Nginx CGI Gateway kan være farlig og påføre serveren din alvorlige sikkerhetsrisikoer fordi de kjøres ved hjelp av aktive skall under systemet ditt, men kan utvide statisk barriere pålagt av statisk HTML, og legge til dynamisk funksjonalitet til nettstedet ditt.