Karrigell Documentation

Version 2.4.0 12 04 08

English

5. Karrigell avec Apache, lighttpd ou Xitami

Bien que Karrigell puisse fonctionner de façon autonome avec le serveur Web intégré, il peut être intéressant de le faire fonctionner avec un serveur Web externe. Apache est le serveur le plus répandu dans le monde, il est performant, stable, il permet de travailler en mode sécurisé (SSL), il offre des services de log, etc

Il y a plusieurs façons de faire fonctionner Karrigell avec Apache :
modedescriptionavantagesinconvénients
Mode Proxy Le serveur intégré tourne en tâche de fond, le serveur Apache lui envoie toutes les requêtes et renvoie la réponse au client
  • meilleure performance
  • gestion de l'objet de session en mémoire (plus souple)
  • nécessite la permission d'exécuter un processus long sur le serveur
  • ne convient pas pour les requêtes longues (le serveur web intégré bloque jusqu'à ce que la requête soit terminée)
mode CGI Les requêtes sont traitées par un script CGI
  • compatible avec tous les fournisseurs d'hébergement web
  • ne bloque pas les requêtes longues (chaque requête est exécutée dans un processus séparé)
  • le surcoût du CGI réduit la performance
  • gestion de session moins souple (les données sont stockées sur disque)

Graham Dumpleton a écrit une page d'instructions pour faire fonctionner Karrigell avec WSGI

5.1 Apache en mode proxy

5.1.1 Introduction

Pour utiliser Karrigell dans Apache vous devrez télécharger et installer les élements suivants :

Je préconise que vous utilisiez la dernière version stable de chacun des éléments ci-dessus

Je recopie l'essentiel de cette section à partir de la documentation de CherryPy, par Rémi Delon : http://www.cherrypy.org/wiki/BehindApache

Une fois que tout ce qui précède est installé (et fonctionne!) tout ce qu'il vous reste à faire est d'ajouter quelques lignes au fichier de configuration Apache httpd.conf (il devrait se trouver sous l'élément de menu "Configurer le serveur Apache" sous Windows).

Dans la section Dynamic Shared Object (DSO), décommentez les lignes

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
Ailleurs dans la section Main server configuration, ajoutez les lignes suivantes pour mettre en oeuvre la fonction proxy :
ProxyRequests On
<Proxy *>
    Order allow,deny
    Deny from none
    Allow from all
</Proxy>

Pour demander à Apache d'envoyer les requêtes vers le serveur intégré, mod_rewrite est utilisé. Ce module analyse l'url d'origine et la modifie selon des règles écrites sous forme d'expressions régulières. Ici les lignes à écrire sont :

RewriteEngine On
RewriteCond  %{SCRIPT_FILENAME} !autostart\.cgi$
RewriteRule ^(.*) http://localhost:8081$1 [P]
ErrorDocument 502 /cgi-bin/autostart.cgi
La fonctionnalité essentielle est décrite dans la RewriteRule : elle indique à Apache de réécrire toutes les urls en une url absolue correspondant au serveur intégré qui tourne sur le port 8081, et d'utiliser le mode proxy pour lui passer la requête

Si le serveur intégré ne tourne pas, une erreur 502 est renvoyée ; la dernière ligne indique à Apache d'appeler le script autostart.cgi dans ce cas. La deuxième ligne empêche Apache de se servir de la RewriteRule pour ce script en particulier (sinon il entrerait dans une boucle infinie)

autoscript.cgi est un petit script, qui ressemble à ceci sous Linux/Unix :

#!/usr/local/bin/python
print "Content-type: text/html\r\n"
print """<html><head><META HTTP-EQUIV="Refresh" CONTENT="10; 
      URL=/"></head><body>Restarting site ...<a href="/">cliquez 
      ici<a></body></html>"""
import os
import sys
os.setpgid(os.getpid(), 0)
os.system(sys.executable + \
   ' /home/quentel/karrigell/Karrigell-2.2/Karrigell.py -P 8081 -S ' + \
   '/home/quentel/karrigell/Karrigell-2.2/Karrigell.ini &')

La seule chose à adapter est l'emplacement de python sur la première ligne, et le chemin vers Karrigell.py et Karrigell.ini sur la dernière ligne

Ensuite lancez le serveur intégré sur le port 8081 et démarrez Apache. Ceci devrait suffire pour faire fonctionner l'ensemble. Démarrez (ou redémarrez) Apache pour lui faire lire la nouvelle configuration et commencez à vous en servir. En fonction de la valeur prise par ServerName (mettez 'localhost' pour les tests), entrez l'URL de votre serveur dans la barre d'adresses d'un navigateur et Karrigell/ModPython/Apache devrait servir des pages web comme le Karrigell "normal"

Pour des raisons de sécurité, sur Linux il vaut mieux démarrer Karrigell sur un port supérieur à 1024 et pas comme root

5.1.2 Hôtes virtuels

Les hôtes virtuels peuvent être utilisés avec Apache pour servir des hôtes différents sur la même machine avec le même serveur. Depuis la version 2.2, Karrigell prend en charge cette notion d'hôte virtuel, ainsi vous pouvez servir tous les hôtes virtuels avec la même instance du serveur intégré

Si vous avez configuré [VirtualHost karrigell:8081] dans le fichier de configuration de Karrigell (voir la page sur les options du serveur web) avec le nom karrigell et le port 8081 (sur lequel le serveur intégré tourne), vous ajoutez ceci dans le fichier de configuration d'Apache :

NameVirtualHost 127.0.0.1:80
<VirtualHost 127.0.0.1:80>
        ServerName karrigell
        # for use with Karrigell
        RewriteEngine On
        RewriteCond  %{SCRIPT_FILENAME} !autostart\.cgi$
        RewriteRule ^(.*) http://karrigell:8081$1 [P]
        ErrorDocument 502 /cgi-bin/autostart.cgi
</VirtualHost>

Bien entendu vous changerez l'adresse et le port dans <Virtual Host> aux valeurs appropriées

5.2 Apache avec mod_cgi

Nouveau en version 2.3.5

Au cas où vous ne pourriez pas utiliser le serveur intégré, il faut utiliser une autre méthode pour faire tourner Karrigell derrière un serveur Apache, en faisant simplement appel aux modules mod_rewrite et mod_cgi

Toutes les urls qui aboutissent à un fichier dans le répertoire Karrigell sont "réécrites" par mod_rewrite pour être traités par un script cgi, start.cgi, situé dans le répertoire webapps/cgi-bin

5.2.1 Permissions "write" et "execute"

Il faut installer le paquetage Karrigell dans un répertoire accessible au serveur Apache, et définir les permissions suivantes si le serveur tourne sous Unix/Linux :
  • mode "write" sur les dossiers data et conf
  • mode "execute" sur le script start.cgi dans le dossier webapps/cgi-bin

5.2.2 httpd.conf

Remplacer "C:/cygwin/home/Karrigell" par le chemin du répertoire dans lequel vous avez installé le paquetage Karrigell

1. dans la section DSO, vérifier que ces lignes sont décommentées

LoadModule cgi_module modules/mod_cgi.so
LoadModule rewrite_module modules/mod_rewrite.so

2. Remplacer DocumentRoot par le chemin vers le dossier webapps

DocumentRoot "C:/cygwin/home/karrigell/webapps"

3. Alias
Réécrire les alias définis dans Karrigell.ini :

Alias /admin "C:/cygwin/home/Karrigell/admin"

4. Décommenter la ligne

AddHandler cgi-script .cgi

5. Options du répertoire racine

Remplacer la section <Directory /> (...) </Directory> par:

<Directory />
    AllowOverride None
    Options -Indexes FollowSymLinks ExecCGI
    Order allow,deny
    Allow from all
    # gerer les urls correspondant a des dossiers
    ErrorDocument 403 /cgi-bin/start.cgi
    # reecrire les urls pour que Karrigell prenne en charge les scripts
    # avec les extensions py,pih,hip and ks
    RewriteEngine On
    RewriteRule ^(.*)\.(py|pih|hip|ks)$ /cgi-bin/start.cgi
    # et les scripts ks avec un nom de fonction
    RewriteRule ^(.*)\.ks/.* /cgi-bin/start.cgi
</Directory>

6. Ajouter la configuration pour le répertoire cgi-bin

<Directory /cgi-bin>
    AllowOverride None
    Options ExecCGI
    Order allow,deny
    Allow from all
</Directory>

5.2.3 Fichier de configuration Karrigell

Dans la section [Server] du fichier de configuration (Karrigell.ini) faites

persistentSession = 1
debug = 0

Avertissement En mode cgi, les données de session ne peuvent pas être conservées en mémoire. Elles sont stockées sur disque, ce qui entraîne certaines limitations :

  • seuls des types intégrés peuvent être affectés aux attributs de l'objet session
  • la performance est dégradée à cause des temps d'accès disque

5.3 Apache en hébergement partagé

Si vous voulez utiliser Karrigell sur un site d'hébergement partagé, vous ne pourrez probablement pas utiliser le serveur intégré, il faut donc utiliser le mode cgi décrit ci-dessus

Télécharger le paquetage Karrigell sur votre site et définissez les permissions comme indiqué dans la section 2.1 ci-dessus avec votre client FTP ou SSH

Supposons que le répertoire dans lequel vous pouvez stocker vos fichiers sur l'hôte est /var/www/html/MonSite. Vous installez Karrigell dans le sous-dossier /var/www/html/MonSite/karrigell (ce qui veut dire que le script Karrigell.py se trouve dans ce dossier)

Votre site sera configuré comme hôte virtuel ; le fichier httpd.conf de l'hôte aura une section <VirtualHost> dédiée au site

Elle aura l'allure suivante :

<VirtualHost 10.193.117.191:80>
    ServerAdmin jean.dupont@nullepart.org
    ServerName MonSite
    DocumentRoot /var/www/html/MonSite/karrigell/webapps
    <Directory /var/www/html/MonSite/karrigell/webapps>
        AllowOverride None
        Options -Indexes FollowSymLinks ExecCGI
        Order allow,deny
        Allow from all
        # gerer les urls correspondant a des dossiers
        ErrorDocument 403 /cgi-bin/start.cgi
        # reecrire les urls pour que Karrigell prenne en charge les scripts
        # avec les extensions py,pih,hip and ks
        RewriteEngine On
        RewriteRule ^(.*)\.(py|pih|hip|ks)$ /cgi-bin/start.cgi
        # et les scripts ks avec un nom de fonction
        RewriteRule ^(.*)\.ks/.* /cgi-bin/start.cgi
    </Directory>
    ScriptAlias /cgi-bin/ "/var/www/html/MonSite/karrigell/webapps/cgi-bin/"
    AddHandler   cgi-script  .cgi
    <Directory /var/www/html/MonSite/karrigell/webapps/cgi-bin>
        AllowOverride None
        Options FollowSymLinks ExecCGI
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Il faudra éditer ce modèle avec les bonnes valeurs pour l'adresse IP address, le port, l'adresse mail du ServerAdmin (la vôtre), le nom du serveur, et bien sûr le répertoire de votre installation

5.4 lighttpd

D'après le site de lighttpd :
Sécurité, vitesse, conformité et flexibilité - tout ceci décrit LightTPD qui est en train de redéfinir les critères d'efficacité d'un serveur web, qui est conçu et optimisé pour des environnements de haute performance. D'encombrement mémoire réduit par rapport à d'autres serveurs web, une gestion efficace de la charge CPU et un ensemble complet de fonctionnalités (FastCGI, CGI, Auth, compression, réécriture d'URL et bien d'autres) LightTPD est la solution idéale pour les serveurs qui connaissent des problèmes de charge. Et, cerise sur le gâteau, c'est un logiciel libre publié sous la licence BSD

Configuration pour Karrigell par Laurent Pointal

  • Lancez votre site Karrigell, en le faisant écouter sur un port (8082 par exemple).
  • Chargez mod_proxy dans lighttpd

        cd /etc/lighttpd/conf-enabled
        ln -s ../conf-available/10-proxy.conf 10-proxy.conf
    
  • Utilisez une configuration de cette forme:

    $HTTP["host"] == "mon.hote.virtuel.com" {
                    proxy.server = ( "" =>
                                       ((
                                            "host" => "127.0.0.1",
                                            "port" => 8082
                                       ))
                                    )
    }
    
  • Si vous voulez servir certains fichiers par lighttpd sans passer par Karrigell (typiquement pour du contenu statique, des images, etc) vous pouvez configurer de cette façon :

    $HTTP["host"] == "mon.hote.virtuel.com" {
            $HTTP["url"] !~ ".*/static/.*" {
                    proxy.server = ( "" =>
                                       ((
                                            "host" => "127.0.0.1",
                                            "port" => 8082
                                       ))
                                    )
                    }
            else $HTTP["url"] =~ ".*/static/.*" {
                    server.document-root = "/chemin/vers/mon/site/karrigell"
                    dir-listing.activate = "enable"
                    }
    }
    

    5.5 Xitami

    Xitami est un serveur web léger et rapide, disponible gratuitement. Téléchargez la dernière version et suivez les instructions d'installation

    Lancez le serveur, puis ouvrez une console système, mettez-vous dans le répertoire de Karrigell et tapez python Karrigell_xitami.py. A partir de là, toutes les requêtes envoyées à une URL qui commence par http://localhost/karrigell seront traitées par Karrigell

    Xitami et Karrigell sont interfacés à travers le "Long Running Web Process", qui accélère sensiblement la vitesse d'exécution par rapport au CGI

    Vous pouvez remplacer karrigell par un autre nom en éditant le fichier Karrigell_xitami.py et en changeant la valeur de la variable karrigellUrl