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


Ovaj vodič je usko povezan s prethodnim o instalaciji LEMP-a na Gentoo i tretira druge proširene probleme poslužitelja kao što je omogućavanje dinamičkih skriptnih jezika kao što su Perl ili Bash ili Ruby putem Fcgiwrap pristupnika i uređivanje Nginx virtualnih hostova konfiguracijskih datoteka za posluživati dinamički sadržaj koristeći .pl, .rb i .cgi skripte.

Zahtjevi

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

Korak 1: Omogućite FCGIWRAP na Gentoo LEMP

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, funkcionira tako što obrađuje zahtjeve primljene od Nginxa, putem TCP-a ili Unix Sockets, na neovisni način i vraća proizvedeni rezultat natrag u Nginx, koji će, u konačnici, proslijediti odgovore krajnjim klijentima.

1. Prvo počnimo s instaliranjem procesa FCcgiwrap na Gentoo Linux pomoću sljedeće naredbe.

emerge --ask www-misc/fcgiwrap

2. Prema zadanim postavkama Fcgiwrap paket ne nudi nikakvu init skriptu na Gentoou za upravljanje procesom. Nakon što su paketi kompajlirani i instalirani, stvorite sljedeće init skripte koje vam pomažu upravljati Fcgiwrap procesom korištenjem tri pristupa: ili pokretanje procesa korištenjem Unix Domain Sockets ili korištenjem lokalnog < b>TCP utičnice ili koristeći oboje u isto vrijeme.

Korištenje TCP Socket skripte

Napravite init datoteku na /etc/init.d/ stazi sa sljedećim sadržajem datoteke.

nano /etc/init.d/fcgiwrap

Dodajte sljedeći sadržaj 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 vidite, datoteka skripte sadrži dvije varijable na početku, odnosno ip i port. Promijenite ove varijable u skladu sa svojim potrebama i pobrinite se da se ne preklapaju s drugim uslugama na vašem sustavu, posebno s varijablom porta – zadana je ovdje 12345 – promijenite u skladu s tim.

Korištenje 0.0.0.0 na IP varijabli omogućuje procesu vezanje i slušanje na bilo kojem IP-u (dostupan izvana ako nemate vatrozid), ali iz sigurnosnih razloga trebali biste ga promijeniti da sluša samo lokalno, na 127.0.0.1, osim ako nemate druge razloge poput daljinskog postavljanja Fcgiwrap pristupnika na drugom čvoru radi performansi ili uravnoteženja opterećenja.

3. Nakon što je datoteka stvorena, dodajte dozvole za izvršavanje i upravljajte procesom demona pomoću prekidača za pokretanje, zaustavljanje ili status. Prekidač statusa pokazat će vam relevantne informacije o utičnici kao što je IP-PORT par koji sluša i je li neka aktivna veza inicijalizirana. Također, ako proces ima aktivne veze u stanju TIME_WAIT, ne možete ga ponovno 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 skripte

Kao što je ranije predstavljeno, Fcgiwrap se može izvoditi istovremeno koristeći obje utičnice, tako da će malo promijeniti naziv 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 utičnicu.

#!/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. Ponovno se uvjerite da je ova datoteka izvršna i koristite iste prekidače usluge: start, stop ili status. Postavio sam zadanu stazu za ovu utičnicu na /run/fcgiwrap-unix.sock put sustava. Pokrenite proces i provjerite ga korištenjem prekidača status ili popis sadržaja direktorija /run i locirajte utičnicu ili koristite ps -a | naredba 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

Kao što je ranije spomenuto, Fcgiwrap može raditi i s TCP i UNIX utičnicama istovremeno, ali ako ne trebate veze s vanjskim pristupnikom držite se samo Unix Domain Socket, jer koristi međuprocesnu komunikaciju, koja je brža od komunikacije preko TCP povratne veze i koristi manje TCP opterećenja.

Korak 2: Omogućite CGI skripte na Nginxu

5. Da bi Nginx raščlanjivao i pokretao Perl ili Bash skripte kroz sučelje Fast Common Gateway, virtualni hostovi moraju biti konfigurirani s Fcgiwrap definicijama na root stazi ili izjavama lokacije.

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

Postavite sljedeći sadržaj, ili samo neke njegove dijelove, u željenu konfiguracijsku datoteku virtualnog hosta koju želite aktivirati dinamičke Perl ili Bash skripte s UNIX ili TCP utičnicama na različitim lokacijama, mijenjanjem fastcgi_pass izjave argumenta.

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 posebne konfiguracijske datoteke virtualnog hosta, pomaknite se na zadanu stazu korijena dokumenta vaše web stranice, stvorite te dvije mape da odražavaju vašu lokaciju naredbu i stvoriti indeksne datoteke za svaku lokaciju sa svojim posebnim nastavkom.

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

Stvorite datoteku index.pl na drugom mjestu sa sljedećim sadržajem.

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

Dodajte ovaj sadržaj da biste dobili varijable okoline.

#!/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ćem mjestu sa sljedećim sadržajem.

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

Dodajte ovaj sadržaj da biste dobili varijable okoline.

#!/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 s uređivanjem, učinite obje datoteke izvršnima, ponovno pokrenite Nginx poslužitelj i provjerite rade li obje Fcgiwrap utičnice.

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 preglednik na sljedeći URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Rezultat bi trebao izgledati kao na snimkama zaslona u nastavku.

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

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 tumač na Gentoo sa sljedećom naredbom.

emerge --ask ruby

10. Nakon što je paket kompajliran i instaliran, prijeđite na Nginx sites-available i uredite datoteku localhost.conf dodavanjem sljedećih izjava prije zadnja vitičasta zagrada “ } ”, koja aktivira podršku za pokretanje Ruby skripti na četvrtoj lokaciji ispod zadane korijenske staze dokumenta koju poslužuje Nginx lokalni host.

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

Koristite sljedeće Nginx upute.

## 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, za testiranje konfiguracije stvorite četvrti direktorij pod stazom /var/www/localhost/htdocs, izradite izvršnu Ruby skriptu indeksa s .rb proširenje i dodajte sljedeći sadržaj.

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

Ruby index.rb primjer.

#!/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 datoteci, ponovno pokrenite Nginx demon za primjenu konfiguracija.

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

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

To je to za sada, konfigurirali ste Nginx za posluživanje dinamičkih Perl, Ruby i Bash skripti na FastCGI Gatewayu, ali imajte na umu da pokretanje ove vrste interpretiranih skripti na Nginx CGI Gatewayu može biti opasno i predstavljati ozbiljne sigurnosne rizike vašem poslužitelju jer pokrenuti pomoću aktivnih ljuski pod vašim sustavom, ali može proširiti statičku barijeru koju nameće statički HTML, dodajući dinamičku funkcionalnost vašoj web stranici.