Vyhledávání na webu

Instalace FcgiWrap a povolení dynamických jazyků Perl, Ruby a Bash na Gentoo LEMP


Tento výukový program úzce souvisí s předchozím o instalaci LEMP na Gentoo a zabývá se dalšími rozšířenými problémy serveru, jako je povolení dynamických skriptovacích jazyků jako Perl nebo Bash nebo Ruby prostřednictvím Fcgiwrap Gateway a úprava konfiguračních souborů Nginx Virtual Hosts poskytovat dynamický obsah pomocí skriptů .pl, .rb a .cgi.

Požadavky

  1. Zásobník LEMP nainstalovaný na Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Krok 1: Povolte FCGIWRAP na Gentoo LEMP

Fcgiwrap je součástí Nginx FastCGI Common Gateway Interface, které zpracovává další dynamické skriptovací jazyky, jako jsou skripty Perl nebo Bash nebo Ruby, funguje na základě zpracování požadavků přijatých od Nginx, prostřednictvím TCP nebo Unix Sockets, nezávislým způsobem a vrátí vytvořený výsledek zpět do Nginx, který v termínu přepošle odpovědi zpět koncovým klientům.

1. Nejprve začněme instalací procesu FCcgiwrap na Gentoo Linux pomocí následujícího příkazu.

emerge --ask www-misc/fcgiwrap

2. Balíček Fcgiwrap standardně neposkytuje žádné inicializační skripty na Gentoo pro správu procesu. Po zkompilování a instalaci balíčků vytvořte následující init skripty, které vám pomohou spravovat proces Fcgiwrap třemi způsoby: buď spuštěním procesu pomocí Unix Domain Sockets nebo pomocí místního < b>TCP zásuvky nebo pomocí obou současně.

Použití TCP Socket Script

Vytvořte init soubor na cestě /etc/init.d/ s následujícím obsahem souboru.

nano /etc/init.d/fcgiwrap

Přidejte následující obsah souboru.

#!/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 můžete vidět, soubor skriptu obsahuje na začátku dvě proměnné, a to ip a port. Změňte tyto proměnné podle vlastních potřeb a ujistěte se, že se nepřekrývají s jinými službami ve vašem systému, zejména proměnnou port – zde je výchozí 12345 – podle toho změňte.

Použití 0.0.0.0 na proměnnou IP umožňuje procesu svázat se a naslouchat na libovolné IP (přístupné zvenčí, pokud nemáte firewall), ale z bezpečnostních důvodů byste ji měli změnit tak, aby naslouchala pouze lokálně, na 127.0.0.1, pokud nemáte jiné důvody, jako je vzdálené nastavení brány Fcgiwrap na jiném uzlu kvůli výkonu nebo vyrovnávání zátěže.

3. Po vytvoření souboru přidejte oprávnění ke spuštění a spravujte proces démona pomocí přepínačů spuštění, zastavení nebo stavu. Přepínač stavu vám zobrazí relevantní informace o zásuvce, jako je pár IP-PORT, který naslouchá, a zda je inicializováno nějaké aktivní připojení. Pokud má proces aktivní připojení ve stavu TIME_WAIT, nemůžete jej restartovat, dokud se neukončí všechna připojení TCP.

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

Použití Unix Socket Script

Jak již bylo uvedeno dříve, Fcgiwrap může běžet současně pomocí obou soketů, takže se mírně změní název druhého skriptu na fcgiwrap-unix-socket, aby bylo zajištěno, že oba lze spustit a spustit ve stejnou dobu.

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

Pro soket UNIX použijte následující obsah souboru.

#!/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. Znovu se ujistěte, že tento soubor je spustitelný a používá stejné přepínače služeb: start, stop nebo stav. Nastavil jsem výchozí cestu pro tento soket na systémové cestě /run/fcgiwrap-unix.sock. Spusťte proces a ověřte jej pomocí přepínače status nebo seznamu obsahu adresáře /run a vyhledejte soket, nebo použijte ps -a | příkaz 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 již bylo zmíněno, Fcgiwrap může běžet se sokety TCP i UNIX současně, ale pokud nepotřebujete připojení externí brány, držte se pouze Unix Domain Socket, protože používá meziprocesovou komunikaci, která je rychlejší než komunikace přes TCP spojení zpětné smyčky a využívá méně TCP režii.

