Instaliranje FcgiWrap-a i omogućavanje Perl, Ruby i Bash dinamičkih jezika na Gentoo LEMP-u


Ovaj vodič je striktno povezan sa prethodnim o LEMP instalaciji na Gentoo-u i tretira druge probleme proširene servera kao što je omogućavanje jezika za dinamičke skripte kao što su Perl ili Bash ili Ruby preko Fcgiwrap Gateway-a i uređivanje konfiguracijskih datoteka Nginx Virtual Hosts na posluživati dinamički sadržaj koristeći .pl, .rb i .cgi skripte.

Zahtjevi

  1. LEMP stack instaliran na Gentoo-u – https://linux-console.net/install-lemp-in-gentoo-linux/

Korak 1: Omogućite FCGIWRAP na Gentoo LEMP-u

Fcgiwrap je dio Nginx FastCGI Common Gateway Interface koji obrađuje druge dinamičke skriptne jezike, kao što su Perl ili Bash ili Ruby skripte, radi obradom zahtjeva primljenih od Nginxa, preko TCP-a ili Unix Sockets, na nezavisan način i vraća proizvedeni rezultat nazad u Nginx, koji će, u terminu, proslijediti odgovore nazad krajnjim klijentima.

1. Počnimo sa instalacijom procesa FCcgiwrap na Gentoo Linux koristeći sljedeću naredbu.

emerge --ask www-misc/fcgiwrap

2. Po defaultu Fcgiwrap paket ne pruža nikakve init skripte na Gentoou za upravljanje procesom. Nakon što su paketi kompajlirani i instalirani kreirajte sljedeće init skripte koje vam pomažu da upravljate Fcgiwrap procesom koristeći tri pristupa: ili pokretanje procesa pomoću Unix Domain Sockets ili korištenjem lokalnih < b>TCP utičnice ili korištenje oba u isto vrijeme.

Korištenje TCP Socket Script

Kreirajte init datoteku na putu /etc/init.d/ sa sljedećim sadržajem datoteke.

nano /etc/init.d/fcgiwrap

Dodajte sadržaj sljedeće datoteke.

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

Kao što možete vidjeti, datoteka skripte sadrži dvije varijable na početku, odnosno ip i port. Promijenite ove varijable prema vlastitim potrebama i pobrinite se da se ne preklapaju s drugim uslugama na vašem sistemu, posebno port varijabla - ovdje je zadana vrijednost 12345 - promijenite u skladu s tim.

Korištenje 0.0.0.0 na IP varijable omogućava procesu da se veže i osluškuje na bilo kojoj IP adresi (spolja dostupna ako nemate firewall), ali iz sigurnosnih razloga trebate je promijeniti da sluša samo lokalno, na 127.0.0.1, osim ako nemate druge razloge kao što je daljinsko postavljanje Fcgiwrap gatewaya na drugom čvoru za performanse ili balansiranje opterećenja.

3. Nakon kreiranja datoteke, dodajte dozvole za izvršavanje i upravljajte demonskim procesom koristeći start, stop ili status prekidače. Prekidač statusa će vam pokazati relevantne informacije o utičnici kao što je IP-PORT uparivanje koje sluša i ako je bilo koja aktivna veza inicijalizirana. Također, ako proces ima aktivne veze u stanju TIME_WAIT, ne možete ga ponovo pokrenuti dok se sve TCP veze ne zatvore.

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

Korištenje Unix Socket Script

Kao što je ranije predstavljeno, Fcgiwrap može raditi istovremeno koristeći oba soketa, pa će malo promijeniti ime druge skripte u fcgiwrap-unix-socket, kako bi se osiguralo da se obje mogu pokrenuti i pokrenuti u isto vrijeme.

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

Koristite sljedeći sadržaj datoteke za 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. Ponovo se uvjerite da je ova datoteka izvršna i koristite iste servisne prekidače: start, stop ili status. Postavio sam podrazumevanu putanju za ovu utičnicu na /run/fcgiwrap-unix.sock sistemskoj putanji. Pokrenite proces i potvrdite ga pomoću prekidača status ili liste /run sadržaja direktorija i locirajte utičnicu ili koristite ps -a | grep fcgiwrap komanda.

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

Kao što je prethodno spomenuto, Fcgiwrap može istovremeno raditi sa TCP i UNIX utičnicama, ali ako vam nisu potrebne vanjske veze gatewaya držite se samo Unix Domain Socket, jer koristi međuprocesnu komunikaciju, koja je brža od komunikacije preko TCP loopback veze, i koristi manje TCP overhead.

