Table des matières
Voyons tout dabord comment installer perlbrew et cpanm pour disposer
d'un perl et de modules indépendants de ceux du système. Ce 'Perl' sera
accessible pour 'www-data', c'est à dire l'utilisateur avec lequel le
serveur Web (Apache, Nginx, ...) est lancé. Perlbrew fonctionne à
merveille avec le bash mais pas sous dash qui est le shell par défaut de
l'utilisateur www-data. Il est donc nécessaire de le changer en remplacant
/bin/sh par /bin/bash dans le fichier /etc/password
.
su - www-data
echo $SHELL
/bin/bash
[/lang]
curl -kL http://install.perlbrew.pl | bash
echo 'source ~/perl5/perlbrew/etc/bashrc' >> .profile
. .profile
[/lang]
Perlbrew permet l'installation de nombreuses versions de Perl :
$ perlbrew available
perl-5.19.0
perl-5.18.0
perl-5.16.3
perl-5.14.4
perl-5.12.5
perl-5.10.1
perl-5.8.9
perl-5.6.2
perl5.005_04
perl5.004_05
perl5.003_07
[/lang]
Je choisis d'installer la version 5.16 threadé :
perlbrew install perl-5.16.3 -Dusethreads --as perl-5.16.3_WITH_THREADS
[/lang]
perlbrew list
* perl-5.16.3_WITH_THREADS
perlbrew switch perl-5.16.3_WITH_THREADS
[/lang]
OK nous utiliserons maintenant non pas le Perl du système mais bien celui sous lequel nous venons de basculer.
perl -v
This is perl 5, version 16, subversion 3 (v5.16.3) built for x86_64-linux-thread-multi
[/lang]
App:cpanminus va nous permettre d'installer très simplement les modules pour notre Perl spécifique. Par défaut ces derniers seront stockés dans ~/perl5 c'est à dire /var/www/perl5 pour l'utilisateur www-data.
curl -L http://cpanmin.us | perl - App::cpanminus
[/lang]
Un autre moyen encore plus simple d'installer cpanm est d'utiliser une option de Perlbrew:
perlbrew install-cpanm
[/lang]
Testons immédiatement en installant Catalyst
cpanm Catalyst Catalyst::Devel
[/lang]
catalyst.pl myapp
[/lang]
Si tout c'est bien passé nous avons une application fonctionnelle située dans /var/www/myapp. Pour la tester :
cd myapp
./script/myapp_server.pl
[/lang]
Notre application est à l'écoute sur http://localhost:3000, elle utilise un mini serveur Web intégré à Catalyst. Tout cela est parfais pour le développement mais lorsque l'on souhaite la déployer sur Internet il nous faut un vrai serveur Web.
Plusieurs méthode permettent de "greffer" notre application à Nginx :
-
via starman au travers du proxy http de nginx
-
via fastcgi au travers d'une socket unix
Dans cet article j'utiliserai la seconde méthode. La configuration de Nginx est plutôt simple, pour cela il suffit de créer le fichier de configuration /etc/nginx/sites-enabled/myapp
server {
listen 80;
server_name exemple.com *.exemple.com;
client_max_body_size 50m;
location / {
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_NAME '';
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_pass unix:/var/www/myapp/myapp.socket;
}
location /static {
root /var/www/myapp/root;
expires 30d;
}
}
[/lang]
Il nous reste à créer cette fameuse socket, pour cela nous générons le script /var/www/myapp/myapp.fastcgi.initd
#!/usr/bin/env perl
use warnings;
use strict;
use Daemon::Control;
# 1) create initd file
# ./myapp.fastcgi.initd get_init_file > /etc/init.d/cat-myapp
#
# 3) install to runlevels
# update-rc.d cat-myapp defaults
my $app_home = '/var/www/myapp';
my $perl = 'perl';
my $program = $app_home . '/script/myapp_fastcgi.pl';
my $name = 'myapp';
my $workers = 1;
my $pid_file = $app_home . '/myapp.pid';
my $socket = $app_home . '/myapp.socket';
Daemon::Control->new({
name => $name,
lsb_start => '$nginx',
lsb_stop => '$nginx',
lsb_sdesc => $name,
lsb_desc => $name,
path => $app_home . '/myapp.fastcgi.initd',
user => 'www-data',
group => 'www-data',
directory => $app_home,
program => "$perl $program --nproc $workers --listen $socket",
pid_file => $pid_file,
stderr_file => $app_home . '/myapp.out',
stdout_file => $app_home . '/myapp.out',
fork => 2,
})->run;
[/lang]
Ce script permet de généré le script de démarrage fastcgi de l'application myapp
chmod +x myapp.fastcgi.initd
./myapp.fastcgi.initd get_init_file > /etc/init.d/cat-myapp
[/lang]
Et enfin pour que cat-myapp démarre au reboot de la machine :
update-rc.d cat-myapp defaults
[/lang]
Et voilà, on démarrage le script d'initialiation de l'application et Nginx
/etc/init.d/cat-myapp start
/etc/init.d/nginx restart
[/lang]
Nous avons maintenant quelque chose qui tient la route :)