Installare un'applicazione Catalyst con FastCGI su Apache o lighttpd

| No Comments

L'utilizzo di FastCGI rappresenta un modo abbastanza semplice per configurare un ambiente di produzione per un'applicazione Catalyst su un buon numero di web server (qui vedremo come fare su Apache e lighttpd).

Questo tutorial presume che vogliate gestire l'applicazione esternamente rispetto al web server: in pratica non lasciate gestire ad Apache/lighttpd l'avvio e la chiusura di essa. Ciò ha alcuni vantaggi, tra i quali quello di poter facilmente riavviare l'applicazione senza riavviare il web server stesso (quindi senza interferire con altro che viene eventualmente gestito dallo stesso server). Se preferite far gestire l'applicazione Catalyst al server, qui trovate un tutorial su come farlo con Apache.

Anzitutto è necessario decidere come gestire le proprie applicazioni. Lo stretto minimo è lanciare, con l'utente adatto ed i parametri corretti, lo script myapp_fast.cgi.pl presente nella directory script di un'applicazione Catalyst. Giacché è opportuno che vi sia un daemon che gestisce start/stop dello script nonché riavvio in caso di crash dello stesso, io uso i daemontools di D.J. Bernstein: leggeri e semplici. L'installazione dipende dal sistema operativo; su Gentoo Linux essa si riduce a:

emerge -av daemontools
/etc/init.d/svscan start
rc-update add svscan default   # Avvia al boot

svscan cerca nella directory /service i servizi da avviare. La cosa migliore è creare script che ci servono altrove, e poi aggiungere un link simbolico in /service: sarà così semplice attivare o disattivare un'applicazione all'occorrenza. Diciamo ad esempio che la directory per il servizio relativo alla nostra applicazione è /var/catapps/myapp/. Dentro ad essa creiamo un file run (eseguibile, quindi con modo 755) contenente:

#!/bin/sh

export CATALYST_DEBUG=1   # Cambiare a 0 in produzione

cd /var/catapps/myapp

exec setuidgid myappfcgi /usr/local/catalyst/MyApp/script/myapp_fastcgi.pl -n 2 -l /tmp/myapp_fastcgi.socket -p /tmp/myapp_fastcgi.pid

Esaminando questo file si nota anzitutto che lo script myapp_fastcgi.pl viene eseguito con un setuid all'utente myappfcgi: è consigliabile in effetti creare un utente apposito per ciascuna applicazione, che abbia i privilegi necessari e nulla di più: l'utilizzo di un servizio FastCGI esterno consente in effetti di differenziare l'utente che esegue l'applicazione da quello di Apache, il che rappresenta se non una miglioria di sicurezza quantomeno una gestione più ordinata della situazione.
I parametri passati a myapp_fastcgi.pl rappresentano invece il numero di processi da avviare (2 in questo caso), il nome del socket per comunicare con Apache ed il nome del file dove scrivere il PID dell'applicazione. Al posto di un socket è anche possibile specificare una porta TCP: in questo modo è possibile far risiedere l'applicazione su una macchina diversa rispetto al web server.
A questo punto basta un:

ln -s /var/catapps/myapp /service

L'applicazione si avvierà appena svscan si rende conto della sua presenza: per far accadere ciò immediatamente, basta riavviare svscan. Potete poi verificare la lista dei processi per verificare che essi siano attivi. Dovreste trovare dei processi simili a questi:

1400 ?        S      0:01 perl-fcgi-pm
1401 ?        S      0:00 perl-fcgi
1402 ?        S      0:00 perl-fcgi
27733 ?       S      0:00 supervise myapp

Ora che l'applicazione Catalyst è a posto, non resta che configurare il web server.

Apache

È anzitutto necessario installare FastCGI: verificate la documentazione del vostro sistema operativo per fare ciò. Su Gentoo Linux si tratta del solito:

emerge -av mod_fastcgi

