1.3. Proxy mode

1.3.1 Introduction

Dans ce mode, Apache est utilisé comme proxy entre le client et le serveur intégré. Vous devez le configurer de façon qu'il dirige toutes les requêtes vers ce serveur qui fonctionne en tâche de fond. Nous supposons que vous démarrez Apache sur le port 80 et le serveur intégré sur le port 8081 (pour des raisons de sécurité, sur Linux il vaut mieux démarrer Karrigell sur un port supérieur à 1024 et pas comme root)

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

1.3.2 Editer httpd.conf

Il faut d'abord éditer le fichier de configuration d'Apache, httpd.conf

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

Donnez à l'option DocumentRoot la valeur du répertoire racine de votre distribution Karrigell

Ajoutez les lignes suivantes pour autoriser le mode proxy :

ProxyRequests On
<Proxy *>
    Order allow,deny
    Deny from none
    Allow from all
</Proxy>

mod_rewrite est utilisé pour demander à Apache d'envoyer les requêtes vers le serveur intégré. Ce module analyse l'url originale et le modifie en fonction d'expressions régulières

Ajoutez ces lignes à la section <Directory > pour le répertoire racine :

RewriteEngine On
RewriteCond  %{SCRIPT_FILENAME} !autostart\.cgi$
RewriteRule ^(.*) http://localhost:8081/$1 [P]
ErrorDocument 502 /cgi-bin/autostart.cgi
ErrorDocument 503 /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 ou 503 est renvoyée ; les dernières lignes indiquent à 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)

1.3.3 Edition de autostart.cgi

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

#!/usr/bin/python
print "Content-type: text/html\r\n\r\n"
print """<html><head><META HTTP-EQUIV="Refresh" CONTENT="10; 
      URL=/"></head><body>Restarting site ...<a href="/">click 
      here<a></body></html>"""
import os
import sys
os.setpgid(os.getpid(), 0)
server_script = r"c:\Karrigell\20090614\Karrigell.py"
conf_dir = os.path.dirname(server_script)
line = sys.executable + ' '+server_script +' %s &' %conf_dir
try:
    os.system(line)
except:
    import traceback
    traceback.print_exc(file=out)

Ce qu'il faut adapter :

  • l'emplacement de l'interpréteur Python sur la première ligne
  • le chemin vers Karrigell.py sur la ligne "server_script"

Le script doit être mis dans le répertoire cgi-bin défini dans httpd.conf (normalement par la directiveScriptAlias). N'oubliez pas de lui affecter le mode "exécution"

1.3.4 Démarrage du serveur

Le serveur doit être configuré avec ces valeurs dans server_config.py:

  • port = 8081
  • silent = True

Démarrez le serveur intégré sur le port 8081 et démarrez Apache. Ceci devrait suffire pour faire fonctionner l'ensemble. 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"