Krok 2: Povolte skripty CGI na Nginx

5. Aby Nginx mohl analyzovat a spouštět skripty Perl nebo Bash prostřednictvím rozhraní Fast Common Gateway, musí být virtuální hostitelé nakonfigurováni s definicemi Fcgiwrap v příkazech kořenové cesty nebo umístění.

Níže je uveden příklad (localhost), který aktivuje skripty Perl a CGI na všech souborech umístěných v kořenové cestě (/var/www/localhost/htdocs/) s .pl a .cgi pomocí Fcgiwrap TCP Sockets pro výchozí kořenovou cestu dokumentu, druhé umístění pomocí Unix Domain Sockets, se souborem index.pl a třetí umístění používá TCP sockety se souborem index.cgi.

Umístěte následující obsah nebo jen některé jeho části do požadovaného konfiguračního souboru virtuálního hostitele, ve kterém chcete aktivovat dynamické skripty Perl nebo Bash s UNIX nebo TCP Sockets, do různých umístění, úpravou příkazu argumentu fastcgi_pass.

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

Upravte localhost.conf tak, aby vypadal jako v šabloně níže.

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 dokončení úprav Nginx localhost.conf nebo vašeho konkrétního konfiguračního souboru virtuálního hostitele se přesuňte na výchozí kořenovou cestu dokumentu vašeho webu, vytvořte tyto dvě složky, aby odpovídaly vašemu umístění a vytvořte indexové soubory pro každé umístění s jeho specifickou příponou.

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

Vytvořte soubor index.pl na druhém místě s následujícím obsahem.

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

Přidejte tento obsah, abyste získali proměnné prostředí.

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

Poté vytvořte soubor index.cgi na třetím místě s následujícím obsahem.

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

Přidejte tento obsah, abyste získali proměnné prostředí.

#!/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 dokončení úprav udělejte oba soubory spustitelnými, restartujte server Nginx a ujistěte se, že jsou spuštěny oba sokety 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

Dále přesměrujte svůj místní prohlížeč na následující URL.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Výsledek by měl vypadat jako na níže uvedených snímcích obrazovky.

8. Pokud je vše na svém místě a správně nakonfigurováno, povolte automatické spouštění obou démonů Fcgiwrap po restartu vydáním následujících příkazů (v případě, že jste nakonfigurovali Nginx tak, aby používal oba sokety CGI).

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

Krok 3: Aktivujte podporu Ruby na Fcgiwrap

9. Pokud potřebujete spouštět dynamické skripty Ruby na Nginx FCGI, musíte nainstalovat interpret Ruby na Gentoo pomocí následujícího příkazu.

emerge --ask ruby

10. Po zkompilování a instalaci balíčku přejděte na Nginx sites-available a upravte soubor localhost.conf přidáním následujících příkazů před poslední složená závorka “ } “, která aktivuje podporu pro spouštění skriptů Ruby na čtvrtém místě pod výchozí kořenovou cestou dokumentu obsluhovanou Nginx localhost.

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

Použijte následující direktivy 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. Nyní, abyste otestovali konfiguraci, vytvořte čtvrtý adresář v cestě /var/www/localhost/htdocs, vytvořte spustitelný indexový skript Ruby s .rb rozšíření a přidejte následující obsah.

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

Příklad 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. Po přidání oprávnění ke spuštění do souboru restartujte démona Nginx, abyste použili konfigurace.

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

Otevřete prohlížeč a přejděte na adresu URL http://localhost/fourth/, která by vám měla nabídnout následující obsah.

To je pro tuto chvíli vše, nakonfigurovali jste Nginx tak, aby obsluhoval dynamické skripty Perl, Ruby a Bash na FastCGI Gateway, ale uvědomte si, že spouštění tohoto druhu interpretovaných skriptů na Nginx CGI Gateway může být nebezpečné a může způsobit vážné bezpečnostní riziko pro váš server, protože spustit pomocí aktivních shellů pod vaším systémem, ale může rozšířit statickou bariéru způsobenou statickým HTML a přidat dynamickou funkčnost na váš web.