oppure emergere apache2 avendo specificato lo USE flag fastcgi in /etc/make_conf.
La configurazione di Apache per FastCGI è di solito più o meno automaticamente gestita dalla maggior parte dei package manager. Su Gentoo si tratta di aggiungere un -D FASTCGI alla variabile APACHE2_OPTS all'interno del file /etc/conf.d/apache2, e di riavviare ovviamente Apache.

Sono anche necessari un paio di moduli Perl, FCGI e FCGI::ProcManager.

A questo punto si passa alla configurazione vera e propria della parte che riguarda la comunicazione tra il web server e l'applicazione Catalyst. Qui potete creare un virtual host oppure no, o sbizzarrirvi in configurazione più o meno esot(er)iche; in ogni caso la configurazione base è qualcosa tipo:

# Il socket deve essere lo stesso indicato nello script "run" di cui sopra
FastCgiExternalServer /tmp/myapp.fcgi -socket /tmp/myapp_fastcgi.socket

# Poiché l'applicazione è esterna alla DocumentRoot (il che è molto)
# raccomandabile), va mappata a una locazione
Alias /myapp/ "/tmp/myapp.fcgi/"

# Impostiamo i permessi corretti per la locazione dell'applicazione
# (altrimenti il risultato sarà un "Forbidden")
<Location /myapp/>
    Order allow,deny
    Allow from all
</Location>

# Anche la directory dei file statici va mappata a una locazione
Alias /myapp-static "/usr/local/catalyst/MyApp/root/static"

# Permessi per la directory dei file statici
<Directory "/usr/local/catalyst/MyApp/root/static">
    Options All -Indexes
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

Come si nota, la direttiva che fa tutto il lavoro è FastCgiExternalServer la quale permette ad Apache di comunicare via socket con la nostra applicazione.
A questo punto non rimane che da avviare Apache, vedere se tutto funziona, ed in caro controllare l'error_log.

lighttpd

Rispetto ad Apache, lighttpd offre una configurazione persino più lineare e, pertanto, semplice. Il supporto FastCGI normalmente è già presente, e si tratta solo di effettuare qualche tweak a file di configurazione. Sotto Gentoo, consiglio di emergere lighttpd con lo USE flag fastcgi, in modo che alcune cose vengano preconfigurate direttamente al momento dell'installazione. Si tratta fondamentalmente di verificare che in /etc/lighttpd.conf sia decommentato:

include "mod_fastcgi.conf"

Poiché abbiamo anche bisogno di creare un alias, ci serve anche che sia decommentato mod_alias nella direttiva server.modules.

In mod_fastcgi.conf è opportuno, a meno che non usiate anche PHP, lasciare solamente la riga che include il modulo fastcgi, e commentare tutte le altre.
All'interno di un virtual host, o ovunque interessi mappare l'applicazione Catalyst, va inserito codice tipo:

fastcgi.server = (
    "/myapp" => (
        "MyApp" => (
            # Inoltra sempre tutte le richieste all'applicazione Catalyst
            "check-local" => "disable",
            # Il socket deve essere lo stesso indicato nello script "run" di cui sopra
            "socket" => "/tmp/myapp_fastcgi.socket",
        )
    )
)

alias.url = ( "/myapp-static/" => "/usr/local/catalyst/MyApp/root/static/" )

Una volta riavviato lighttpd tutto dovrebbe funzionare, ma controllate sempre l'error_log. ;-)

Sia con Apache che con lighttpd, potrete poi utilizzare le usuali tecniche (ad esempio mod_rewrite) per rendere le URL più amichevoli dei confronti dell'utente e dei motori di ricerca.

Leave a comment

About this Entry

This page contains a single entry by Michele Beltrame published on December 25, 2009 10:39 PM.

An idea for PerlSki::IT was the previous entry in this blog.

Scrivere applicazioni Facebook in Perl (parte 1) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.

Categories

Pages

OpenID accepted here Learn more about OpenID
Powered by Movable Type 5.14-en