Tags:
create new tag
, view all tags

Apache und mod_perl

mod_perl ist eine Komponente, die mit dem Serverstart von Apache geladen wird und sicherstellt, dass der Perl-Interpreter bereits läuft, sobald eine Anfrage kommt. Dies beschleunigt die Antwortzeiten gegenüber dem klassischen cgi-Modus beträchtlich.

In unserer Infrastruktur ist die Perl-Version unabhängig vom jeweillgen System-Perl. Mit perlbrew können problemlos mehrere Perl-Versionen nebenainander existieren, auch die Installation einer neuen Perl-Version ist dadurch ein Kinderspiel. Allerdings muss bei der Verwendung von mod_perl die Perl-Version richtig kompiliert werden. Dazu müssen die entsprechenden Flags richtig gesetzt werden (siehe auch Apache mod_perl Dokumentation)

perlbrew install perl-5.16.3 -Dusethreads -Duselargefiles -Accflags=-fPIC -Dcccdlflags=-fPIC -Duse64bitall -Dpager/usr/bin/less -Doptimize=-O2

  • -Dusethreads macht die Perl-Version multithreading-fähig
  • -Accflags=-fPIC wichtigstes Flag, ohne das schlägt das spätere make fehl
  • -Dcccdlflags=-fPIC ev. obsolet oder wird ignoriert, müsste man noch testen
  • -Duse64bitall durchwegs 64-bit verwenden
  • -Dpager/usr/bin/less Pager-Programm (less oder more)
  • -Doptimize=-O2 Irgend eine Defragmentierungs-Option, ich habe keine gute Dokumentation darüber gefunden, kann möglicherweise weggelassen werden

Nach einer kleinen Ewigkeit ist dann die neue Perl-Version installiert und kann mit perl -V überprüft werden.

$ perl -V
Summary of my perl5 (revision 5 version 16 subversion 3) configuration:
   
  Platform:
    osname=linux, osvers=2.6.32-431.20.3.el6.x86_64, archname=x86_64-linux-thread-multi
    uname='linux absolutelyfree.ethz.ch 2.6.32-431.20.3.el6.x86_64 #1 smp fri jun 6 18:30:54 edt 2014 x86_64 x86_64 x86_64 gnulinux '
    config_args='-de -Dprefix=/instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3 -Dusethreads -Duselargefiles -Dcccdlflags=-fPIC -Duse64bitall -Dpager/usr/bin/less -Doptimize=-O2 -Accflags=-fPIC -Aeval:scriptdir=/instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/bin'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fPIC -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
    optimize='-O2',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fPIC -fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.4.7 20120313 (Red Hat 4.4.7-4)', gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
    libpth=/usr/local/lib /lib/../lib64 /usr/lib/../lib64 /lib /usr/lib /lib64 /usr/lib64 /usr/local/lib64
    libs=-lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=, so=so, useshrplib=false, libperl=libperl.a
    gnulibc_version='2.12'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -L/usr/local/lib -fstack-protector'


Characteristics of this binary (from libperl): 
  Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS
                        PERL_DONT_CREATE_GVSV PERL_IMPLICIT_CONTEXT
                        PERL_MALLOC_WRAP PERL_PRESERVE_IVUV USE_64_BIT_ALL
                        USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES
                        USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE
                        USE_LOCALE_NUMERIC USE_PERLIO USE_PERL_ATOF
                        USE_REENTRANT_API
  Built under linux
  Compiled at Sep 23 2014 12:24:42
  %ENV:
    PERLBREW_BASHRC_VERSION="0.64"
    PERLBREW_HOME="/instances/home/idnt/.perlbrew"
    PERLBREW_MANPATH="/instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/man"
    PERLBREW_PATH="/instances/home/idnt/perl5/perlbrew/bin:/instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/bin"
    PERLBREW_PERL="perl-5.16.3"
    PERLBREW_ROOT="/instances/home/idnt/perl5/perlbrew"
    PERLBREW_VERSION="0.64"
  @INC:
    /instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3/x86_64-linux-thread-multi
    /instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/lib/site_perl/5.16.3
    /instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/lib/5.16.3/x86_64-linux-thread-multi
    /instances/home/idnt/perl5/perlbrew/perls/perl-5.16.3/lib/5.16.3
    .

mod_perl compilieren und installieren

  • wget http://mirror.switch.ch/mirror/apache/dist/perl/mod_perl-2.0.8.tar.gz
  • tar tzvf mod_perl-2.0.8.tar.gz tar-File überprüfen
  • tar xzvf mod_perl-2.0.8.tar.gz tar-File entpacken
  • cd mod_perl-2.0.8/
  • perl Makefile.PL MP_AP_DESTDIR=~/perl5/httpd-2.0/modules Makefile erstellen (Konfiguration)
    • MP_AP_DESTDIR wird festgelegt um sicherzustellen, dass die Distribution nicht unter /usr/include/httpd/ installiert wird (dazu benötigte man mehr Rechte)
  • make die Distribution compilieren (unter Verwendung des Makefiles)
  • make test Testsuiten durchlaufen
  • make install Distribution installieren

Apache konfigurieren

Wenn alles erfolgreich installiert ist, kann man im Konfigurationsfile ~/conf/httpd.conf des Apache angeben, welches mod_perl zu verwenden ist:

LoadModule perl_module /instances/home/idnt/perl5/httpd-2.0/modules/usr/lib64/httpd/modules/mod_perl.so

Alias /modperl_test/ /instances/home/idnt/modperl_test/
<Location /modperl_test/>
    SetHandler perl-script
    PerlResponseHandler ModPerl::Registry
    PerlOptions +ParseHeaders
    Options +ExecCGI
    Order allow,deny
    Allow from all 
</Location>

Danach muss man mit sudo /instances/svn/bin/w restart den Server neu starten. Im Logfile des Apache-Server tail -f ~/var/log/httpd/error_log sieht man nun folgende Zeilen:

[Tue Sep 23 16:26:35 2014] [notice] Digest: generating secret for digest authentication ...
[Tue Sep 23 16:26:35 2014] [notice] Digest: done
[Tue Sep 23 16:26:35 2014] [notice] Apache/2.2.15 (Unix) DAV/2 mod_ssl/2.2.15 OpenSSL/1.0.1e-fips mod_perl/2.0.8 Perl/v5.16.3 configured -- resuming normal operations

-- SwenVermeul - 2014-09-23

Topic revision: r3 - 2015-05-13 - 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