Tags:
create new tag
, view all tags

schnellere Perl-Apps mit PSGI

Ausgangslage: Apache und CGI

Die allermeisten Perl-Applikationen laufen nach wie vor im CGI-Modus. Das bedeutet, dass bei jedem Request zuerst Perl gestartet wird, danach alle erforderlichen Module compiliert und ausgeführt werden, die Datenbankverbindung hergestellt wird etc. Die Zeit für all diese Tasks ist erstaunlich kurz, aber «modern» ist dieses Verfahren bestimmt nicht.

IDES und ModPerl::Registry

IDES hat im /etc/httpd/conf/httpd.conf Konfigurationsfile folgende Direktiven eingebaut:


<Files *.fastpl>
    SetHandler perl-script
    PerlHandler ModPerl::Registry
    Options +ExecCGI
    PerlSendHeader On
</Files>

AddHandler cgi-script .cgi

# Setup for mod_perl

   PerlPostConfigRequire /var/www/cgi-bin/IDESmodperl_startup.pl

Die erste Direktive bedeutet, dass das Modul ModPerl::Registry ein Perl-Skript fertig kompilert bereithält und nach dem Ausführen die Ressourcen nicht automatisch wieder freigibt, wie es beim CGI-Verhalten normalerweise ist.

Die zweite Direktive bedeutet, dass beim Starten des Apache-Servers von IDES zuerst IDESmodperl_startup.pl ausgeführt wird, welches gewisse Module im Voraus kompiliert.

modernere Beschleunigung mit mod_proxy

Für die Herstellung einer sicheren Verbindung (https) ist der Apache-Server nach wie vor erste Wahl. Andererseits können wir in unserer Umgebung gar keinen zusätzlichen Webserver aufstellen, welcher auf den Ports 80 resp. 443 (https) oder sonst einem Port erreichbar ist. Und das ist ganz gut so.

Angenommen, wir möchten einen Server einsetzen, welcher zwar sehr performant ist aber leider kein https kann (z.B. Starman). Zu diesem Zweck müssen wir zuerst die mod_proxy Funktionalität von Apache aktivieren. Das tun wir, indem wir unter

~/conf/servers

die Option

PROXY="on"

setzen. In unserem Apache-Configfile ~/conf/httpd.conf fügen wir danach folgende Direktive ein:

RewriteEngine On
<Location /hello>
    ProxyPass http://localhost:5000/
    ProxyPassReverse http://localhost:5000/
</Location>

Alle Anfragen auf die Ressource /hello werden auf den lokalen Port 5000 umgeleitet. Wenn wir Starman starten, hört er standardmässig auf dem Port 5000:

starman /instances/home/ndev0/Hello/hello.psgi

Danach ist unsere PSGI-Applikation von aussen erreichbar:

https://n-vermeul.ethz.ch/hello=

Jetzt muss nur noch erreicht werden, dass beim Start und Stop des Apache-Servers gleichzeitig auch Starman gestartet respektive gestoppt wird. Für diese Zwecke benötigen wir ein Startup-Skript, welches unter ~/init.d/starman abgelegt wird. Es enthält folgendes:

#!/bin/bash

start() {
 # detach from console
 # close standard input      <&-
 # redirect standard output  1>/dev/null
 # redirect standard error   2>&1
  /instances/home/ndev0/perl5/perlbrew/perls/perl-5.16.3/bin/starman -D --pid=/instances/home/ndev0/var/starman.pid /instances/home/ndev0/Hello/hello.psgi 2>&1
 return 0
}

stop() {
 if [ -f /instances/home/ndev0/var/starman.pid ]
 then
   kill -QUIT `cat /instances/home/ndev0/var/starman.pid`
   rm -f /instances/home/ndev0/var/starman.pid
 fi
 return 0
}

restart() {
 stop
 start
 return 0
}

ACTION=$1
shift

case ${ACTION} in
 start)
   start
   ;;
 stop)
   stop
   ;;
 restart)
   restart
   ;;
 *)
   echo "Usage: $prog {start|stop|restart}"
esac

Wir bitten also Starman, beim Start die Prozessnummer in ein File ~/var/starman.pid zu schreiben und danach mit -D in den Hintergrund zu gehen. Für den Stopp lesen wir die Prozessnummer aus diesem File aus, stoppen den Prozess mit kill -QUIT Prozessnummer und löschen danach das File wieder.

Wenn starman mit cpanm installiert wird, ist es standardmässig nicht auf «executable» gesetzt. Das holen wir nun nach:

chmod +x ~/perl5/perlbrew/perls/perl-5.16.3/bin/starman

Zur Kontrolle ob wir alles richtig gemacht haben, starten wir den Apache-Server neu und sehen nun plötzlich folgendes:

/etc/init.d/web restart ndev0
[ndev0] stopping httpd:                                    [  OK  ]
[ndev0] starting httpd:                                    [  OK  ]
[ndev0] stopping nmbd:                                     [  OK  ]
[ndev0] stopping smbd:                                     [  OK  ]
[ndev0] starting smbd:                                     [  OK  ]
[ndev0] starting nmdb:                                     [  OK  ]
[ndev0] stopping starman:                                  [  OK  ]
[ndev0] starting starman:                                  [  OK  ]

-- SwenVermeul - 2015-06-12

Topic revision: r1 - 2015-06-12 - vermeul
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2017 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback