Toon posts:

[Perl] problemen met use lib en STDERR onder mod_perl2

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een webapplicatie in Perl die bestaat uit een script.pl en diverse modules, die allemaal in dezelfde dir staan (/www/domein/cgi-bin/). Als server draai ik apache2 met mod_perl2, en PerlRun als PerlHandler.

Als ik het script vanaf de console start werkt ie prima. Wanneer ik het via de browser oproep krijg ik een 500 server error, de logs zeggen dan dat perl de module "Configuration.pm" niet kan vinden. Dit is de allereerste (eigen) module die ik mbv "use Configuration;" include.

Wanneer ik "use lib '/www/domein/cgi-bin';" bovenaan erbijzet werkt de applicatie wel, maar ik wil als het even kan liever geen harde paden in mijn code hebben. De app moet op vele verschillende configuraties kunnen werken zonder dat de code aangepast hoeft te worden. Daar heb ik een config file voor.

Het bizarre is ook dat wanneer ik met behulp van de var $0 of met FindBin::Bin de huidige dir probeer te bepalen, dit niet werkt. Sterker nog, dit werkt wel:

code:
1
use lib "/www/domein/cgi-bin";


Maar dit werkt niet:
code:
1
2
my $bla = "/www/domein/cgi-bin";
use lib $bla;


Steek mij maar lek....

Verder heb ik ook problemen met gebruik van STDERR. Voor het domein heb ik een eigen apache error log gedefinieerd, en daar komen ook netjes alle perl errors van het domein in terecht. Maar als ik vanuit de applicatie een 'print STDERR "blaat"' doe dan komt dat opeens weer in de main error log :?
Erg vaag allemaal.

Onder de CGI versie van perl werkt het script trouwens volledig zonder de hier beschreven problemen.

Ik ben hier al 2 dagen mee aan het rotzooien, alles aan het doorlezen wat ik kan vinden maar ik kom geen steek verder en word er helemaal leip van. Ik overweeg bijna gewoon maar standaard CGI te gaan gebruiken. Kan iemand hier misschien wat opheldering verschaffen?

Verwijderd

Topicstarter
Okee, ik ben er inmiddels achter dat ik als PerlHandler PerlRunPrefork moet gebruiken, daarmee is het "use lib" probleem opgelost. PerlRun chdir't niet naar de dir van het script, PerlRunPrefork wel.

Maar nu zit ik nog wel met het probleem dat alle runtime errors van de applicatie in domein-error.log komen maar mijn print STDERR's in error.log... dat is lastig bij debuggen.

  • sam.vimes
  • Registratie: Januari 2007
  • Laatst online: 08-06 08:44
Verwijderd schreef op zaterdag 12 mei 2007 @ 23:09:
[...]
Maar dit werkt niet:
code:
1
2
my $bla = "/www/domein/cgi-bin";
use lib $bla;


Steek mij maar lek....
Het 'use' statement wordt tijdens 'compile time' (voor zover je bij Perl daarvan kunt spreken) uitgevoerd, dus als het script voor het eerst wordt geladen, het 'my' statement pas daarna, tijdens run-time. Tijdens de 'use lib $bla;' is de variabele $bla dus nog ongedefinieerd.
Verder heb ik ook problemen met gebruik van STDERR. Voor het domein heb ik een eigen apache error log gedefinieerd, en daar komen ook netjes alle perl errors van het domein in terecht. Maar als ik vanuit de applicatie een 'print STDERR "blaat"' doe dan komt dat opeens weer in de main error log :?
Erg vaag allemaal.
Hoe heb je dit voor elkaar proberen te krijgen (code, conf)?
Wat bedoel je met 'het domein'?

Verwijderd

Topicstarter
sam.vimes schreef op maandag 14 mei 2007 @ 08:54:

Hoe heb je dit voor elkaar proberen te krijgen (code, conf)?
Wat bedoel je met 'het domein'?
Ik heb op mijn (debian) server een default apache config voor de mensen die via ipadres binnenkomen op mijn webserver. Alle logs daarvan gaan naar error.log cq access.log. Daarnaast heb ik een aantal virtual hosts erop draaien die hun eigen logfile gedefinieerd hebben in de apache config, bijv domein.nl-error.log. Nu komen alle compile en runtime errors van het perl script wel in domein.nl-error.log maar als ik vanuit datzelfde perl script een "print STDERR 'blaat'" doe dan komt dat opeens in error.log. Ook warnings komen trouwens in error.log ipv domein.nl-error.log.

Met de CGI versie van perl had ik dit probleem niet, toen kwam alles gewoon in de juiste logfiles. Het is begonnen na de overstap op mod-perl. Ik heb echter behalve het installeren van modperl en het aanpassen van de handler naar modperl (voor slechts 1 domein, niet sitewide) geen andere dingen aangepast.

voorbeeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl

use strict;
use warnings;

ditgenereerteenerror!   # compile error; komt in domein.nl-error.log

print STDERR "blaat"; # dit komt in error.log terecht

my $leeg;
my $nietleeg="nietleeg";
my $combinatie = $leeg . $nietleeg;  # warning over uninitialized value komt in error.log terecht


De betreffende config file voor het domein:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName www.domein.nl


        DocumentRoot /www/domein.nl/webroot/
        <Directory />
                Options FollowSymLinks
                AllowOverride All
        </Directory>
        <Directory /www/domein.nl/webroot>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ErrorLog /var/log/apache2/domein.nl-error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/domein.nl-access.log combined
        ServerSignature Off

        Alias /cgi-bin/ /www/domein.nl/cgi-bin/
        <Directory "/www/domein.nl/cgi-bin">
                SetHandler perl-script
                PerlHandler ModPerl::PerlRunPrefork
                PerlOptions +ParseHeaders
                PerlInitHandler Apache2::Reload
                PerlSetVar ReloadAll On
                Options ExecCGI FollowSymLinks
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>