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"