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 au serveur tels que l’activation de langages de script dynamiques comme Perl ou Bash ou Ruby via la passerelle Fcgiwrap, et l’édition des fichiers de configuration des hôtes virtuels Nginx pour servir du contenu dynamique à l’aide de scripts .pl, .rb et .cgi.
Exigences
- 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 l’interface de passerelle commune Nginx FastCGI qui traite d’autres langages de script dynamiques, comme les scripts Perl, Bash ou Ruby, fonctionne en traitant les requêtes reçues de Nginx, via des sockets TCP ou Unix, 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/fcgiwrap2. Par défaut, le paquet Fcgiwrap ne fournit aucun script d’initialisation sur Gentoo pour gérer le processus. Une fois les paquets compilés et installés, créez les scripts d’initialisation suivants qui vous aident à gérer le processus Fcgiwrap en utilisant trois approches : soit en lançant le processus en utilisant des sockets de domaine Unix, soit en utilisant des sockets TCP locaux, soit en utilisant les deux en même temps.
Utilisation du script TCP Socket
Créez un fichier d’initialisation sur le chemin /etc/init.d/ avec le contenu de fichier suivant.
# nano /etc/init.d/fcgiwrapAjoutez 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 de script contient deux variables au début, respectivement ip et port. Modifiez ces variables en fonction de vos propres besoins et assurez-vous qu’elles ne chevauchent pas d’autres services sur votre système, en particulier la variable de port - la valeur par défaut est 12345 - modifiez 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 devriez la changer pour écouter uniquement localement, sur 127.0.0.1, à moins que vous n’ayez d’autres raisons comme la configuration à distance de la passerelle Fcgiwrap sur un nœud différent pour les performances ou l’équilibrage de charge.
3. Une fois le fichier créé, ajoutez des autorisations d’exécution et gérez le processus du 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 le socket, telles que la paire IP-PORT, il écoute et si une connexion active a été initialisée. De plus, si le processus a des connexions actives dans TIME_WAIT état, 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 statusUtilisation d’un script de socket Unix
Comme présenté précédemment, Fcgiwrap peut fonctionner simultanément en utilisant les deux sockets, donc changera légèrement le nom du deuxième script en fcgiwrap-unix-socket, pour s’assurer que les deux peuvent être démarrés et exécutés en même temps.
# nano /etc/init.d/fcgiwrap-unix-socketUtilisez 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 : démarrer, arrêter ou état. J’ai défini le chemin par défaut pour ce socket sur le chemin système /run/fcgiwrap-unix.sock. Démarrez le processus et vérifiez-le à l’aide du commutateur d’état ou du contenu du répertoire list /run et localisez le socket, ou utilisez la commande 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 fcgiwrapComme mentionné précédemment, Fcgiwrap peut fonctionner avec des sockets TCP et UNIX simultanés, mais si vous n’avez pas besoin de connexions de passerelle externe, tenez-vous-en au socket de domaine Unix uniquement, car il utilise la communication interprocessus, qui est plus rapide que la communication via les connexions de bouclage TCP, et utilise moins de surcharge TCP.
Étape 2 : Activer les scripts CGI sur Nginx
5. Pour que Nginx puisse analyser et exécuter des scripts Perl ou Bash via l’interface Fast Common Gateway, les hôtes virtuels doivent être configurés avec des définitions Fcgiwrap sur les instructions de chemin d’accès racine ou 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 .cgi extension en utilisant Fcgiwrap TCP Sockets pour le chemin de document racine par défaut, le deuxième emplacement en utilisant Unix Domain Sockets, 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 une partie de celui-ci, dans le fichier de configuration de l’hôte virtuel souhaité pour lequel vous souhaitez activer des scripts Perl ou Bash dynamiques avec des sockets UNIX ou TCP sous différents emplacements, en modifiant fastcgi_pass instruction d’argument.
# nano /etc/nginx/sites-available/localhost.confModifiez 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. Une fois que vous avez terminé de modifier Nginx localhost.conf, ou votre fichier de configuration d’hôte virtuel spécifique, accédez au chemin d’accès racine du document par défaut de votre site Web, créez ces deux dossiers pour refléter votre déclaration d’emplacement et créez des fichiers d’index pour chaque emplacement avec son extension spécifique.
# cd /var/www/localhost/htdocs
mkdir second thirdCréez index.pl fichier sur le deuxième emplacement avec le contenu suivant.
# nano /var/www/localhost/htdocs/second/index.plAjoutez ce contenu pour obtenir des 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 index.cgi fichier sur un troisième emplacement avec le contenu suivant.
# nano /var/www/localhost/htdocs/third/index.cgiAjoutez ce contenu pour obtenir des 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>
EOF7. 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 startEnsuite, 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 les deux démons Fcgiwrap pour qu’ils démarrent automatiquement, 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 avez besoin d’exécuter des scripts Ruby dynamiques sur Nginx FCGI, vous devez installer l’interpréteur Ruby sur Gentoo avec la commande suivante.
# emerge --ask ruby10. Une fois le paquet compilé et installé, passez à Nginx sites-available et éditez le fichier localhost.conf en ajoutant les instructions suivantes avant la dernière accolade " } « , ce 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.confUtilisez 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 l’extension .rb et ajoutez le contenu suivant.
# mkdir /var/www/localhost/htdocs/fourth
nano /var/www/localhost/htdocs/fourth/index.rbExemple de 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é des 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 restartOuvrez votre navigateur et naviguez jusqu’à 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é à votre serveur car ils fonctionnent en utilisant des shells actifs sous votre système, mais peuvent étendre la barrière statique imposée par le HTML statique, Ajouter des fonctionnalités dynamiques à votre site Web.












