Pag-instalar sa FcgiWrap ug Pag-enable sa Perl, Ruby ug Bash Dynamic nga mga Pinulongan sa Gentoo LEMP


Kini nga panudlo hugot nga may kalabutan sa kanhi sa LEMP Installation sa Gentoo ug nagtagad sa ubang mga isyu nga gipalugway sa server sama sa pagpagana sa dinamikong scripting nga mga pinulongan sama sa Perl o Bash o Ruby pinaagi sa Fcgiwrap Gateway, ug pag-edit sa Nginx Virtual Hosts configuration files aron sa pag-alagad sa dinamikong sulod gamit ang .pl, .rb ug .cgi nga mga script.

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

Lakang 1: I-enable ang FCGIWRAP sa Gentoo LEMP

Ang Fcgiwrap usa ka bahin sa Nginx FastCGI Common Gateway Interface nga nagproseso sa ubang dinamikong mga lengguwahe sa scripting, sama sa Perl o Bash o Ruby nga mga script, nagtrabaho pinaagi sa pagproseso sa mga hangyo nga nadawat gikan sa Nginx, pinaagi sa TCP o Unix Sockets, sa usa ka independente nga paagi ug ibalik ang nahimo nga resulta balik sa Nginx, nga, sa termino, ipasa ang mga tubag balik sa katapusan nga mga kliyente.

1. Magsugod una ta pinaagi sa pag-instalar sa FCcgiwrap nga proseso sa Gentoo Linux gamit ang mosunod nga sugo.

# emerge --ask www-misc/fcgiwrap

2. Pinaagi sa default ang Fcgiwrap nga pakete wala maghatag ug bisan unsang init nga mga script sa Gentoo aron madumala ang proseso. Human ma-compile ug ma-install ang mga package paghimo sa mosunod nga init nga mga script nga makatabang kanimo sa pagdumala sa proseso sa Fcgiwrap gamit ang tulo ka pamaagi: paglansad sa proseso gamit ang Unix Domain Sockets o gamit ang lokal nga < b>TCP Socketso paggamit sa duha sa samang higayon.

Paghimo og init nga payl sa /etc/init.d/ nga dalan nga adunay mosunod nga sulod sa payl.

# nano /etc/init.d/fcgiwrap

Idugang ang mosunod nga sulod sa file.

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

Sama sa imong makita nga ang script file adunay duha ka variable sa sinugdanan, matag usa ip ug port. Usba kini nga mga variable sa imong kaugalingon nga mga panginahanglan ug siguroha nga dili kini mag-overlap sa ubang mga serbisyo sa imong sistema, labi na ang port variable - ang default dinhi mao ang 12345 - usba sumala niana.

Ang paggamit sa 0.0.0.0 sa IP variable makapahimo sa proseso sa pagbugkos ug pagpaminaw sa bisan unsang IP (gawas nga ma-access kung wala kay firewall ), apan alang sa mga hinungdan sa seguridad kinahanglan nimo nga usbon kini aron maminaw sa lokal lamang, sa 127.0.0.1, gawas kon duna kay laing rason sama sa layo nga pag-setup sa Fcgiwrap gateway sa laing node para sa performance o load balancing.

3. Human mabuhat ang file, idugang ang mga permiso sa pagpatuman ug pagdumala sa proseso sa daemon gamit ang pagsugod, paghunong o mga switch sa status. Ang switch sa status magpakita kanimo nga may kalabotan nga impormasyon sa socket sama sa IP-PORT pares nga kini naminaw ug kung adunay bisan unsang aktibo nga koneksyon kung diin nagsugod. Usab, kung ang proseso adunay aktibo nga koneksyon sa TIME_WAIT nga estado dili nimo kini ma-restart hangtod ang tanan nga koneksyon sa TCP magsira.

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

Sama sa gipresentar sa sayo pa, ang Fcgiwrap mahimong dungan nga modagan gamit ang duha ka socket, mao nga gamay ra ang pag-ilis sa ngalan sa ikaduhang script ngadto sa fcgiwrap-unix-socket, aron masiguro nga ang duha mahimong sugdan ug dagan sa samang higayon.

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

Gamita ang mosunod nga sulod sa file para sa 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. Siguruha pag-usab nga kini nga file ma-executable ug gamiton ang parehas nga mga switch sa serbisyo: start, stop o status. Gibutang nako ang default nga agianan alang niini nga socket sa /run/fcgiwrap-unix.sock system path. Sugdi ang proseso ug pamatud-i kini gamit ang status switch o ilista ang /run nga sulod sa direktoryo ug pangitaa ang socket, o gamita ang ps -a | grep fcgiwrap sugo.

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

Sama sa nahisgotan na kaniadto, ang Fcgiwrap mahimong modagan sa TCP ug UNIX nga mga socket nga dungan, apan kung dili nimo kinahanglan ang mga eksternal nga koneksyon sa gateway magpabilin sa Unix Domain Socket lamang, tungod kay kini naggamit sa interprocess nga komunikasyon, nga mas paspas kay sa komunikasyon. TCP loopback nga mga koneksyon, ug naggamit ug gamay nga TCP overhead.

