Magazine Internet

Installation de CacheFu, en utilisant Varnish et Apache pour Plone

Publié le 11 janvier 2009 par Mikebrant

oula 2 articles en un jour, j'avais vraiment à rien à faire aujourd'hui.

CacheFu permet d'améliorer grandement la vitesse de Plone.

Varnish est un accélérateur HTTP.

Sans Buildout

je pars du principe que Zope2, Apache et Varnish sont déjà installés.

Configuration Apache et Varnish

Voilà à peu près par le cheminement d'une requête type :

Requête -> Apache[:80] -> Varnish[:8081] -> Zope[:8080]


J'utilise Fedora 10 et la version 2.0.2-1 de Varnish.


On va commencer par éditer le fichier de conf d'apache : /etc/httpd/conf/httpd.conf :
voilà à quoi devrait ressembler le VirtualHost de monsite.fr (pensez à regarder que le mod_rewrite est chargé):

#LoadModule rewrite_module modules/mod_rewrite.so
<VirtualHost IPServeur:80>
   ServerName www.monsite.fr
   ServerAlias monsite.fr
   ServerAdmin root@monsite.fr
   ErrorLog logs/www.monsite.fr-error_log
   CustomLog logs/www.monsite.fr-access_log common
  
   RewriteEngine on
   RewriteRule ^(.*) http://localhost:8081/VirtualHostBase/http/monsite.fr:80/monPlone/VirtualHostRoot/$1 [L,P]
</VirtualHost>


monPlone désigne l"id de notre site Plone.
Si l'on souhaite accéder à http://monsite.fr:80/mapage , Apache enverra la requête à Varnish : http://localhost:8081/VirtualHostBase/http/monsite.fr:80/monPlone/mapage

Varnish doit donc écouter sur le port 8081, et il devra renvoyer sur le port 8080 (port par défaut de Zope).
Il faut donc lui créer un fichier de conf : /etc/varnish/plone.vcl :

backend default {
   .host = "127.0.0.1";
   .port = "8080";
}
acl purge {
   "localhost";
}
sub vcl_recv {
   if (req.request != "GET" & req.request != "HEAD") {
   if (req.request == "PURGE") {
   if (!client.ip ~ purge) {
   error 405 "Not allowed.";
   }
   lookup;
   }
   pipe;
   }
   if (req.http.Expect) {
   pipe;
   }
   /* Do not cache other authorised content */
   if (req.http.Authenticate || req.http.Authorization) {
   pass;
   }
   /* We only care about the "__ac.*" cookies, used for
   authentication */
   if (req.http.Cookie & req.http.Cookie ~ "__ac(_(name|password|persistent))?=") {
   pass;
   }
   if (req.http.Cookie & req.http.Cookie ~ "_ZopeId") {
   pass;
   }
   lookup;
   }
   sub vcl_hit {
   if (req.request == "PURGE") {
   set obj.ttl = 0s;
   error 200 "Purged";
   }
   deliver;
   }
   sub vcl_miss {
   if (req.request == "PURGE") {
   error 404 "Not in cache";
   }
   fetch;
   }
   sub vcl_fetch {
   if (!obj.cacheable) {
   pass;
   }
   if (obj.http.Set-Cookie) {
   pass;
   }
   #insert;
   }


