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.