Lakang 2: I-enable ang CGI Scripts sa Nginx

5. Para sa Nginx sa pag-parse ug pagpadagan sa Perl o Bash scripts pinaagi sa Fast Common Gateway Interface, ang Virtual Hosts kinahanglang ma-configure sa Fcgiwrap definitions sa root path o location statements.

Usa ka pananglitan, gipresentar sa ubos (localhost), nga nagpalihok sa Perl ug CGI nga mga script sa tanang mga file nga gibutang sa root path (/var/www/localhost/htdocs/) uban sa .pl ug .cgi extension gamit ang Fcgiwrap TCP Sockets para sa default root document path, ang ikaduhang lokasyon gamit ang Unix Domain Sockets, nga adunay index.pl file ug ang ikatulo nga lokasyon naggamit ug TCP sockets nga adunay index.cgi file.

Ibutang ang mosunod nga sulod, o pipila lang ka bahin niini, sa imong gusto nga Virtual Host configuration file nga gusto nimong i-activate ang dynamic Perl o Bash scripts nga adunay UNIX o TCP Sockets ubos sa lain-laing mga lokasyon, pinaagi sa pag-usab sa fastcgi_pass argumento nga pahayag.

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

I-edit ang localhost.conf aron tan-awon sama sa template sa ubos.

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. Human nimo mahuman ang pag-edit sa Nginx localhost.conf, o ang imong espesipikong Virtual Host configuration file, balhin sa imong website default document root path, paghimo niadtong duha ka folder aron ipakita ang imong location statement, ug paghimo og index files para matag lokasyon nga adunay piho nga extension.

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

Paghimo og index.pl nga payl sa ikaduhang lokasyon nga adunay mosunod nga sulod.

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

Idugang kini nga sulud aron makakuha mga variable sa palibot.

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

Dayon paghimo og index.cgi nga payl sa ikatulo nga lokasyon nga adunay mosunod nga sulod.

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

Idugang kini nga sulud aron makakuha mga variable sa palibot.

#!/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. Kon mahuman na ang pag-edit, himoa nga ma-executable ang duha ka files, i-restart ang Nginx server ug siguroa nga ang duha ka Fcgiwrap sockets nagdagan.

# 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

Sunod, i-redirect ang imong lokal nga browser sa pagsunod sa URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Ang resulta kinahanglan nga makita sama sa mga screenshot sa ubos.

8. Kung ang tanan naa sa lugar ug husto nga gi-configure, mahimo ang duha nga Fcgiwrap nga daemon nga awtomatikong magsugod, pagkahuman sa pag-reboot pinaagi sa pag-isyu sa mosunod nga mga sugo (sa kaso nga imong gi-configure ang Nginx nga gamiton ang duha ka CGI sockets).

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

Lakang 3: I-aktibo ang suporta ni Ruby sa Fcgiwrap

9. Kung kinahanglan nimo nga magpadagan ug dinamikong Ruby script sa Nginx FCGI kinahanglan nimo nga i-install ang Ruby interpreter sa Gentoo gamit ang mosunod nga mando.

# emerge --ask ruby

10. Human ma-compile ug ma-install ang package, balhin sa Nginx sites-available ug usba ang localhost.conf file pinaagi sa pagdugang sa mosunod nga mga pahayag sa wala pa ang katapusan nga curly bracket \ } , nga nagpalihok sa suporta sa pagpadagan sa Ruby scripts sa ikaupat nga lokasyon ubos sa default document root path nga gisilbihan sa Nginx localhost.

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

Gamita ang mosunod nga mga direktiba sa 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. Karon, aron masulayan ang configuration paghimo sa ikaupat nga direktoryo ubos sa /var/www/localhost/htdocs nga dalan, paghimo ug executable nga Ruby index script nga adunay .rb extension ug idugang ang mosunod sulod.

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

Ruby index.rb nga pananglitan.

#!/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. Human nimo idugang ang mga permiso sa pagpatuman sa file, i-restart ang Nginx daemon aron magamit ang mga configuration.

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

Ablihi ang imong browser ug navigate sa URL http://localhost/fourth/, nga kinahanglan magpakita kanimo sa mosunod nga sulod.

Mao na kana sa pagkakaron, imong gi-configure ang Nginx aron mag-alagad sa dinamikong Perl, Ruby ug Bash nga mga script sa FastCGI Gateway, apan, hibal-i nga ang pagpadagan niini nga matang sa gihubad nga mga script sa Nginx CGI Gateway mahimong delikado ug magpahamtang og seryoso nga mga risgo sa seguridad sa imong server tungod kay sila modagan gamit ang aktibo nga mga shells ubos sa imong sistema, apan makapalapad sa static barrier nga gipahamtang sa static nga HTML, makadugang sa dinamikong gamit sa imong website.