Korak 2: Omogućite CGI skripte na Nginxu

5. Da bi Nginx analizirao i izvodio Perl ili Bash skripte kroz Fast Common Gateway Interface, virtuelni hostovi moraju biti konfigurisani sa Fcgiwrap definicijama na root putanji ili naredbama o lokaciji.

U nastavku je prikazan primjer (localhost), koji aktivira Perl i CGI skripte na svim datotekama smještenim na root stazi (/var/www/localhost/htdocs/) sa .pl > i .cgi ekstenziju koristeći Fcgiwrap TCP utičnice za zadanu stazu korijenskog dokumenta, druga lokacija koja koristi Unix Domain Sockets, sa datotekom index.pl a treća lokacija koristi TCP utičnice sa datotekom index.cgi.

Postavite sljedeći sadržaj, ili samo neke njegove dijelove, u željenu konfiguracijsku datoteku virtualnog hosta za koju želite da aktivirate dinamičke Perl ili Bash skripte sa UNIX ili TCP utičnicama na različitim lokacijama, modifikacijom naredbe argumenta fastcgi_pass.

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

Uredite localhost.conf da izgleda kao u predlošku ispod.

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. Nakon što završite s uređivanjem Nginx localhost.conf, ili vaše specifične konfiguracijske datoteke virtualnog hosta, premjestite se na zadanu korijensku stazu dokumenta vaše web stranice, kreirajte te dvije mape da odražavaju vašu lokaciju i kreirajte indeksne datoteke za svaku lokaciju sa svojim specifičnim ekstenzijom.

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

Kreirajte datoteku index.pl na drugoj lokaciji sa sljedećim sadržajem.

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

Dodajte ovaj sadržaj da dobijete varijable okruženja.

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

Zatim kreirajte datoteku index.cgi na trećoj lokaciji sa sljedećim sadržajem.

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

Dodajte ovaj sadržaj da dobijete varijable okruženja.

#!/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. Kada završite sa uređivanjem, učinite oba fajla izvršnim, ponovo pokrenite Nginx server i uverite se da su oba Fcgiwrap soketa pokrenuta.

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

Zatim preusmjerite svoj lokalni pretraživač na sljedeći URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Rezultat bi se trebao pojaviti kao na slikama ispod.

8. Ako je sve na svom mjestu i ispravno konfigurirano, omogućite automatsko pokretanje oba Fcgiwrap demona, nakon ponovnog pokretanja, izdavanjem sljedećih naredbi (u slučaju da ste konfigurirali Nginx da koristi oba CGI soketa).

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

Korak 3: Aktivirajte Ruby podršku na Fcgiwrap

9. Ako trebate pokrenuti dinamičke Ruby skripte na Nginx FCGI morate instalirati Ruby interpreter na Gentoo sa sljedećom komandom.

emerge --ask ruby

10. Nakon što je paket preveden i instaliran, idite na Nginx sites-available i uredite localhost.conf datoteku dodavanjem sljedećih izjava prije zadnja vitičasta zagrada “ } ”, koja aktivira podršku za pokretanje Ruby skripti na četvrtoj lokaciji pod zadanom korijenskom putanjom dokumenta koju opslužuje Nginx localhost.

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

Koristite sljedeće Nginx direktive.

## 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. Sada, da biste testirali konfiguraciju, kreirajte četvrti direktorij pod /var/www/localhost/htdocs putanjom, kreirajte izvršnu Ruby indeksnu skriptu sa .rb b> proširenje i dodajte sljedeći sadržaj.

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

Primjer 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. Nakon što dodate dozvole za izvršavanje na fajl, ponovo pokrenite Nginx demon da biste primijenili konfiguracije.

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

Otvorite svoj pretraživač i idite na URL http://localhost/fourth/, koji bi vam trebao predstaviti sljedeći sadržaj.

To je to za sada, konfigurisali ste Nginx da služi dinamičke Perl, Ruby i Bash skripte na FastCGI Gateway-u, ali imajte na umu da pokretanje ove vrste interpretiranih skripti na Nginx CGI Gateway-u može biti opasno i nametnuti ozbiljne sigurnosne rizike vašem serveru jer pokrenuti koristeći aktivne ljuske pod vašim sistemom, ali može proširiti statičku barijeru nametnutu statičkim HTML-om, dodajući dinamičku funkcionalnost vašoj web stranici.