FcgiWrap installéieren an Perl, Ruby a Bash Dynamic Sproochen op Gentoo LEMP aktivéieren


Dësen Tutorial ass strikt mat der fréierer op der LEMP Installatioun op Gentoo verbonnen a behandelt aner Server erweidert Themen wéi d'Aktivéiere vun dynamesche Skriptesprooche wéi Perl oder Bash oder Ruby duerch Fcgiwrap Gateway, an änneren Nginx Virtual Hosts Konfiguratiounsdateien fir dynamesch Inhalter ze déngen mat .pl, .rb an .cgi Scripte.

  1. LEMP Stack installéiert op Gentoo - https://linux-console.net/install-lemp-in-gentoo-linux/

Schrëtt 1: Aktivéiert FCGIWRAP op Gentoo LEMP

Fcgiwrap ass en Deel vum Nginx FastCGI Common Gateway Interface deen aner dynamesch Skriptesprooche veraarbecht, wéi Perl oder Bash oder Ruby Skripte, funktionnéiert duerch d'Veraarbechtung vun Ufroe vun Nginx, iwwer TCP oder Unix Sockets, op eng onofhängeg Manéier a bréngt dat produzéiert Resultat zréck op Nginx, wat a Begrëff Äntwerten zréck un d'Enncliente weiderginn.

1. Loosst eis fir d'éischt ufänken andeems Dir den FCcgiwrap Prozess op Gentoo Linux installéiert mat dem folgenden Kommando.

# emerge --ask www-misc/fcgiwrap

2. Par défaut gëtt Fcgiwrap Package keng init Scripten op Gentoo fir de Prozess ze verwalten. Nodeems d'Packagen kompiléiert an installéiert sinn, erstellt déi folgend init Scripten déi Iech hëllefen de Fcgiwrap Prozess mat dräi Approche ze verwalten: entweder de Prozess mat Unix Domain Sockets lancéieren oder lokal b>TCP Socketsoder benotzt béid zur selwechter Zäit.

Erstellt eng Init Datei op /etc/init.d/ Wee mat dem folgenden Dateiinhalt.

# nano /etc/init.d/fcgiwrap

Füügt de folgenden Dateiinhalt.

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

Wéi Dir kënnt gesinn, hält d'Skriptdatei am Ufank zwou Variabelen, respektiv ip an Port. Ännert dës Variabelen mat Ären eegene Bedierfnesser a gitt sécher datt se net mat anere Servicer op Ärem System iwwerlappen, besonnesch Portvariabel - Standard hei ass 12345 - ännert deementspriechend.

D'Benotzung vun 0.0.0.0 op IP Variabel erlaabt de Prozess fir all IP ze binden an ze lauschteren (ausserhalb zougänglech wann Dir keng Firewall hutt), awer aus Sécherheetsgrënn sollt Dir et änneren fir nëmmen lokal ze lauschteren, op 127.0.0.1, ausser Dir hutt aner Grënn wéi d'Fcgiwrap Gateway op engem anere Node op afstand fir d'Performance oder Belaaschtung ze konfiguréieren.

3. Nodeems d'Datei erstallt ass, bäidréit d'Ausféierungsrechter a verwalten den Daemonprozess mat Start-, Stop- oder Statusschalter. De Statusschalter weist Iech relevant Socketinformatioun wéi IP-PORT Pair et lauschtert a wann eng aktiv Verbindung initialiséiert ass. Och, wann de Prozess aktiv Verbindungen am TIME_WAIT Staat huet, kënnt Dir et net nei starten bis all TCP Verbindungen zoumaachen.

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

Wéi virdru virgestallt, kann Fcgiwrap gläichzäiteg mat béide Sockets lafen, sou wäert den Numm vum zweete Skript liicht änneren op fcgiwrap-unix-Socket, fir sécherzestellen datt béid gläichzäiteg gestart a lafen kënnen.

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

Benotzt de folgenden Dateiinhalt fir 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. Gitt erëm sécher datt dës Datei ausführbar ass a benotzt déiselwecht Serviceschalter: Start, Stop oder Status. Ech hunn de Standardwee fir dës Socket op /run/fcgiwrap-unix.sock Systemwee gesat. Fänkt de Prozess un a verifizéiert et mat Status Schalter oder Lëscht /run Verzeechnesinhalt a lokaliséiert de Socket, oder benotzt ps -a | grep fcgiwrap Kommando.

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

Wéi virdru scho gesot, kann Fcgiwrap mat béiden TCP an UNIX Sockets gläichzäiteg lafen, awer wann Dir keng extern Gatewayverbindunge braucht, bleift nëmmen un Unix Domain Socket, well et interprocess Kommunikatioun benotzt, wat méi séier ass wéi Kommunikatioun iwwer TCP Loopback Verbindungen, a benotzt manner TCP Overhead.

Schrëtt 2: Aktivéiert CGI Scripten op Nginx

5. Fir Nginx fir Perl oder Bash Scripten duerch Fast Common Gateway Interface ze parséieren an auszeféieren, mussen Virtual Hosts mat Fcgiwrap Definitiounen op Root Wee oder Standort Aussoen konfiguréiert ginn.

E Beispill gëtt hei ënnen presentéiert (localhost), wat Perl- a CGI-Skripte op all Dateien aktivéiert, déi am Rootwee gesat ginn (/var/www/localhost/htdocs/) mat .pl > an .cgi Extensioun benotzt Fcgiwrap TCP Sockets fir Standard root Dokument Wee, déi zweet Plaz benotzt Unix Domain Sockets, mat enger index.pl Datei an déi drëtt Plaz benotzt TCP Sockets mat enger index.cgi Datei.

Place de folgenden Inhalt, oder nëmmen e puer Deeler dovun, op Är gewënschte Virtuelle Host Konfiguratiounsdatei Dir wëllt dynamesch Perl oder Bash Scripte mat UNIX oder TCP Sockets ënner verschiddene Plazen aktivéieren, duerch Änneren fastcgi_pass Argument Ausso.

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

Änneren localhost.conf fir ze kucken wéi an der Schabloun hei drënner.

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. Nodeems Dir d'Ännere vun Nginx localhost.conf fäerdeg hutt, oder Äre spezifesche Virtuelle Host Konfiguratiounsdatei, réckelt op Är Websäit Standarddokumentroot Wee, erstellt déi zwee Ordner fir Är Standuerterklärung ze reflektéieren, an erstellt Indexdateien fir all Plaz mat senger spezifescher Extensioun.

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

Erstellt index.pl Datei op zweeter Plaz mat dem folgenden Inhalt.

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

Füügt dësen Inhalt fir Ëmfeldvariablen ze kréien.

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

Erstellt dann index.cgi Datei op drëtter Plaz mat dem folgenden Inhalt.

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

Füügt dësen Inhalt fir Ëmfeldvariablen ze kréien.

#!/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. Wann d'Editioun fäerdeg ass, béid Dateien ausführbar maachen, den Nginx-Server nei starten a sécherstellen datt béid Fcgiwrap Sockets lafen.

# 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

Als nächst, redirect Äre lokalen Browser op folgend URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

D'Resultat soll erschéngen wéi op ënnen Screenshots.

8. Wann alles op der Plaz ass a korrekt konfiguréiert ass, aktivéiert béid Fcgiwrap-Dämonen fir automatesch ze starten, nom Restart andeems Dir déi folgend Kommandoen ausginn (am Fall wou Dir Nginx konfiguréiert hutt fir béid CGI Sockets ze benotzen).

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

Schrëtt 3: Aktivéiert Ruby Support op Fcgiwrap

9. Wann Dir dynamesch Ruby Scripten op Nginx FCGI ausféiere musst, musst Dir den Ruby Dolmetscher op Gentoo mat dem folgenden Kommando installéieren.

# emerge --ask ruby

10. Nodeems de Package kompiléiert an installéiert ass, réckelt op Nginx Sites-available an ännert localhost.conf Datei andeems Dir déi folgend Aussoe virun der leschter Curly Bracket bäidréit \ } , wat d'Ënnerstëtzung aktivéiert fir Ruby Scripten op enger véierter Plaz ënner Standarddokumentroot Wee ze lafen, zerwéiert vum Nginx localhost.

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

Benotzt déi folgend Nginx Direktiven.

## 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. Elo, fir d'Konfiguratioun ze testen, erstellt de véierte Verzeichnis ënner /var/www/localhost/htdocs Wee, erstellt en ausführbare Ruby Index Skript mat .rb Extensioun a füügt déi folgend Inhalt.

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

Rubin index.rb Beispill.

#!/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. Nodeems Dir d'Ausféierungsrechter op der Datei bäigefüügt hutt, nei starten Nginx Daemon fir Konfiguratiounen z'applizéieren.

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

Öffnen Äre Browser a navigéiert op d'URL http://localhost/fourth/, déi Iech de folgenden Inhalt soll presentéieren.

Dat ass et fir de Moment, Dir hutt Nginx konfiguréiert fir dynamesch Perl, Ruby a Bash Scripten op FastCGI Gateway ze déngen, awer, sidd bewosst datt dës Aart vun interpretéiert Scripten op Nginx CGI Gateway lafen kann geféierlech sinn an eescht Sécherheetsrisiken op Ärem Server imposéieren well se lafen mat aktive Muschelen ënner Ärem System, awer ka statesch Barrière ausbaue vun statesch HTML ausbauen, dynamesch Funktionalitéit op Är Websäit bäidroen.