Recherche de site Web

Installation de FcgiWrap et activation des langages dynamiques Perl, Ruby et Bash sur Gentoo LEMP


Ce tutoriel est strictement lié au précédent sur l'installation de LEMP sur Gentoo et traite d'autres problèmes étendus du serveur tels que l'activation de langages de script dynamiques comme Perl ou Bash ou Ruby via la Fcgiwrap Gateway et la modification des fichiers de configuration des hôtes virtuels Nginx pour diffuser du contenu dynamique à l'aide des scripts .pl, .rb et .cgi.

Exigences

  1. Pile LEMP installée sur Gentoo – https://linux-console.net/install-lemp-in-gentoo-linux/

Étape 1 : Activer FCGIWRAP sur Gentoo LEMP

Fcgiwrap fait partie de Nginx FastCGI Common Gateway Interface qui traite d'autres langages de script dynamiques, comme les scripts Perl ou Bash ou Ruby, fonctionne en traitant les requêtes reçues de Nginx, via TCP ou Unix Sockets, de manière indépendante, et renvoie le résultat produit à Nginx, qui, à terme, transmettra les réponses aux clients finaux.

1. Commençons par installer le processus FCcgiwrap sur Gentoo Linux à l'aide de la commande suivante.

emerge --ask www-misc/fcgiwrap

2. Par défaut, le package Fcgiwrap ne fournit aucun script init sur Gentoo pour gérer le processus. Une fois les packages compilés et installés, créez les scripts init suivants qui vous aident à gérer le processus Fcgiwrap en utilisant trois approches : soit en lançant le processus à l'aide de Sockets de domaine Unix, soit en utilisant < local b>Sockets TCP ou en utilisant les deux en même temps.

Utilisation du script de socket TCP

Créez un fichier init sur le chemin /etc/init.d/ avec le contenu de fichier suivant.

nano /etc/init.d/fcgiwrap

Ajoutez le contenu du fichier suivant.

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

Comme vous pouvez le voir, le fichier script contient deux variables au début, respectivement ip et port. Modifiez ces variables selon vos propres besoins et assurez-vous qu'elles ne se chevauchent pas avec d'autres services de votre système, en particulier la variable de port – la valeur par défaut ici est 12345 – modifiez-les en conséquence.

L'utilisation de 0.0.0.0 sur la variable IP permet au processus de se lier et d'écouter sur n'importe quelle IP (accessible à l'extérieur si vous n'avez pas de pare-feu), mais pour des raisons de sécurité, vous devez le modifier pour écouter localement uniquement, sur 127.0.0.1, sauf si vous avez d'autres raisons, comme configurer à distance la passerelle Fcgiwrap sur un nœud différent pour des raisons de performances ou d'équilibrage de charge.

3. Une fois le fichier créé, ajoutez les autorisations d'exécution et gérez le processus démon à l'aide des commutateurs de démarrage, d'arrêt ou d'état. Le commutateur d'état vous montrera des informations pertinentes sur la socket telles que la paire IP-PORT qu'elle écoute et si une connexion active a été initialisée. De plus, si le processus a des connexions actives dans l'état TIME_WAIT, vous ne pouvez pas le redémarrer tant que toutes les connexions TCP ne sont pas fermées.

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

Utilisation du script Socket Unix

Comme présenté précédemment, Fcgiwrap peut s'exécuter simultanément en utilisant les deux sockets, il modifiera donc légèrement le nom du deuxième script en fcgiwrap-unix-socket, pour garantir que les deux peuvent être démarrés et exécutés en même temps.

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

Utilisez le contenu du fichier suivant pour le 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. Assurez-vous à nouveau que ce fichier est exécutable et utilisez les mêmes commutateurs de service : start, stop ou status. J'ai défini le chemin par défaut de ce socket sur le chemin système /run/fcgiwrap-unix.sock. Démarrez le processus et vérifiez-le à l'aide du commutateur status ou de la liste du contenu du répertoire /run et localisez le socket, ou utilisez ps -a | commande 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

Comme mentionné précédemment, Fcgiwrap peut fonctionner simultanément avec les sockets TCP et UNIX, mais si vous n'avez pas besoin de connexions de passerelle externes, restez uniquement sur Socket de domaine Unix, car il utilise la communication interprocessus, qui est plus rapide que la communication via Connexions de bouclage TCP et utilise moins de surcharge TCP.

