Εγκατάσταση FcgiWrap και ενεργοποίηση δυναμικών γλωσσών Perl, Ruby και Bash στο Gentoo LEMP


Αυτό το σεμινάριο σχετίζεται αυστηρά με το προηγούμενο στην εγκατάσταση LEMP στο Gentoo και αντιμετωπίζει άλλα ζητήματα εκτεταμένων διακομιστών, όπως η ενεργοποίηση γλωσσών δυναμικής δέσμης ενεργειών όπως η Perl ή η Bash ή η Ruby μέσω του Fcgiwrap Gateway και η επεξεργασία αρχείων διαμόρφωσης Nginx Virtual Hosts σε προβάλετε δυναμικό περιεχόμενο χρησιμοποιώντας σενάρια .pl, .rb και .cgi.

Απαιτήσεις

  1. Η στοίβα LEMP είναι εγκατεστημένη στο Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Βήμα 1: Ενεργοποιήστε το FCGIWRAP στο Gentoo LEMP

Το Fcgiwrap είναι μέρος της Nginx FastCGI Common Gateway Interface η οποία επεξεργάζεται άλλες δυναμικές γλώσσες δέσμης ενεργειών, όπως σενάρια Perl ή Bash ή Ruby, και λειτουργεί με την επεξεργασία αιτημάτων που λαμβάνονται από το Nginx, μέσω TCP ή Τα Unix Sockets, με ανεξάρτητο τρόπο και επιστρέφουν το παραγόμενο αποτέλεσμα πίσω στο Nginx, το οποίο, σε όρους, θα προωθήσει τις απαντήσεις πίσω στους τελικούς πελάτες.

1. Ας ξεκινήσουμε πρώτα εγκαθιστώντας τη διαδικασία FCcgiwrap στο Gentoo Linux χρησιμοποιώντας την ακόλουθη εντολή.

# emerge --ask www-misc/fcgiwrap

2. Από προεπιλογή το πακέτο Fcgiwrap δεν παρέχει σενάρια init στο Gentoo για τη διαχείριση της διαδικασίας. Αφού μεταγλωττιστούν και εγκατασταθούν τα πακέτα, δημιουργήστε τα ακόλουθα σενάρια init που σας βοηθούν να διαχειριστείτε τη διαδικασία Fcgiwrap χρησιμοποιώντας τρεις προσεγγίσεις: είτε εκκινώντας τη διαδικασία χρησιμοποιώντας Υποδοχές τομέα Unix είτε χρησιμοποιώντας τοπική < b>TCP Sockets ή να χρησιμοποιείτε και τα δύο ταυτόχρονα.

Χρήση δέσμης ενεργειών υποδοχής TCP

Δημιουργήστε ένα αρχείο init στη διαδρομή /etc/init.d/ με το ακόλουθο περιεχόμενο αρχείου.

# nano /etc/init.d/fcgiwrap

Προσθέστε το ακόλουθο περιεχόμενο αρχείου.

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

Όπως μπορείτε να δείτε, το αρχείο σεναρίου περιέχει δύο μεταβλητές στην αρχή, αντίστοιχα ip και port. Αλλάξτε αυτές τις μεταβλητές με τις δικές σας ανάγκες και βεβαιωθείτε ότι δεν αλληλεπικαλύπτονται με άλλες υπηρεσίες στο σύστημά σας, ειδικά τη μεταβλητή θύρας – η προεπιλογή εδώ είναι 12345 – αλλάξτε ανάλογα.

Η χρήση της μεταβλητής 0.0.0.0 στη μεταβλητή IP επιτρέπει στη διαδικασία σύνδεσης και ακρόασης σε οποιαδήποτε IP (εκτός προσβάσιμη εάν δεν έχετε τείχος προστασίας ), αλλά για λόγους ασφαλείας θα πρέπει να την αλλάξετε ώστε να ακούει μόνο τοπικά, στο 127.0.0.1, εκτός εάν έχετε άλλους λόγους, όπως η απομακρυσμένη ρύθμιση της πύλης Fcgiwrap σε διαφορετικό κόμβο για απόδοση ή εξισορρόπηση φορτίου.

