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 auf eine ZODB, die vom ZEO-Server verwaltet wird, zugreifen können. Dies bietet mehrere Vorteile:
- Der ZEO-Server und die ZEO-Clients sollten auf verschiedenen Maschinen sitzen und so für eine höhere Ausfallsicherheit sorgen.
- Mehrere ZEO-Clients verteilen ggf. auftretende Last in der Anwendungslogik.
- ZEO-Clients können unterschiedliche Aufgaben übernehmen und speziell dafür konfiguriert werden, z.B. für anonyme Betrachter, Redakteure und Administratoren.
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 = base.cfg parts = zeoserver instance1 [zeoserver] recipe = plone.recipe.zeoserver zeo-address = 127.0.0.1:8000 blob-storage = ${buildout:directory}/var/blobstorage [instance-base] zeo-client = True zeo-address = ${zeoserver:zeo-address} blob-storage = ${zeoserver:blob-storage} shared-blob = on zserver-threads = 4 http-fast-listen = off [instance1] <= instance-base http-address = 8010 debug-mode = off verbose-security = off
Ändern von IP und Ports
[zeoserver]
- zeo-address
gibt die Adresse des ZEO-Servers an.
Der Standardwert ist 8100.
[instance1], [instance-profile], [instance-debug]
- 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>
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:
[instance-profile] <= instance-base … environment-vars += PROFILE_PUBLISHER 1
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.
- base.cfg, devel.cfg, deploy.cfg, versions.cfg
- die Konfigurationsdateien.
- src/
- das Verzeichnis, das die gesamte Eigenentwicklung des Projekts enthält.
Anschließend kann das Projekt neu erstellt werden mit:
$ python2.7 bbootstrap.py -c deploy.cfg $ ./bin/buildout -c deploy.cfg
Würde die Konfigurationsdatei nicht spezifiziert, würde Buildout die Standard-Konfigurationsdatei buildout.cfg-Datei erwarten.
Anschließend können ZEO-Server und ZEO-Client gestartet werden:
$ ./bin/zeoserver start $ ./bin/instance1 start
Nun sollte Zope über den Port 8010 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 = plone
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
Konfigurieren des NFS für blobstorage
- zeoserver:
In /etc/exports kann folgendes eingetragen werden:
/plone/vs_buildout/var/blobstorage 192.168.110.0/24(rw)
Damit erlaubt der NFS-Server zeoserver NFS-Exporte an Server des internen Netzes 192.168.110.0/24.
Anschließend wird der NFS-Server neu gestartet mit:
# service nfs restart NFS-Daemon beenden: [ OK ] NFS mountd beenden: [ OK ] NFS-Dienste beenden: [ OK ] NFS-Dienste starten: [ OK ] NFS-mountd starten: [ OK ] NFS-Daemon starten: [ OK ]
- instance1, instance-profile, instance-debug
Hier kann das NFS gemountet werden, z.B. mit:
mount -t nfs4 192.168.110.3:/plone/vs_buildout/var/blobstorage /plone/vs_buildout/var/blobstorage
oder /etc/mtab konfigurieren:
… 192.168.110.3:/plone/vs_buildout/var/blobstorage /plone/vs_buildout/var/blobstorage nfs4 rw,addr=192.168.110.3,clientaddr=192.168.110.4 0 0