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.
Deployment-Konfiguration
Wir verwenden unser bisheriges Buildout-Projekt und ergänzen es um eine Konfiguration für den Produktivbetrieb. Hierzu erstellen wir eine weitere Konfigurationsdatei deployment.cfg:
[buildout]
extends =
buildout.cfg
parts =
plone
zope2
deploymentproducts
zeoserver
instance1
instance2
[deploymentproducts]
recipe = plone.recipe.distros
urls =
http://plone.org/products/cachefu/releases/1.1.1/CacheFu-1.1.1.tgz
nested-packages =
CacheFu-1.1.1.tgz
version-suffix-packages =
[zeoserver]
recipe = plone.recipe.zope2zeoserver
zope2-location = ${zope2:location}
zeo-address = 8100
[instance1]
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
zeo-client = true
zeo-address = ${zeoserver:zeo-address}
zodb-cache-size = 4000
zeo-client-cache-size = 100MB
user = admin:secret
http-address = 8080
debug-mode = off
verbose-security = off
eggs =
Plone
${buildout:eggs}
zcml =
vs.policy
products =
${buildout:directory}/products
${deploymentproducts:location}
[instance2]
recipe = plone.recipe.zope2instance
zope2-location = ${zope2:location}
zeo-client = true
zeo-address = ${zeoserver:zeo-address}
zodb-cache-size = 4000
zeo-client-cache-size = 100MB
user = ${instance1:user}
http-address = 8081
debug-mode = on
verbose-security = on
eggs = ${instance1:eggs}
zcml = ${instance1:zcml}
products = ${instance1:products}
zope-conf-additional =
zserver-threads 1
Beachten Sie dabei, dass buildout.cfg die in deployment.cfg angegebenen Abschnitte (parts) ergänzt. Daher werden die Abschnitte plone und zope2 der buildout.cfg-Datei entnommen. productdistros hingegen ist kein Teil der deployment.cfg, und daher werden auch Entwicklungswerkzeuge wie DocFinderTab nicht einbezogen.
Ändern von IP und Ports
[zeoserver]
- zeo-address
gibt die Adresse des ZEO-Servers an.
Der Standardwert ist 8100.
[instance1], [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.
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:
[deployment]
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.
- [instance1], [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 instance1-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://cheeseshop.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, deployment.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 deployment.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/instance1 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.:
[instance1] ... 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\instance1 install