3. Αφού δημιουργηθεί το αρχείο, προσαρτήστε δικαιώματα εκτέλεσης και διαχειριστείτε τη διαδικασία δαίμονα χρησιμοποιώντας διακόπτες έναρξης, διακοπής ή κατάστασης. Ο διακόπτης κατάστασης θα εμφανίσει σχετικές πληροφορίες υποδοχής, όπως το ζεύγος IP-PORT που ακούει και εάν έχει αρχικοποιηθεί κάποια ενεργή σύνδεση. Επίσης, εάν η διαδικασία έχει ενεργές συνδέσεις σε κατάσταση TIME_WAIT, δεν μπορείτε να την επανεκκινήσετε μέχρι να κλείσουν όλες οι συνδέσεις TCP.

# chmod +x /etc/init.d/fcgiwrap
# service start fcgiwrap
# /etc/init.d/fcgiwrap status
Χρησιμοποιώντας Unix Socket Script

Όπως παρουσιάστηκε νωρίτερα, το Fcgiwrap μπορεί να εκτελείται ταυτόχρονα χρησιμοποιώντας και τις δύο υποδοχές, επομένως θα αλλάξει ελαφρώς το όνομα του δεύτερου σεναρίου σε fcgiwrap-unix-socket, για να διασφαλιστεί ότι και οι δύο μπορούν να ξεκινήσουν και να εκτελεστούν την ίδια στιγμή.

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

Χρησιμοποιήστε το ακόλουθο περιεχόμενο αρχείου για την υποδοχή UNIX.

#!/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. Βεβαιωθείτε ξανά ότι αυτό το αρχείο είναι εκτελέσιμο και χρησιμοποιήστε τους ίδιους διακόπτες υπηρεσίας: start, stop ή status. Έχω ορίσει την προεπιλεγμένη διαδρομή για αυτήν την υποδοχή στη διαδρομή συστήματος /run/fcgiwrap-unix.sock. Ξεκινήστε τη διαδικασία και επαληθεύστε την χρησιμοποιώντας διακόπτη status ή λίστα περιεχομένου καταλόγου /run και εντοπίστε την υποδοχή ή χρησιμοποιήστε το ps -a | εντολή 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

Όπως αναφέρθηκε προηγουμένως, το Fcgiwrap μπορεί να τρέξει και με τις δύο υποδοχές TCP και UNIX ταυτόχρονα, αλλά αν δεν χρειάζεστε συνδέσεις εξωτερικής πύλης, επιμείνετε μόνο στο Unix Domain Socket, επειδή χρησιμοποιεί επικοινωνία μεταξύ διεργασιών, η οποία είναι ταχύτερη από την επικοινωνία. TCP loopback συνδέσεις και χρησιμοποιεί λιγότερη επιβάρυνση TCP.

Βήμα 2: Ενεργοποιήστε τα σενάρια CGI στο Nginx

5. Για να μπορεί το Nginx να αναλύει και να εκτελεί σενάρια Perl ή Bash μέσω της Γρήγορης κοινής διεπαφής πύλης, οι εικονικοί κεντρικοί υπολογιστές πρέπει να ρυθμιστούν με ορισμούς Fcgiwrap στις δηλώσεις διαδρομής ρίζας ή τοποθεσίας.

Παρακάτω παρουσιάζεται ένα παράδειγμα (localhost), το οποίο ενεργοποιεί τα σενάρια Perl και CGI σε όλα τα αρχεία που βρίσκονται στη διαδρομή ρίζας (/var/www/localhost/htdocs/) με .pl και .cgi επέκταση χρησιμοποιώντας Fcgiwrap TCP Sockets για την προεπιλεγμένη διαδρομή του ριζικού εγγράφου, η δεύτερη τοποθεσία χρησιμοποιώντας Υποδοχές τομέα Unix, με αρχείο index.pl και η τρίτη τοποθεσία χρησιμοποιεί υποδοχές TCP με αρχείο index.cgi.

Τοποθετήστε το ακόλουθο περιεχόμενο, ή μόνο ορισμένα μέρη του, στο επιθυμητό αρχείο διαμόρφωσης Virtual Host που θέλετε να ενεργοποιήσετε δυναμικά σενάρια Perl ή Bash με UNIX ή TCP Sockets σε διαφορετικές τοποθεσίες, τροποποιώντας τη δήλωση ορίσματος fastcgi_pass.

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

Επεξεργαστείτε το localhost.conf ώστε να μοιάζει με το παρακάτω πρότυπο.

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. Αφού ολοκληρώσετε την επεξεργασία του Nginx localhost.conf ή του συγκεκριμένου αρχείου διαμόρφωσης Virtual Host, μετακινηθείτε στην προεπιλεγμένη ρίζα του εγγράφου του ιστότοπού σας, δημιουργήστε αυτούς τους δύο φακέλους για να αντικατοπτρίζουν την τοποθεσία σας δήλωση και δημιουργήστε αρχεία ευρετηρίου για κάθε τοποθεσία με τη συγκεκριμένη επέκτασή της.

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