Étape 2 : Activer les scripts CGI sur Nginx

5. Pour que Nginx analyse et exécute des scripts Perl ou Bash via Fast Common Gateway Interface, les hôtes virtuels doivent être configurés avec les définitions Fcgiwrap sur le chemin racine ou les instructions d'emplacement.

Un exemple, est présenté ci-dessous (localhost), qui active les scripts Perl et CGI sur tous les fichiers placés dans le chemin racine (/var/www/localhost/htdocs/) avec .pl et l'extension .cgi utilisant les sockets TCP Fcgiwrap pour le chemin du document racine par défaut, le deuxième emplacement utilisant les Sockets de domaine Unix, avec un fichier index.pl et le troisième emplacement utilise des sockets TCP avec un fichier index.cgi.

Placez le contenu suivant, ou seulement certaines parties de celui-ci, dans le fichier de configuration de votre hôte virtuel souhaité dans lequel vous souhaitez activer des scripts Perl ou Bash dynamiques avec des sockets UNIX ou TCP sous différents emplacements, en modifiant l'instruction d'argument fastcgi_pass.

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

Modifiez localhost.conf pour qu'il ressemble au modèle ci-dessous.

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. Après avoir terminé de modifier Nginx localhost.conf ou votre fichier de configuration d'hôte virtuel spécifique, accédez au chemin racine du document par défaut de votre site Web, créez ces deux dossiers pour refléter votre emplacement. et créez des fichiers d'index pour chaque emplacement avec son extension spécifique.

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

Créez le fichier index.pl au deuxième emplacement avec le contenu suivant.

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

Ajoutez ce contenu pour obtenir les variables d'environnement.

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

Créez ensuite le fichier index.cgi sur un troisième emplacement avec le contenu suivant.

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

Ajoutez ce contenu pour obtenir les variables d'environnement.

#!/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. Une fois l'édition terminée, rendez les deux fichiers exécutables, redémarrez le serveur Nginx et assurez-vous que les deux sockets Fcgiwrap sont en cours d'exécution.

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

Ensuite, redirigez votre navigateur local sur l'URL suivante.

http://localhost 

http://localhost/second/ 

http://localhost/third/

Le résultat devrait apparaître comme sur les captures d'écran ci-dessous.

8. Si tout est en place et correctement configuré, activez le démarrage automatique des deux démons Fcgiwrap après le redémarrage en exécutant les commandes suivantes (au cas où vous auriez configuré Nginx pour utiliser les deux sockets CGI).

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

Étape 3 : Activer le support Ruby sur Fcgiwrap

9. Si vous devez exécuter des scripts Ruby dynamiques sur Nginx FCGI, vous devez installer l'interpréteur Ruby sur Gentoo avec la commande suivante.

emerge --ask ruby

10. Une fois le package compilé et installé, accédez aux sites-available de Nginx et modifiez le fichier localhost.conf en ajoutant les instructions suivantes avant dernière accolade « } », qui active la prise en charge de l'exécution de scripts Ruby sur un quatrième emplacement sous le chemin racine du document par défaut servi par Nginx localhost.

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

Utilisez les directives Nginx suivantes.

## 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. Maintenant, pour tester la configuration, créez le quatrième répertoire sous le chemin /var/www/localhost/htdocs, créez un script d'index Ruby exécutable avec .rb extension et ajoutez le contenu suivant.

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

Exemple 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. Après avoir ajouté les autorisations d'exécution sur le fichier, redémarrez le démon Nginx pour appliquer les configurations.

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

Ouvrez votre navigateur et accédez à l'URL http://localhost/fourth/, qui devrait vous présenter le contenu suivant.

C'est tout pour l'instant, vous avez configuré Nginx pour servir des scripts dynamiques Perl, Ruby et Bash sur FastCGI Gateway, mais sachez que l'exécution de ce type de scripts interprétés sur Nginx CGI Gateway peut être dangereuse et imposer de sérieux risques de sécurité sur votre serveur car ils s'exécute à l'aide de shells actifs sous votre système, mais peut étendre la barrière statique imposée par le HTML statique, ajoutant ainsi des fonctionnalités dynamiques à votre site Web.