Wyszukiwanie w witrynie

Instalowanie FcgiWrap i włączanie dynamicznych języków Perl, Ruby i Bash w Gentoo LEMP


Ten poradnik jest ściśle powiązany z poprzednim, poświęconym instalacji LEMP na Gentoo i omawia inne problemy związane z serwerem, takie jak włączanie dynamicznych języków skryptowych, takich jak Perl, Bash lub Ruby, poprzez Fcgiwrap Gateway i edycja plików konfiguracyjnych wirtualnych hostów Nginx do serwuj dynamiczną treść za pomocą skryptów .pl, .rb i .cgi.

Wymagania

  1. Stos LEMP zainstalowany na Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Krok 1: Włącz FCGIWRAP w Gentoo LEMP

Fcgiwrap jest częścią Nginx FastCGI Common Gateway Interface, który przetwarza inne dynamiczne języki skryptowe, takie jak skrypty Perl, Bash lub Ruby, działa poprzez przetwarzanie żądań otrzymanych od Nginx, poprzez TCP lub Unix Sockets w niezależny sposób i zwraca wygenerowany wynik z powrotem do Nginx, który w pewnym momencie prześle odpowiedzi z powrotem do klientów końcowych.

1. Zacznijmy najpierw od zainstalowania procesu FCcgiwrap na Gentoo Linux za pomocą następującego polecenia.

emerge --ask www-misc/fcgiwrap

2. Domyślnie pakiet Fcgiwrap nie udostępnia żadnych skryptów init w Gentoo do zarządzania procesem. Po skompilowaniu i zainstalowaniu pakietów utwórz następujące skrypty init, które pomogą Ci zarządzać procesem Fcgiwrap przy użyciu trzech podejść: albo uruchomienie procesu przy użyciu gniazd domeny Unix, albo przy użyciu lokalnego < b>Gniazda TCP lub korzystanie z obu jednocześnie.

Korzystanie ze skryptu gniazda TCP

Utwórz plik init w ścieżce /etc/init.d/ z następującą zawartością pliku.

nano /etc/init.d/fcgiwrap

Dodaj następującą zawartość pliku.

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

Jak widać plik skryptu zawiera na początku dwie zmienne, odpowiednio ip i port. Zmień te zmienne według własnych potrzeb i upewnij się, że nie nakładają się one na inne usługi w Twoim systemie, szczególnie na zmienną portu – domyślnie jest to 12345 – zmień odpowiednio.

Użycie 0.0.0.0 na zmiennej IP umożliwia procesowi wiązanie się i nasłuchiwanie na dowolnym adresie IP (dostępnym z zewnątrz, jeśli nie masz zapory sieciowej), ale ze względów bezpieczeństwa powinieneś go zmienić, aby nasłuchiwał tylko lokalnie, na 127.0.0.1, chyba że masz inne powody, takie jak zdalna konfiguracja bramy Fcgiwrap na innym węźle w celu zapewnienia wydajności lub równoważenia obciążenia.

3. Po utworzeniu pliku dodaj uprawnienia do wykonywania i zarządzaj procesem demona za pomocą przełączników start, stop lub stanu. Przełącznik stanu wyświetli odpowiednie informacje o gnieździe, takie jak para IP-PORT, której nasłuchuje i czy jakiekolwiek aktywne połączenie zostało zainicjowane. Ponadto, jeśli proces ma aktywne połączenia w stanie TIME_WAIT, nie można go ponownie uruchomić, dopóki wszystkie połączenia TCP nie zostaną zamknięte.

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

Korzystanie ze skryptu gniazda Unix

Jak zaprezentowano wcześniej, Fcgiwrap może działać jednocześnie, korzystając z obu gniazd, dlatego nieznacznie zmieni nazwę drugiego skryptu na fcgiwrap-unix-socket, aby mieć pewność, że oba będą mogły zostać uruchomione i uruchomione w tym samym czasie.

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

Użyj następującej zawartości pliku dla gniazda 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. Ponownie upewnij się, że ten plik jest wykonywalny i użyj tych samych przełączników usług: start, stop lub status. Ustawiłem domyślną ścieżkę dla tego gniazda na ścieżce systemowej /run/fcgiwrap-unix.sock. Rozpocznij proces i zweryfikuj go za pomocą przełącznika status lub wyświetl zawartość katalogu /run i zlokalizuj gniazdo lub użyj ps -a | polecenie 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

Jak wspomniano wcześniej, Fcgiwrap może działać jednocześnie z gniazdami TCP i UNIX, ale jeśli nie potrzebujesz połączeń z bramą zewnętrzną, trzymaj się tylko gniazdu domeny Unix, ponieważ wykorzystuje komunikację międzyprocesową, która jest szybsza niż komunikacja przez Połączenia zwrotne TCP i zużywają mniej narzutu TCP.

Krok 2: Włącz skrypty CGI w Nginx

5. Aby Nginx mógł analizować i uruchamiać skrypty Perla lub Bash poprzez interfejs Fast Common Gateway, hosty wirtualne muszą być skonfigurowane z definicjami Fcgiwrap w instrukcjach ścieżki głównej lub lokalizacji.

Poniżej przedstawiono przykład (localhost), który aktywuje skrypty Perla i CGI na wszystkich plikach umieszczonych w ścieżce root (/var/www/localhost/htdocs/) za pomocą .pl i rozszerzenie .cgi przy użyciu gniazd Fcgiwrap TCP dla domyślnej ścieżki dokumentu głównego, druga lokalizacja przy użyciu Unix Domain Sockets, z plikiem index.pl a trzecia lokalizacja wykorzystuje gniazda TCP z plikiem index.cgi.

Umieść następującą treść lub tylko jej część w żądanym pliku konfiguracyjnym wirtualnego hosta, w którym chcesz aktywować dynamiczne skrypty Perla lub Bash z gniazdami UNIX lub TCP w różnych lokalizacjach, modyfikując instrukcję argumentu fastcgi_pass.

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

Edytuj plik localhost.conf tak, aby wyglądał jak w szablonie poniżej.

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. Po zakończeniu edycji pliku localhost.conf Nginx lub konkretnego pliku konfiguracyjnego wirtualnego hosta przejdź do domyślnej ścieżki głównej dokumentu swojej witryny i utwórz te dwa foldery odzwierciedlające Twoją lokalizację instrukcję i utwórz pliki indeksu dla każdej lokalizacji z jej określonym rozszerzeniem.

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

Utwórz plik index.pl w drugiej lokalizacji z następującą zawartością.

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

Dodaj tę zawartość, aby uzyskać zmienne środowiskowe.

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

Następnie utwórz plik index.cgi w trzeciej lokalizacji z następującą zawartością.

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

Dodaj tę zawartość, aby uzyskać zmienne środowiskowe.

#!/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. Po zakończeniu edycji ustaw oba pliki jako wykonywalne, zrestartuj serwer Nginx i upewnij się, że oba gniazda Fcgiwrap są uruchomione.

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

Następnie przekieruj swoją lokalną przeglądarkę na następujący adres URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Wynik powinien wyglądać jak na poniższych zrzutach ekranu.

8. Jeśli wszystko jest na swoim miejscu i poprawnie skonfigurowane, włącz oba demony Fcgiwrap, aby po ponownym uruchomieniu automatycznie uruchamiały się, wydając następujące polecenia (jeśli skonfigurowałeś Nginx do korzystania z obu gniazd CGI).

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

Krok 3: Aktywuj obsługę Ruby w Fcgiwrap

9. Jeśli chcesz uruchamiać dynamiczne skrypty Ruby na Nginx FCGI, musisz zainstalować interpreter Ruby na Gentoo za pomocą następującego polecenia.

emerge --ask ruby

10. Po skompilowaniu i zainstalowaniu pakietu przejdź do Nginx sites-available i edytuj plik localhost.conf, dodając przed nim następujące instrukcje ostatni nawias klamrowy „ } ”, który aktywuje obsługę uruchamiania skryptów Ruby w czwartej lokalizacji w domyślnej ścieżce głównej dokumentu obsługiwanej przez lokalny host Nginx.

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

Użyj następujących dyrektyw 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. Teraz, aby przetestować konfigurację, utwórz czwarty katalog w ścieżce /var/www/localhost/htdocs, utwórz wykonywalny skrypt indeksu Ruby z .rb b> i dodaj następującą treść.

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

Przykład Ruby indeks.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. Po dodaniu uprawnień do wykonywania pliku zrestartuj demona Nginx, aby zastosować konfiguracje.

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

Otwórz przeglądarkę i przejdź do adresu URL http://localhost/fourth/, który powinien wyświetlić następującą treść.

To wszystko na razie, skonfigurowałeś Nginx do obsługi dynamicznych skryptów Perl, Ruby i Bash na FastCGI Gateway, ale pamiętaj, że uruchamianie tego rodzaju zinterpretowanych skryptów na Nginx CGI Gateway może być niebezpieczne i nakładać poważne ryzyko bezpieczeństwa na twoim serwerze, ponieważ uruchamiany przy użyciu aktywnych powłok w systemie, ale może rozszerzyć statyczną barierę narzuconą przez statyczny kod HTML, dodając dynamiczną funkcjonalność do Twojej witryny.