Namestitev FcgiWrap in omogočanje dinamičnih jezikov Perl, Ruby in Bash na Gentoo LEMP


Ta vadnica je strogo povezana s prejšnjo o namestitvi LEMP v Gentoo in obravnava druge razširjene težave strežnika, na primer omogočanje dinamičnih skriptnih jezikov, kot so Perl ali Bash ali Ruby prek Fcgiwrap Gateway, in urejanje konfiguracijskih datotek virtualnih gostiteljev Nginx za prikazovanje dinamične vsebine z uporabo skripte .pl , .rb in .cgi .

  1. Sklad LEMP, nameščen na Gentoo - https://linux-console.net/install-lemp-in-gentoo-linux/

1. korak: Omogočite FCGIWRAP na Gentoo LEMP

Fcgiwrap je del Nginx FastCGI Common Gateway Interface , ki obdeluje druge dinamične skriptne jezike, kot so skripti Perl ali Bash ali Ruby, in deluje tako, da obdeluje zahteve, prejete od Nginxa, prek TCP ali Unix Sockets na neodvisen način in vrne proizvedeni rezultat nazaj Nginxu, ki bo odgovore končno poslal strankam.

1. Najprej začnimo z namestitvijo procesa FCcgiwrap v Gentoo Linux z naslednjim ukazom.

# emerge --ask www-misc/fcgiwrap

2. Paket Fcgiwrap privzeto ne vsebuje skriptov init v Gentoo za upravljanje postopka. Ko so paketi zbrani in nameščeni, ustvarite naslednje skripte init , ki vam pomagajo upravljati postopek Fcgiwrap s tremi pristopi: bodisi zagon procesa z uporabo Unix Domain Sockets ali uporaba lokalnega < b> TCP vtičnice ali z uporabo obeh hkrati.

Na poti /etc/init.d/ ustvarite datoteko init z naslednjo vsebino datoteke.

# nano /etc/init.d/fcgiwrap

Dodajte naslednjo vsebino 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..."
}

Kot vidite, ima datoteka skripta na začetku dve spremenljivki, ip in vrata . Spremenite te spremenljivke z lastnimi potrebami in se prepričajte, da se ne prekrivajo z drugimi storitvami v vašem sistemu, zlasti spremenljivko vrat - privzeto tukaj je 12345 - ustrezno spremenite.

Uporaba 0.0.0.0 na spremenljivki IP omogoča, da se postopek veže in posluša na katerem koli IP-ju (zunaj dostopen, če nimate požarnega zidu), vendar bi ga morali iz varnostnih razlogov spremeniti tako, da posluša samo lokalno, na 127.0.0.1 , razen če imate druge razloge, na primer oddaljeno nastavitev prehoda Fcgiwrap na drugo vozlišče za izravnavo zmogljivosti ali obremenitve.

3. Ko je datoteka ustvarjena, dodajte dovoljenja za izvajanje in upravljajte proces demona s pomočjo stikal za zagon, zaustavitev ali stanje. Stikalo za stanje vam bo pokazalo ustrezne informacije o vtičnici, na primer par IP-PORT , ki ga posluša, in morebitno aktivno povezavo, ki je bila inicializirana. Če ima proces aktivne povezave v stanju TIME_WAIT , ga ne morete znova zagnati, dokler se ne zaprejo vse povezave TCP.

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

Kot je bilo predstavljeno prej, se Fcgiwrap lahko istočasno izvaja z uporabo obeh vtičnic, zato bo ime drugega skripta nekoliko spremenil v fcgiwrap-unix-socket , da bo zagotovil, da se lahko oba zaženeta in zaženeta hkrati.

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

Za vtičnico UNIX uporabite naslednjo vsebino datoteke.

#!/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. Še enkrat zagotovite, da je ta datoteka izvedljiva, in uporabite ista stikala za storitve: začetek , zaustavitev ali stanje . Privzeto pot za to vtičnico sem nastavil na sistemski poti /run/fcgiwrap-unix.sock . Zaženite postopek in ga preverite s stikalom ali seznamom /zaženi vsebino imenika in poiščite vtičnico ali uporabite ps -a | ukaz 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

Kot smo že omenili, lahko Fcgiwrap deluje hkrati s TCP in UNIX vtičnicami, če pa ne potrebujete zunanjih povezav prehoda, se držite samo Unix Domain Socket , ker uporablja medprocesno komunikacijo, ki je hitrejša od komunikacije prek TCP povratne povezave in porabi manj režijskih stroškov TCP.