Comme le montre les 3 premières lignes, Varnish va bien redirger sur le port 8080 de localhost.
Le fichier de conf est tiré du livre Professional Plone Development (que j'ai du un peu remettre au goût du jour).

Et maintenant il faut lancer Varnish et Apache :

# service httpd start
# varnishd -a localhost:8081 -f /etc/varnish/plone.vcl -s file,cache-storage,100M


-a permet d'indiquer à varnish d'écouter sur le port 8081 de localhost et -f de se servir de plone.vcl comme règle.

Il nous reste plusqu'à installer cacheFu.

cacheFu

Télécharez la dernière version ici (/!\ ne pas prendre l'archive CacheFu-x.x-extras.tar.gz /!\).
À l'heure où j'écris l'article, la dernière version est la 1.2 .

Décompressez l'archive.
Rentrez dans le nouveau dossier : Products.CacheSetup-x.x, puis faites :

$ python2.4 setup.py install --home /chemin/vers/ZOPE_INSTANCE


(Si vous avez un problème avec le PYTHONPATH, export PYTHONPATH est votre ami)
Puis redémarrez Zope.
Dans la ZMI, ajoutez "Plone Site", et sélectionnez "CacheSetup" dans la liste qui apparait (n'oubliez pas de mettre en id monPlone).
Maintenant, allez sur le plone : http://localhost8080/monPlone/, vérifiez que vous êtes connecté en tant qu'admin, puis allez sur "configuration du site", et vous pouvez voir un nouveau lien :
Cache Configuration Tool : cliquez-dessus.

- Cochez enable CacheFu
- Proxy Cache Purge Configuration : Purge with VHM URLs (squid/varnish behind apache, VHM virtual hosting)
- Site Domains : www.monsite.fr:80
- Proxy Cache Domains : http://localhost:8081
Sauvegardez.
Et admirez la différence.

Avec Buildout(beaucoup plus rapide)

Configurez Apache comme dans la première partie.

On va se servir de paster, si vous ne l'avez pas :

# easy_install-2.4 PasteScript


puis :

$ paster create -t plone3_buildout hophophop & cd hophophop & python2.4 bootstrap.py


Répondez aux questions, il n'y a pas de piège.
Il ne nous reste plus qu'à éditer le fichier buildout.cfg.

Avant :

[buildout]
parts =
   plone
   zope2
   productdistros
   instance
   zopepy
# Add additional egg download sources here. dist.plone.org contains archives
# of Plone packages.
find-links =
   http://dist.plone.org
   http://download.zope.org/ppix/
   http://download.zope.org/distribution/
   http://effbot.org/downloads
# Add additional eggs here
# elementtree is required by Plone
eggs =
   elementtree
# Reference any eggs you are developing here, one per line
# e.g.: develop = src/my.package
develop =
[plone]
recipe = plone.recipe.plone>=3.1.1,<3.2dev
[zope2]
recipe = plone.recipe.zope2install
url = ${plone:zope2-url}
# Use this section to download additional old-style products.
# List any number of URLs for product tarballs under URLs (separate
# with whitespace, or break over several lines, with subsequent lines
# indented). If any archives contain several products inside a top-level
# directory, list the archive file name (i.e. the last part of the URL,
# normally with a .tar.gz suffix or similar) under 'nested-packages'.
# If any archives extract to a product directory with a version suffix, list
# the archive name under 'version-suffix-packages'.
[productdistros]
recipe = plone.recipe.distros
urls =
nested-packages =
version-suffix-packages =
[instance]
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
user = admin:admin
http-address = 8080
debug-mode = on
verbose-security = on
# If you want Zope to know about any additional eggs, list them here.
# This should include any development eggs you listed in develop-eggs above,
# e.g. eggs = ${buildout:eggs} ${plone:eggs} my.package
eggs =
   ${buildout:eggs}
   ${plone:eggs}
# If you want to register ZCML slugs for any packages, list them here.
# e.g. zcml = my.package my.other.package
zcml =
products =
   ${buildout:directory}/products
   ${productdistros:location}
   ${plone:products}
[zopepy]
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy
extra-paths = ${zope2:location}/lib/python
scripts = zopepy


Après :

[buildout]
parts =
   plone
   zope2
   productdistros
   instance
   zopepy
   varnishBuild
   varnishInstance
find-links =
   http://dist.plone.org
   http://download.zope.org/ppix/
   http://download.zope.org/distribution/
   http://effbot.org/downloads
eggs =
   elementtree
   Products.CacheSetup
[plone]
recipe = plone.recipe.plone>=3.1.1,<3.2dev
[zope2]
recipe = plone.recipe.zope2install
url = ${plone:zope2-url}
[productdistros]
recipe = plone.recipe.distros
urls =
nested-packages =
version-suffix-packages =
[instance]
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
user = admin:admin
http-address = 8080
debug-mode = on
verbose-security = on
eggs =
   ${buildout:eggs}
   ${plone:eggs}
products =
   ${buildout:directory}/products
   ${productdistros:location}
   ${plone:products}
[zopepy]
recipe = zc.recipe.egg
eggs = ${instance:eggs}
interpreter = zopepy
extra-paths = ${zope2:location}/lib/python
scripts = zopepy
[varnishBuild]
recipe = zc.recipe.cmmi
url = http://superb-east.dl.sourceforge.net/sourceforge/varnish/varnish-2.0.2.tar.gz
[varnishInstance]
recipe = plone.recipe.varnish:instance
bind = 127.0.0.1:8081
backends = 127.0.0.1:8080
cache-size = 100M


Alors, il n'y a pas grand chose qui a été rajouté :
- 1 egg : Products.CacheSetup : autrement dit CacheFu

- la section [varnishBuild] qui va construire varnish via zc.recipe.cmmi .

- la section [varnishInstance] qui va nous permettre de configurer et construire une instance de varnish.
 varnish doit écouter sur le port 8081 et rediriger sur le port 8080.

Il ne nous reste plus qu'à faire :

$ ./bin/buildout


Suivi d'un :

cd bin & ln -s ../parts/varnishBuild/sbin/varnishd .


On peut maintenant démarrer notre instance de Zope ainsi que celle de varnish :

$ ./bin/instance start
$ su -c "./bin/varnishInstance"


Et c'est terminé.
Enfin, vous devez créer un "Plone Site", en ajoutant "CacheSetup" , etc.... enfin cf ci-dessus.


Vous pourriez être intéressé par :

Retour à La Une de Logo Paperblog

Ces articles peuvent vous intéresser :

A propos de l’auteur


Mikebrant 9 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog