Mit dem Modul mod_perl wird der Interpreter der Programmiersprache Perl persistent in den Apache Webserver eingebettet. Dadurch ist es möglich in alle Verarbeitungsphasen des Apache Webservers über Programme in der Sprache Perl einzugreifen. Perl-Programme können Apache damit quasi beliebig erweitern und werden – einmal beim Start in ausführbaren Code übersetzt – selbst Teil des Apache. Der durch die Einbettung entfallende Fork beim Aufruf eines (ehemals üblichen CGI-)Programms und die Startup-Zeit für eine Webanwendung entfallen fast vollständig. Diese tiefgehende Integration in den Webserver und die hohe Performanz ermöglichen erst die Erstellung komplexer und performanter Webanwendungen im Unternehmens- sowie Universitäts-Umfeld mit Perl.

Seit Ende der 90er Jahre verwendet OpenBib mod_perl im Apache Webserver – zunächst als Beschleuniger auf CGI-Basis mit Apache::Registry, ab Anfang 2005 als in den Apache vollintegrierte modulare Webanwendung. Doch die Zeit steht nicht still und während wir im KUG bisher noch sehr zuverlässig mod_perl mit dem Apache in der Version 1.x verwendeten, merkten wir so langsam, dass diese Kombination um uns herum fast schon ausgestorben war…

Alle großen Linux-Distributionen sind inzwischen auf Apache2 und mod_perl2 umgestiegen und den Schlusspunkt setzte nun die von uns vewendete Debian-Distribution. Bot die letzte Version etch – die momentan die Basis für die Produktionssysteme des KUG liefert – noch sowohl Apache1 und Apache2 mit ihren jeweiligen mod_perl-Varianten an, so zieht die aktuelle Version lenny hier einen Schlussstrich und verbannt Apache1 endgültig aus ihrer Paketsammlung.

Grund genug den Umstieg von OpenBib auf Apache2 mit mod_perl2 nun endlich anzugehen. Dazu haben wir erstmal einen separaten mod_perl2-Branch im CVS angelegt, um dann auf Basis von Debian etch die notwendigen Anpassungen vorzunehmen.

Eigentlich war der Aufwand deutlich geringer als erwartet. Die größte Arbeit bestand im Austausch bzw. dem Hinzufügen der vielen neuen Perl-Module. Diese hatten sich von sehr wenigen Modulen in mod_perl1 auf eine Vielzahl in mod_perl2 verteilt. Im Abgleich mit der Online-Dokumentation musste deshalb herausgefunden werden, welche von OpenBib verwendete Methode in welches neue Modul gewandert ist – und dieses dann in OpenBib ausgetauscht oder hinzugefügt werden. Eine große Hilfe war hier die offizielle Portierungs-Dokumenation als Referenz sowie als ausführliches Beispiel.  Insbesondere der Trick mit PerlModule Apache2::porting in der httpd.conf liefert wesentliche Hinweise darüber, was genau zu tun ist.

Zentrale neue Module sind:

  • Apache2::Const
  • Apache2::Request
  • Apache2::RequestRec
  • Apache2::SizeLimit
  • Apache2::Log
  • Apache2::SubRequest
  • Apache2::URI
  • APR::URI
  • Apache2::RequestIO
  • Apache2::Connection
  • Apache2::Reload

Daneben haben sich auch einige Methoden in ihren Namen geändert: Apache::Request->instance wird zum Standardverhalten von Apache2::Request->new – muss also entsprechend umgeschrieben werden, $r->send_http_header zum Setzen des Content-Type wandert nach $r->content_type, $r->header_out nach $r->headers_out->add und $r->header_in nach $r->headers_in->get. Es empfiehlt sich Konstanten vollqualifiziert anzugegeben, also z.B. Apache2::Const::SERVER_ERROR. Insgesamt kann das alles sehr schnell per sed in der Bash für alle Module geändert werden.

Problematischer war da nur Apache2::Request. Aus Gründen der Abwärtskompatabilität hatten wir eigentlich bereits obsolete – aber extern immer noch verwendete – Request-Parameter mit Apache::Request in einem unserer Perl-Module nachträglich gesetzt. Das geht nun leider nicht mehr. So mussten wir unser entsprechendes Modul ändern und einen anderen Weg finden.

All das ist in der offziellen Dokumentation aber gut beschrieben und die Umstellung artet – von den wenigen Fällen abgesehen, wo der Code individuell angepasst werden musste – zur eher simplen Fleißarbeit aus.

Problematischer und unerwartet war nur das Verhalten von einigen 3rd party Modulen, die wir in OpenBib nutzen. Da wäre zunächst einmal das Template Toolkit. Dieses wollte nach der Umstellung per se nicht mehr zuverlässig auf übergebene Hashwerte per Punktnotation zugreifen – mal funktionierte es, dann wieder nicht. Stattdessen beklagte es sich sporadisch, dass die entsprechende Methode nicht existiere. Variablen-Aufrufe wurden also fälschlicherweise als Methoden-Aufrufe angesehen. Also mussten entsprechende Accessor-Methoden eingeführt werden – das hatte ich bereits einige Zeit vor mir hergeschoben und die damit einhergehende Kapselung war ohnehin dem wilden Referenzieren mit Punkten vorzuziehen.

Und dann war da noch Apache::Singleton::Request, das wir an verschiedenen Stellen zur Realisierung des Singleton Design-Patterns verwenden. Augenscheinlich auch für Apache2 geschrieben, funktioniert es dort aber nicht richtig. Der Effekt: Eine Anfrage und der Apache saugt sich allen verfügbaren Hauptspeicher, bis der Recher tot ist – mausetot. Nur noch aus- und wieder einschalten hilft… – also musste das Modul von uns gepatcht werden. Da der Maintainer leider nicht auf ihm zugesandte Patches reagiert, werden wir die gepatchte Version wahrscheinlich bald als eigenes Debian-Paket bereitstellen.

Die ganze Umstellung im Programmcode von OpenBib war in wenigen Tagen vollzogen. Seit dem 20.7.2009 laufen nun auch beide Produktionsserver des KUG mit Apache2 und mod_perl2.

Damit kann nun auch bei uns Apache1 mit mod_perl1 endlich seinen verdienten Ruhestand genießen. So long, and thanks for all the fish.