2. korak: Omogočite skripte CGI v Nginxu

5. Da bo Nginx razčlenil in zagnal skripte Perl ali Bash prek vmesnika Fast Common Gateway Interface, morajo biti navidezni gostitelji konfigurirani z definicijami Fcgiwrap na korenski poti ali izjavah o lokaciji.

Primer je predstavljen spodaj (localhost), ki aktivira skripte Perl in CGI za vse datoteke, nameščene v korenski poti (/var/www/localhost/htdocs/) z .pl in razširitev .cgi z uporabo vtičnic Fcgiwrap TCP za privzeto pot korenskega dokumenta, drugo mesto z uporabo Unix Domain Sockets z datoteko index.pl in tretja lokacija uporablja vtičnice TCP z datoteko index.cgi .

Naslednjo vsebino ali samo nekatere njene dele postavite v želeno konfiguracijsko datoteko navideznega gostitelja, ki jo želite aktivirati z dinamičnimi skripti Perl ali Bash z vtičnicami UNIX ali TCP, na druga mesta, tako da spremenite izjavo fastcgi_pass .

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

Uredite localhost.conf , da bo videti tako kot v spodnji predlogi.

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. Ko končate urejati Nginx localhost.conf ali določeno konfiguracijsko datoteko navideznega gostitelja, se premaknite na privzeto korensko pot dokumenta spletnega mesta, ustvarite ti dve mapi, da odražata izjavo o lokaciji, in ustvarite indeksne datoteke za vsako lokacijo s posebno razširitvijo.

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

Ustvarite datoteko index.pl na drugem mestu z naslednjo vsebino.

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

Dodajte to vsebino, da dobite spremenljivke okolja.

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

Nato ustvarite datoteko index.cgi na tretjem mestu z naslednjo vsebino.

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

Dodajte to vsebino, da dobite spremenljivke okolja.

#!/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. Ko končate urejanje, naredite obe datoteki izvedljivi, znova zaženite strežnik Nginx in se prepričajte, da se izvajata obe vtičnici Fcgiwrap.

# 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

Nato preusmerite svoj lokalni brskalnik na naslednji URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Rezultat naj bo prikazan na spodnjih posnetkih zaslona.

8. Če je vse na svojem mestu in pravilno konfigurirano, omogočite samodejno zagon obeh demonov Fcgiwrap po ponovnem zagonu z izdajo naslednjih ukazov (v primeru, da ste Nginx konfigurirali za uporabo obeh vtičnic CGI).

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

3. korak: Aktivirajte podporo Ruby na Fcgiwrap

9. Če želite zagnati dinamične skripte Ruby na Nginx FCGI, morate v Gentoo namestiti tolmač Ruby z naslednjim ukazom.

# emerge --ask ruby

10. Ko je paket preveden in nameščen, se premaknite na Nginx spletna mesta so na voljo in uredite datoteko localhost.conf , tako da pred zadnjim kodrastim oklepajem \dodate naslednje izjave "}" , ki aktivira podporo za zagon skriptov Ruby na četrtem mestu pod privzeto korensko potjo dokumenta, ki jo nudi Nginx localhost.

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

Uporabite naslednje direktive 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. Zdaj za preizkus konfiguracije ustvarite četrti imenik pod potjo /var/www/localhost/htdocs , ustvarite izvršljiv skript Ruby index s pripono .rb in dodajte naslednje vsebino.

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

Primer 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. Ko v datoteko dodate izvedbena dovoljenja, znova zaženite demon Nginx, da uporabite konfiguracije.

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

Odprite brskalnik in pojdite na URL http:// localhost/4th/, ki naj vam predstavi naslednjo vsebino.

Za zdaj je to vse, Nginx ste konfigurirali tako, da streže dinamične skripte Perl, Ruby in Bash na FastCGI Gateway, vendar se zavedajte, da je izvajanje tovrstnih interpretiranih skriptov na Nginx CGI Gateway lahko nevarno in resno ogroža varnost vašega strežnika, ker zaženite z uporabo aktivnih lupin pod vašim sistemom, lahko pa razširite statično oviro, ki jo nalaga statični HTML, in doda dinamično funkcionalnost vašemu spletnemu mestu.