„FcgiWrap“ diegimas ir „Perl“, „Ruby“ ir „Bash“ dinaminių kalbų įjungimas „Gentoo LEMP“


Ši pamoka yra griežtai susijusi su ankstesne LEMP diegimo programa „Gentoo“ ir sprendžia kitas serverio problemas, tokias kaip dinaminių scenarijų kalbų, pvz., „Perl“, „Bash“ ar „Ruby“, įgalinimas per Fcgiwrap Gateway ir redaguoja „Nginx Virtual Hosts“ konfigūracijos failus, kad teikti dinaminį turinį naudojant .pl, .rb ir .cgi scenarijus.

Reikalavimai

  1. „Gentoo“ įdiegtas LEMP kaminas – https://linux-console.net/install-lemp-in-gentoo-linux/

1 veiksmas: „Gentoo LEMP“ įgalinkite FCGIWRAP

Fcgiwrap yra Nginx FastCGI bendrojo šliuzo sąsajos dalis, kuri apdoroja kitas dinamines scenarijų kalbas, pvz., Perl arba Bash arba Ruby scenarijus, veikia apdorodama iš Nginx gautas užklausas per TCP arba Unix Sockets savarankiškai ir grąžina gautą rezultatą atgal į Nginx, kuris laikui bėgant perduos atsakymus atgal galutiniams klientams.

1. Pirmiausia pradėkime įdiegdami FCcgiwrap procesą „Gentoo Linux“ naudodami šią komandą.

emerge --ask www-misc/fcgiwrap

2. Pagal numatytuosius nustatymus Fcgiwrap paketas nepateikia jokių init scenarijų „Gentoo“, kad būtų galima valdyti procesą. Sukompiliavus ir įdiegus paketus sukurkite šiuos init scenarijus, kurie padės valdyti Fcgiwrap procesą trimis būdais: arba paleisti procesą naudojant Unix domeno lizdus arba vietinį < b>TCP Socketsarba naudojant abu vienu metu.

Naudojant TCP Socket Script

Sukurkite pradinį failą /etc/init.d/ kelyje su tokiu failo turiniu.

nano /etc/init.d/fcgiwrap

Pridėkite toliau nurodytą failo turinį.

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

Kaip matote, scenarijaus failo pradžioje yra du kintamieji, atitinkamai ip ir port. Pakeiskite šiuos kintamuosius pagal savo poreikius ir įsitikinkite, kad jie nesutampa su kitomis jūsų sistemos paslaugomis, ypač prievado kintamuoju – numatytasis čia yra 12345 – atitinkamai pakeiskite.

Naudojant 0.0.0.0 IP kintamajame, procesas gali susieti ir klausytis bet kurio IP (pasiekiama išorėje, jei neturite ugniasienės ), tačiau saugumo sumetimais turėtumėte jį pakeisti, kad klausytumėte tik vietoje, 127.0.0.1, nebent turite kitų priežasčių, pvz., nuotoliniu būdu nustatyti Fcgiwrap šliuzą kitame mazge, kad būtų užtikrintas našumas arba apkrovos balansavimas.

3. Sukūrę failą pridėkite vykdymo leidimus ir valdykite demono procesą naudodami paleidimo, sustabdymo arba būsenos jungiklius. Būsenos jungiklis parodys atitinkamą lizdo informaciją, pvz., IP-PORT porą, kurią jis klauso, ir ar buvo inicijuotas aktyvus ryšys. Be to, jei procesas turi aktyvių ryšių TIME_WAIT būsenoje, negalėsite jo paleisti iš naujo, kol neuždarys visi TCP ryšiai.

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

Naudojant Unix Socket Script

Kaip minėta anksčiau, „Fcgiwrap“ gali veikti vienu metu naudojant abu lizdus, todėl antrojo scenarijaus pavadinimas šiek tiek pakeistas į fcgiwrap-unix-socket, kad būtų užtikrinta, jog abu būtų paleisti ir paleisti tuo pačiu metu.

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

Naudokite šį failo turinį UNIX lizdui.

#!/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. Dar kartą įsitikinkite, kad šis failas yra vykdomas, ir naudokite tuos pačius paslaugos jungiklius: pradėti, sustabdyti arba būseną. Nustačiau numatytąjį šio lizdo kelią /run/fcgiwrap-unix.sock sistemos kelyje. Pradėkite procesą ir patikrinkite jį naudodami būsenos jungiklį arba išvardykite /run katalogo turinį ir suraskite lizdą arba naudokite ps -a | grep fcgiwrap komandą.

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

Kaip minėta anksčiau, „Fcgiwrap“ gali veikti su TCP ir UNIX lizdais vienu metu, bet jei jums nereikia išorinių šliuzo jungčių, laikykitės tik Unix domeno lizdo, nes jis naudoja tarpprocesinį ryšį, kuris yra greitesnis nei ryšys per TCP loopback ryšiai ir sunaudoja mažiau TCP papildomų išlaidų.

