Nginx et Perl
Par Dju » 07 juillet 2010 (20:20) - Serveur
Allez, encore un billet sur Nginx, que j'utilise et apprécie de plus en plus :D
Celui ci sera consacré à l'appel d'un script perl en mode CGI, ce qu'il ne fait pas nativement, contrairement à apache.
On trouve bien sur la méthode sur le wiki de Nginx mais c'est en anglais et pas expliqué de A à Z.
Pour faire court, on va mettre en place un démon permettant à nginx d'appeler et executer un script perl, comme avec php-cgi.
ici, j'en ai besoin car j'utilise Awstats, mais ayant viré Apache et utilisant uniquement Nginx en serveur http, je ne peux du coup pas lire les stats
On va d'abord avoir besoin de quelques paquets perl pour faire tourner notre demon. :
perl -MCPAN -e shell
install FCGI
install FCGI::ProcManager
On se rend maintenant sur le wiki de Nginx, et on recopie le code du script perl (donc de #!perl à à dernière } ) dans le cadre blanc.
On colle ce code dans le fichier /usr/local/bin/cgiwrap-fcgi.pl puis on le rend executable
cd /usr/local/bin
nano cgiwrap-fcgi.pl
chmod +x ./cgiwrap-fcgi.pl
Ce code représente le démon qui va tourner en permanence; et créer une socket à laquelle nginx va se connecter pour exécuter un script perl.
Il nous faut maintenant un script d'init pour lancer et arrêter ce démon. Pour me simplifier la vie, j'ai repris celui de php-cgi et adapté, vous pouvez le télécharger ici
On l'installe dans /etc/init.d, on le rend exécutable et on fait en sorte qu'il se lance au démarrage :
wget http://blog.crifo.org/public/201007/perl-fcgi.zip
unzip ./perfl-fcgi.zip
rm ./perl-fcgi.zip
mv ./perl-fcgi /etc/init.d
chmod +x /etc/init.d/perl-fcgi
update-rc.d -f perl-fcgi defaults
A présent, il faut créer le fichier /etc/default/perl-fcgi dans lequel on va indiquer quelques options :
# start daemon ?
START=yes
# which user runs the daemon ?
EXEC_AS_USER=www-data
Puis il nous faut créer le dossier dans lequel sera créée la socket, et lui donner les bons droits pour que Nginx puisse y accéder :
cd /var/run/
mkdir nginx
chown www-data ./nginx
on indique à Nginx que faire quand on appelle un script perl.
On édite le fichier correspondant à notre host, généralement dans /etc/nginx/sites-enabled/monsite
Dans la section commençant par "server {", on rajoute ceci
# cgi perl location ~ ^/.*\.pl$ { gzip off; fastcgi_pass unix:/var/run/nginx/cgiwrap-dispatch.sock; fastcgi_index index.cgi; fastcgi_param SCRIPT_FILENAME /var/www/monsite$fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; }
pour ceux qui on awstats, il faut rajouter aussi ceci
location /awstats-icon/ { alias /usr/share/awstats/icon/; }
Enfin, on créé un alias pour accéder aux scripts dans cgi-bin (surtout pour awstats, mais si vous avez des scripts perls directement dans le dossier de votre site, pas besoin )
cd /var/www/monsite
ln -s /usr/lib/cgi-bin ./cgi-bin
Et voila, c'est fini ! :D
On peut donc maintenant lancer le démon perl :
/etc/init.d/perl-fcgi start
ou l'arrêter :
/etc/init.d/perl-fcgi stop
et savoir si il tourne ou non
/etc/init.d/perl-fcgi status
Bonjour,
D'abord Merci pour ce tuto !
J'ai un petit problème:
La commande /etc/init.d/perl-fcgi start ne retourne pas d'erreur cependant le fichier .sock n’apparais pas dans /var/run/nginx.
J'ai pourtant attribué les droits 777 sur le répertoire nginx (pour tester...)
Du coup évidemment, quand je veux contacter www.mondomaine.fr/cgi-bin/awstats.pl j'ai une erreur dans /var/log/nginx/error.log qui me dit que le fichier .sock n'existe pas.
J'ai bien recopié le code perl sur le wiki de nginx et rendu le fichier cgiwrap-fcgi.pl exécutable.
J'ai répondu par défaut aux questions posées avec la commande :
perl -MCPAN -e shell
Auriez vous une idée sur mon problème svp ?
Merci pour l'astuce !
Cela dit, les scripts requis existent déjà sur Gentoo ; il suffit d'installer spawn-fcgi et fcgiwrap. Le manpage fcgiwrap(8) dit presque tout. Voici ma config nginx :
--SNIP--
server {
server_name stats stats.example.com;
listen 80;
root /usr/share/awstats/wwwroot/;
location / {
fastcgi_pass unix:/var/run/fcgiwrap.sock-1;
fastcgi_index awstats.pl;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SCRIPT_NAME /cgi-bin/awstats.pl;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param QUERY_STRING $query_string;
}
}
--SNIP--
et dans /etc/conf.d/spawn-fcgi.cgiwrap, j'ai :
--SNIP--
FCGI_SOCKET=/var/run/fcgiwrap.sock
FCGI_ADDRESS=127.0.0.1
FCGI_PORT=
FCGI_PROGRAM='/usr/sbin/fcgiwrap'
FCGI_CHILDREN=1
FCGI_CHROOT=
FCGI_CHDIR=
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
ALLOWED_ENV="PATH"
--SNIP--
Le tout marche impec', et je peux aller sur http://stats.example.com/?config=ma... pour voir les stats pour maconfig.
salut
merci pour le retour, c'est toujours bon à savoir pour une prochaine fois
Fil des commentaires de ce billet
URL de rétrolien : https://blog.crifo.org/trackback/63