Möchte man eine Rails-Anwendung, wie zum Beispiel Redmine (eine Anwendung zur Verwaltung von Projekten, mit einer beeindruckenden Featureliste) unter Linux mit dem Apache 2 bereistellen, bietet sich das noch recht junge Apache Modul Passenger (aka mod_rails) an.
Für Ubuntu sind sogar mod_rails Pakete verfügbar, nach eigener Erfahrung muss ich jedoch von deren Verwendung – und das ist der Grund für diesen Blogeintrag – abraten.
Warum? In den Abhängigkeiten des Pakets wird der Apache in der Version mpm-worker verlangt. mpm-worker bezeichnet hierbei die interne Arbeitsweise des Apache und impelemtiert einen Hybrid-Webserver mit Multi-Thread und Multi-Prozess-Unterstützung, was große Performancegewinne und Skalierbarkeit verspricht. Alternativ dazu gibt es u.a. noch die Variante mpm-prefork, die einen im Voraus forkenden Webserver ohne Thread-Unterstützung bietet. Durch das Forken und die fehlende Threadunterstützung besitzt diese Varante zwar weniger Flexibilität, jedoch deutlich mehr Stabilität. Außerdem können nicht-threadsichere Module und Bibliotheken wie zum Beispiel PHP verwendet werden.
Die Verwendung von mpm-worker führte bei mir zu massiven Problemen. In meinem Fall war es ein kleiner V-Server, auf dem es zu Speicherproblemen kam, die sich folgendermaßen im Errorlog zeigten:
[Thu Oct 30 19:12:52 2008] [alert] (12)Cannot allocate memory: apr_thread_create: unable to create worker thread
oder
[Thu Oct 30 19:14:22 2008] [error] (12)Cannot allocate memory: fork: Unable to fork new process
*** Exception Errno::ENOMEM in spawn manager (Cannot allocate memory - /usr/bin/apxs2 -q BINDIR 2>/dev/null) (process 29905):
from /var/lib/gems/1.8/gems/passenger-2.0.3/lib/passenger/platform_info.rb:67:in ``'
[...]
Nach einigen Versuchen, mit verschiedenen Direktiven für mod_rails/passenger dem Problem beizukommen, habe ich das Paket deinstalliert und mittels
gem install passenger
passenger-install-apache2-module
wieder installiert. Gleichzeitig den Apache mpm-worker gegen den mpm-prefork getauscht, und schon läuft die Anwendung rund und ohne Fehlermeldungen oder Warnungen im Logfile.
Bei dieser Variante kann man auch problemlos PHP5 parallel auf dem selben Apache-Server nutzen.
Eine andere Variante, mpm-worker mit PHP zu nutzen ist übrigens der Einsatz von FastCGI. Dies soll der Vollständigkeit halber erwähnt sein. Allerdings hat man damit die Speicherprobleme von mod_rails/passenger noch nicht gelöst, aber vielleicht lagen diese bei mir ja auch “einfach nur” an dem V-Server.