2 veiksmas: įgalinkite CGI scenarijus „Nginx“.

5. Kad „Nginx“ galėtų analizuoti ir paleisti „Perl“ arba „Bash“ scenarijus per „Fast Common Gateway“ sąsają, „Virtual Hosts“ turi būti sukonfigūruotas naudojant „Fcgiwrap“ apibrėžimus šakniniame kelyje arba vietos sakiniuose.

Toliau pateikiamas pavyzdys (localhost), kuris suaktyvina Perl ir CGI scenarijus visuose failuose, esančiuose šakniniame kelyje (/var/www/localhost/htdocs/) su .pl ir .cgi plėtinys naudojant Fcgiwrap TCP Sockets numatytajam šakninio dokumento keliui, antroji vieta naudojant Unix domeno lizdus su index.pl failu o trečioji vieta naudoja TCP lizdus su index.cgi failu.

Įdėkite toliau pateiktą turinį arba tik kai kurias jo dalis į norimą virtualiojo pagrindinio kompiuterio konfigūracijos failą, kuriame norite suaktyvinti dinaminius Perl arba Bash scenarijus su UNIX arba TCP Sockets skirtingose vietose, pakeisdami fastcgi_pass argumento teiginį.

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

Redaguokite localhost.conf, kad atrodytų taip, kaip toliau pateiktame šablone.

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. Baigę redaguoti Nginx localhost.conf arba konkretų virtualiosios prieglobos konfigūracijos failą, pereikite prie svetainės numatytojo dokumento šakninio kelio, sukurkite tuos du aplankus, kad atspindėtų jūsų vietą pareiškimą ir sukurkite indekso failus kiekvienai vietai su konkrečiu plėtiniu.

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

Antroje vietoje sukurkite index.pl failą su tokiu turiniu.

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

Pridėkite šį turinį, kad gautumėte aplinkos kintamuosius.

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

Tada sukurkite index.cgi failą trečioje vietoje su tokiu turiniu.

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

Pridėkite šį turinį, kad gautumėte aplinkos kintamuosius.

#!/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. Baigę redaguoti, abu failus padarykite vykdomus, iš naujo paleiskite „Nginx“ serverį ir įsitikinkite, kad veikia abu „Fcgiwrap“ lizdai.

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

Tada peradresuokite vietinę naršyklę šiuo URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Rezultatas turėtų pasirodyti kaip toliau pateiktose ekrano kopijose.

8. Jei viskas yra vietoje ir tinkamai sukonfigūruota, įgalinkite abu Fcgiwrap demonus automatiškai paleisti po perkrovimo išduodami šias komandas (jei sukonfigūravote Nginx naudoti abu CGI lizdus).

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

3 veiksmas: suaktyvinkite „Ruby“ palaikymą „Fcgiwrap“.

9. Jei „Nginx FCGI“ reikia paleisti dinaminius „Ruby“ scenarijus, „Gentoo“ turite įdiegti Ruby interpretatorių naudodami šią komandą.

emerge --ask ruby

10. Kai paketas bus sukompiliuotas ir įdiegtas, pereikite prie Nginx svetainės – pasiekiamos ir redaguokite localhost.conf failą, prieš pridėdami šiuos teiginius paskutinis garbanotas skliaustas “ } ”, kuris suaktyvina palaikymą paleisti Ruby scenarijus ketvirtoje vietoje pagal numatytąjį dokumento šakninį kelią, kurį aptarnauja Nginx localhost.

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

Naudokite šias Nginx direktyvas.

## 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. Dabar, norėdami išbandyti konfigūraciją, sukurkite ketvirtąjį katalogą /var/www/localhost/htdocs kelyje, sukurkite vykdomąjį Ruby indekso scenarijų su .rb b> plėtinį ir pridėkite šį turinį.

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

Rubino indeksas.rb pavyzdys.

#!/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. Pridėję vykdymo leidimus faile, iš naujo paleiskite Nginx demoną, kad pritaikytumėte konfigūracijas.

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

Atidarykite naršyklę ir eikite į URL http://localhost/fourth/, kuriame turėtų būti pateiktas toks turinys.

Kol kas tiek, sukonfigūravote „Nginx“ teikti dinaminius „Perl“, „Ruby“ ir „Bash“ scenarijus „FastCGI Gateway“, tačiau atminkite, kad tokių interpretuojamų scenarijų paleidimas „Nginx CGI Gateway“ gali būti pavojingas ir kelti rimtą pavojų jūsų serverio saugumui, nes jie paleisti naudojant aktyvius apvalkalus pagal jūsų sistemą, bet gali išplėsti statinį barjerą, kurį nustato statinis HTML, pridėdamas dinamiškų jūsų svetainės funkcijų.