Buildout für Produktivserver
Wir haben eine Entwicklungsumgebung aufgesetzt, die einige Entwicklungswerkzeuge enthält und für die an mehreren Stellen Debugging ermöglicht wurde. Mit Buildout ist es nun einfach möglich, dieses Projekt in eine Produktivumgebung zu überführen.
Zope Enterprise Objects
Zum Entwickeln haben wir eine einfache Zope-Instanz aufgesetzt. Für den Produktivserver wollen wir Zope Enterprise Objects (ZEO) verwenden, da so mehrere Zope-Instanzen, ZEO-Clients genannt, auf eine ZODB, die vom ZEO-Server verwaltet wird, zugreifen. Dies bietet mehrere Vorteile:
- Der ZEO-Server und die ZEO-Clients können auf verschiedenen Maschinen sitzen und so für eine höhere Ausfallsicherheit sorgen.
- Auf einer Maschine erhöhen mehrere ZEO-Clients meist die Performance.
- Mehrere ZEO-Clients können zum Load Balancing verwendet werden, um die Performance zu steigern, wobei für das Load Balancing selbst jedoch eine externe Lösung verwendet werden muss.
- Die ZEO-Clients können auch unterschiedlich konfiguriert sein, so dass ein ZEO-Client einen Dienst anbieten kann, während ein anderer ZEO-Client zum Debuggen oder Testen verwendet wird.
Konfiguration
Wir verwenden unser bisheriges Buildout-Projekt und ergänzen es um eine Konfiguration für den Produktivbetrieb. Hierzu erstellen wir eine weitere Konfigurationsdatei deploy.cfg:
[buildout]
extends =
buildout.cfg
parts +=
zeoserver
instance2
[zeoserver]
recipe = plone.recipe.zope2zeoserver
zope2-location = ${zope2:location}
zeo-address = 8100
[instance]
recipe = plone.recipe.zope2instance
zeo-client = true
zeo-address = ${zeoserver:zeo-address}
http-address = 8081
zodb-cache-size = 4000
zeo-client-cache-size = 100MB
debug-mode = off
verbose-security = off
eggs =
Zope2
Plone
${buildout:eggs}
zcml =
vs.policy
products =
${buildout:directory}/products
${productdistros:location}
zope-conf-additional =
zserver-threads 1
[instance2]
<=instance
http-address = 8082
Beachten Sie dabei, dass buildout.cfg die in deploy.cfg angegebenen Abschnitte (parts) ergänzt.
Ändern von IP und Ports
[zeoserver]
- zeo-address
gibt die Adresse des ZEO-Servers an.
Der Standardwert ist 8100.
[instance], [instance2]
- zeo-client
- wird der Wert auf true gesetzt, wird aus der Instanz ein ZEO-Client, der auf einen ZEO-Server mit einer bestimmten zeo-address verweist.
- http-address
- Port des HTTP-Servers. Der Standardwert ist 8080.
- ip-address
- ist die Standard-IP-Adresse, an der der ZEO-Client auf Anfragen horcht. Ist kein Wert angegeben, lauscht Zope auf allen IP-Adressen der Maschine. Die Anweisung kann überschrieben werden in den Server-Konfigurationen <http-server> etc. Üblicherweise ist keine IP-Adresse angegeben.
- zeo-address
gibt die Adresse des ZEO-Servers an, z.B. 212.42.230.152:8100.
Der Standardwert ist 8100.
Temporary Storage
In temporary storages werden z.B. Session-Daten gespeichert. Da diese nicht für jede einzelne Instanz gespeichert werden sollten sondern zentral, können Sie auf den ZEO-Server verlagert werden.
Zunächst sollte hierzu jede Instanz so konfiguriert werden, dass sie den temporary storage auf dem ZEO-Server anlegen soll:
eggs = tempstorage zodb-temporary-storage = <zodb_db temporary> # Temporary storage database (for sessions) <zeoclient> server ${zeoserver:zeo-address} storage temp name zeostorage var ${buildout:directory}/var/filestorage </zeoclient> mount-point /temp_folder container-class Products.TemporaryFolder.TemporaryContainer </zodb_db>Umgekehrt muss nun dem ZEO-Server noch mitgeteilt werden, dass er den temporary storage hosten soll:
zeo-conf-additional = %import tempstorage <temporarystorage temp> name temporary storage for sessioning </temporarystorage>
Plone 4
Für Plone 4 müssen folgende Änderungen in der Buildout-Konfigurationsdatei vorgenommen werden:
Der [buildout]-Abschnitt sollte auf einer anderen versions.cfg verweisen:
[buildout] … extends = http://dist.plone.org/release/4.0.6/versions.cfgDer [zope2]-Abschnitt mit plone.recipe.zope2install kann entfernt werden da Zope nun automatisch als Abhängigkeit installiert wird.
Auch alle Referenzen auf diesen Abschnitt, wie z.B. ${zope2:location} sollten entfernt werden.
Zur Installation des ZEO-Servers sollte nun das Rezept plone.recipe.zeoserver verwendet werden, das keine Angabe für zope2-location erwartet:
[zeoserver] recipe = plone.recipe.zeoserver zeo-address = 8100
Dafür muss nun im [zeoserver]-Abschnitt das Egg tempstorage explizit angegeben werden:
eggs = plone.recipe.zeoserver tempstorageDie Instanzen mit dem Rezept plone.recipe.zope2instance sollten ergänzt werden um die Konfiguration des BLOB storage:
- blob-storage =
${buildout:directory}/var/blobstorage
Falls die Instanz auf derselben Maschine wie der ZEO-Server läuft, können beide denselben BLOB storage nutzen und in den Abschnitten für die Instanzen sollte dann folgendes eingetragen werden:
shared-blob = on
Verändern eines bestehenden Abschnitts
Um einen bestehenden Abschnitt zu ergänzen, kann mit += z.B. der PDBDebugMode für den zweiten ZEO-Client hinzugefügt werden:
[buildout]
extends = buildout.cfg
[instance2]
…
eggs +=
Products.PDBDebugMode
Umgekehrt können auch einzelne Werte entfernt werden:
eggs -=
Products.PDBDebugMode
- [zeoserver]
verwendet plone.recipe.zope2zeoserver, um einen ZEO-Server in parts/zeoserver aufzusetzen.
- zope2-location
- verweist auf die im zope2-Abschnitt angegebene Installation.
- zeo-address
- gibt den Port des ZEO-Servers an, der Standardwert ist 8100.
Es können auch noch weitere Konfigurationsoptionen angegeben werden, z.B.
- zeo-conf
- Ein relativer oder absoluter Pfad zur zeo.conf-Datei. Wird kein Pfad angegeben, wird eine zeo.conf-Datei mit den in [zeoserver] angegebenen Werten generiert.
- zeo-conf-additional
- Zusätzliche Angaben zur zeo.conf-Datei. Dabei müssen die nachfolgenden Zeilen eingerückt sein.
Einen vollständigen Überblick über alle Optionen erhalten Sie in plone.recipe.zope2zeoserver.
- [instance], [instance2]
verwenden plone.recipe.zope2instance
- zeo-client
- wird der Wert auf true gesetzt, wird aus der Instanz ein ZEO-Client, der auf einen ZEO-Server mit einer bestimmten zeo-address verweist.
- zeo-address
gibt die Adresse des ZEO-Servers an, der Standardwert ist 8100.
Meist empfiehlt es sich, den Wert aus dem zeoserver-Abschnitt zu übernehmen:
${zeoserver:zeo-address}- zodb-cache-size
- Anzahl der Objekte, die der ZEO-Client im Cache halten kann.
- debug-mode, verbose-security
- Damit die instance-Instanz die Daten ausliefert und die instance2-Instanz zum Debuggen verwendet werden kann, werden nur für die instance2-Instanz die Werte auf On gesetzt.
- zope-conf-additional
- erlaubt weitere Einstellungen der Zope-Konfiguration, in unserem Fall werden für den zweiten ZEO-Client die zserver-threads auf 1 heruntergesetzt. Debugging und Maintenance werden deutlich vereinfacht, da immer nur eine Anfrage gleichzeitig abgearbeitet wird.
Eine Übersicht über die für zope2instance verfügbaren Optionen erhalten Sie in http://pypi.python.org/pypi/plone.recipe.zope2instance.
Verschieben des Buildout-Projekts auf einen Produktivserver
Die Buildout-Umgebung unseres Projekts kann nun auf den Produktivserver verschoben werden. Hierzu sind mindestens folgende Dateien erforderlich:
- bootstrap.py
- erstellt die Struktur des Buildout-Projekts einschließlich bin/buildout.
- buildout.cfg, deploy.cfg
- die beiden Konfigurationsdateien.
- src/, products/
- die Verzeichnisse, die die gesamte Eigenentwicklung des Projekts enthalten.
Anschließend kann das Projekt neu erstellt werden mit:
$ ./bin/buildout -c deploy.cfg
Würde die Konfigurationsdatei nicht spezifiziert, würde Buildout die buildout.cfg-Datei verwenden.
Anschließend können der ZEO-Server und die beiden ZEO-Clients gestartet werden:
$ ./bin/zeoserver start $ ./bin/instance start $ ./bin/instance2 start
Nun sollte Zope über die Ports 8080 und 8081 erreichbar sein. Falls dies nicht der Fall sein sollte, können Sie statt start auch fg verwenden, um die Prozesse im Vordergrund laufen zu lassen und eventuelle Fehlermeldungen auf der Konsole ausgegeben zu bekommen.
Anmerkung 1: Wird die Zope-Instanz unter Linux oder Mac OS X von root gestartet, muss in der buildout.cfg-Datei im [instance]-Abschnitt eine Direktive für effective-user angegeben werden, an dessen User ID der Prozess gebunden wird, nachdem die Ports zugewiesen wurden, z.B.:
[instance] … effective-user = zope
So können für die Zope-Instanz auch Ports mit Nummern kleiner 1024 verwendet werden.
Anmerkung 2: Unter Windows lässt sich eine Zope-Instanz als Service installieren, z.B. mit:
> bin\instance install
