Catalyst, perlbrew, cpanm et nginx

user_icon admin | icon2 Perl | icon4 22/5/2013 20h38| Type doc: article| Type File: xml| icon3 No Comment

Catalyst, perlbrew, cpanm et nginx


1. Installation

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]

1.1. Installation de Perlbrew

curl -kL http://install.perlbrew.pl | bash
echo 'source ~/perl5/perlbrew/etc/bashrc' >> .profile
. .profile
[/lang]

1.2. Installation d'un Perl

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]

1.3. Installation de App::cpanminus

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.

2. Catalyst et Nginx

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 :)


Add_a_comment

Validator_logo
Catapulse v0.06
( 0.080072 s)