Δημιουργήστε αρχείο index.pl στη δεύτερη θέση με το ακόλουθο περιεχόμενο.

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

Προσθέστε αυτό το περιεχόμενο για να λάβετε μεταβλητές περιβάλλοντος.

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

Στη συνέχεια, δημιουργήστε το αρχείο index.cgi σε τρίτη θέση με το ακόλουθο περιεχόμενο.

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

Προσθέστε αυτό το περιεχόμενο για να λάβετε μεταβλητές περιβάλλοντος.

#!/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. Όταν ολοκληρώσετε την επεξεργασία, κάντε εκτελέσιμα και τα δύο αρχεία, επανεκκινήστε τον διακομιστή Nginx και βεβαιωθείτε ότι εκτελούνται και οι δύο υποδοχές 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

Στη συνέχεια, ανακατευθύνετε το τοπικό σας πρόγραμμα περιήγησης στην παρακάτω διεύθυνση URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Το αποτέλεσμα θα πρέπει να εμφανίζεται όπως στα παρακάτω στιγμιότυπα οθόνης.

8. Εάν όλα είναι στη θέση τους και έχουν ρυθμιστεί σωστά, ενεργοποιήστε και τους δύο δαίμονες Fcgiwrap να ξεκινήσουν αυτόματα, μετά την επανεκκίνηση, εκδίδοντας τις ακόλουθες εντολές (σε περίπτωση που έχετε ρυθμίσει το Nginx να χρησιμοποιεί και τις δύο υποδοχές CGI).

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

Βήμα 3: Ενεργοποιήστε την υποστήριξη Ruby στο Fcgiwrap

9. Εάν χρειάζεται να εκτελέσετε δυναμικά σενάρια Ruby στο Nginx FCGI, πρέπει να εγκαταστήσετε τον διερμηνέα Ruby στο Gentoo με την ακόλουθη εντολή.

# emerge --ask ruby

10. Αφού μεταγλωττιστεί και εγκατασταθεί το πακέτο, μεταβείτε στο Nginx sites-available και επεξεργαστείτε το αρχείο localhost.conf προσθέτοντας τις παρακάτω δηλώσεις πριν τελευταία αγκύλη \ } ”, η οποία ενεργοποιεί την υποστήριξη για την εκτέλεση σεναρίων Ruby σε μια τέταρτη θέση κάτω από την προεπιλεγμένη διαδρομή ρίζας του εγγράφου που εξυπηρετείται από το Nginx localhost.

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

Χρησιμοποιήστε τις ακόλουθες οδηγίες 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. Τώρα, για να δοκιμάσετε τη διαμόρφωση, δημιουργήστε τον τέταρτο κατάλογο στη διαδρομή /var/www/localhost/htdocs, δημιουργήστε ένα εκτελέσιμο σενάριο ευρετηρίου Ruby με .rb επέκταση και προσθέστε το ακόλουθο περιεχόμενο.

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

Παράδειγμα 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. Αφού προσθέσετε δικαιώματα εκτέλεσης στο αρχείο, επανεκκινήστε το Nginx daemon για να εφαρμόσετε διαμορφώσεις.

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

Ανοίξτε το πρόγραμμα περιήγησής σας και μεταβείτε στη διεύθυνση URL http://localhost/fourth/, η οποία θα σας παρουσιάσει το ακόλουθο περιεχόμενο.

Αυτό είναι προς το παρόν, έχετε ρυθμίσει το Nginx να εξυπηρετεί δυναμικά σενάρια Perl, Ruby και Bash στο FastCGI Gateway, αλλά, να γνωρίζετε ότι η εκτέλεση αυτού του είδους ερμηνευμένων σεναρίων στο Nginx CGI Gateway μπορεί να είναι επικίνδυνη και να επιβάλλει σοβαρούς κινδύνους για την ασφάλεια του διακομιστή σας, επειδή εκτελείται χρησιμοποιώντας ενεργά κελύφη κάτω από το σύστημά σας, αλλά μπορεί να επεκτείνει το στατικό φράγμα που επιβάλλεται από το στατικό HTML, προσθέτοντας δυναμική λειτουργικότητα στον ιστότοπό σας.