Direktiven von Plesk deaktivieren/überschreiben

NorbertH

Registered User
Also erstmal bin ich neu hier. Ich lese zwar schon eine Weile mit, aber das ist mein erster Beitrag. Hier im Forum, bei Huschi.net und auch bei SwSoft konnte ich nix finden.

Ich versuche meinen Apache 2.0 daran zu hindern CGI-Skripten überall im DocumentRoot auszuführen.

Mein Plesk 7.5.4 hat in vorauseilendem Gehorsam bereits in die httpd.include meiner Domain folgendes hineingeschrieben:

Code:
        ScriptAlias  /cgi-bin/ /var/www/vhosts/meine.domain/cgi-bin/
...
        <Directory /var/www/vhosts/meine.domain/httpdocs>
        <IfModule mod_perl.c>
        <Files ~ (\.pl$)>
                SetHandler perl-script
                PerlHandler ModPerl::Registry
                Options ExecCGI
                allow from all
                PerlSendHeader On
        </Files>
        </IfModule>
...

mod_perl ist eingeschaltet und soll es auch bleiben.
In der apache2.conf ist der AddHandler cgi-script auskommentiert.

Soweit ich die Direktiven oben verstehe werden damit alle Dateien im DocumentRoot als perl-script behandelt sofern sie die Endung .pl haben. Das deckt sich auch mit meinen Tests. test.pl wird innerhalb und außerhalb des cgi-bin ausgeführt. test.cgi wird weder innerhalb noch außerhalb des cgi-bin ausgeführt.

Da ich die httpd.include nicht editieren soll, sondern die vhost.conf nutzen soll, stellt sich mir die Frage wie ich die bereits geschriebene Direktive deaktiviere/überschreibe?

Denn eigentlich möchte ich Scripten nur im cgi-bin haben und dort sollen sie auch .cgi heißen dürfen.

Merci für jede Hilfe.
 
NorbertH said:
mod_perl ist eingeschaltet und soll es auch bleiben.
Sicher, daß Du mod_perl brauchst? Es ist nicht nötig um Perl-Scripte auszuführen. mod_perl ist nämlich genau das Gegenteil von CGI.

test.cgi wird weder innerhalb noch außerhalb des cgi-bin ausgeführt.
Weil Dir ein "AddHandler cgi-script .cgi" fehlt.

huschi.
 
Also zunächst einmal herzlichen Dank für die Hilfe.

Allerdings stellst Du mit der Aussage
... mod_perl ist nämlich genau das Gegenteil von CGI.
mein Weltbild auf den Kopf. :( ... Na vielleicht ist das ganz gut so ;)

mod_perl will ich, weil ich gelesen habe, dass damit meine CGI-Skripten (in Perl geschrieben) schneller ausgeführt werden. Eben weil mod_perl den Interpreter im Arbeitsspeicher hält. Und schneller ist immer gut!

Soweit also meine "naiven" Vorstellungen. Inzwischen habe ich mod_perl- und CGI-Unterstützung unter Plesk abgedreht und in die vhost.conf folgendes hineingeschrieben:
Code:
<Directory /var/www/vhosts/meine.domain/httpdocs/cgi-bin>
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
Options ExecCGI
</Directory>

Jetzt wird mein ursprünglicher Wunsch die CGI-Skripten nur im cgi-bin-Verzeichnis zu haben und nur dort ausführbar zu haben anscheinend erfüllt.
Meine Test-Skipten sind ausreichend schnell am Schirm, aber ich mache mir doch Sorgen, um die Performance im Echtzeitbetrieb zumal die Original-Skripten auch auf eine große MySQL-Datenbank zugreifen.

Und genau da fängt mein ursprüngliches Problem wieder an:

Wie deaktiviere/überschreibe ich die Direktiven, die sich Plesk für mich ausdenkt, wenn Sie einfach nicht meinem Wunsch entsprechen?

Ich habe den Eindruck, dass die Einträge in de vhost.conf ERGÄNZEND wirken und nicht anstatt. Ich brauche also sowas wie eine DontDoThat-Direktive.
 
NorbertH said:
Allerdings stellst Du mit der Aussage
...
mein Weltbild auf den Kopf. :(
Ließ dazu auch CGI vs. Apache-Modul.
Beachte dabei, daß mod_perl ein Apache-Modul ist und eben nicht mehr CGI (Common-Gateway-Interface).

mod_perl will ich, weil ich gelesen habe, dass damit meine CGI-Skripten (in Perl geschrieben) schneller ausgeführt werden.
Dafür müssen sie aber auch an mod_perl angepaßt sein... :)

Und schneller ist immer gut!
Ähem ähem...
Frag mal Deine Frau/Freundin... :D
...und Computer sind manchmal wie eine Frau.

Jetzt wird mein ursprünglicher Wunsch die CGI-Skripten nur im cgi-bin-Verzeichnis zu haben und nur dort ausführbar zu haben anscheinend erfüllt.
Dann kannst Du auch dort auch die mod_perl-Unterstützung eintragen.
Ist wahrscheinlich besser als Plesk's Einstellungen.

aber ich mache mir doch Sorgen, um die Performance im Echtzeitbetrieb zumal die Original-Skripten auch auf eine große MySQL-Datenbank zugreifen.
Nach meinen Einschätzungen und Erfahrungen ist die Datenbank weitaus langsamer als Deine Perl-Scripts. Bei echten Performance-Problemen solltest Du besser an Deinem Script optimieren. Perl läßt hier viel viel viel Spielraum.

Ich habe den Eindruck, dass die Einträge in de vhost.conf ERGÄNZEND wirken und nicht anstatt.
Richtig. Das liegt im Grundsatz der Apache-Konfiguration.

huschi.
 
OK, ich lasse es erstmal beim CGI. So rennt die Kiste wenigstens.

Und morgen versuche ich dann gleich mein ersten mod_perl Skript zu schreiben. Und das gleich aus dem "versteckten" cgi-bin-Verzeichnis, dass sich außerhalb von

/var/www/vhosts/meine.domain/httpdocs/

in

/var/www/vhosts/meine.domain/cgi-bin/

DANKE für die Hilfe!

Und außerdem gilt: Je weniger Plesk, desto besser ;)
 
cgi und mod_perl gleichzeitig

Und da stellt sich auch gleich die nächste Frage:

Wie schaffe ich es sowohl cgi also auch mod_perl auf einem System laufen zu lassen?

Wenn ich es richtig begriffen habe, dann dürfte das gar nicht gehen, zumindest nicht unter Plesk. Denn Plesk kann ja nur mod_perl für die ganze Domain einschalten bzw. abschalten.

Oder gibt es vielleicht doch einen Trick, den ein Anfänger wie ich vor lauter Plesk nicht sieht?
 
Last edited by a moderator:
NorbertH said:
Wie schaffe ich es sowohl cgi also auch mod_perl auf einem System laufen zu lassen?
Die entsprechenden Anweisungen stehen ja schon oben in Deinem ersten Thread. Das ganze in <Directory .../cgi-bin> eingepackt und in die vhost.conf geschrieben. Das reicht schon.
Du mußt lediglich mit den Handlern für die Extensions aufpassen:
".cgi" z.B. sollte besser immer für CGI-Scripte bleiben.
Und dafür ".pl" dann entsprechende für mod_perl.

huschi.
 
Oh yes!!

Da hatte ich ja einen schweren Denkfehler :o . Allerdings hat das auch seinen Grund. Meine jetzigen Skripten haben sowohl die Endung .cgi als auch .pl

Plesk sorgt wohl dafür, dass mit mod_perl alle .pl Skripten geladen werden.

Ich sollte also alle jetzigen .pl's in .cgi umbenennen damit das eine saubere Trennung wird. ... Puhhh, das wird mir dann doch zu stressig.

Ich probiere mal das mod_perl ohne Plesk zu laden und dann in der vhost.conf die entsprechende Direktive für Skripten mit einer neuen Endung (z.B. .mpl) zu setzen. Das hätte den Vorteil, dass ich meine alten Skripten unangetastet lassen kann und mich trotzdem weiterentwickeln kann. ;)

Ich lasse euch wissen ob's funzt.
 
YES!!!

Es funzt :D

Aber Achtung an alle Nutzer der Plesk Power Toys. Der vhost conf writer maskiert die Zeichen \ und $ als HTML-Code, wodurch die Direktive
Code:
...
<Files ~ (\.mpl$)>
...
falsch eingetragen wird. Ein editieren der vhost.conf via ssh war bei mir notwendig.

DANKE, DANKE, DANKE an alle und jetzt gehe ich neue superschnelle Skripten schreiben ...
 
NorbertH said:
Aber Achtung an alle Nutzer der Plesk Power Toys. Der vhost conf writer maskiert die Zeichen \ und $ als HTML-Code...
Falls Du immer wiederkehrende Dinge in die vhost.conf schreibst, sieh dir mal die Pesk Dokumentation zu Ereignisverwaltung an: http://download1.swsoft.com/Plesk/Plesk7.5/Doc/plesk-7.5r-admins-guide-html/ch02s26.html. Damit kann man das automatisieren. Ich nutzte es, um die PHP Einstellungen meiner erzeugten Domains, Subdomains und Webuser anzupassen:

Server > Ereignis-Verwaltung > Web-Benutzer-Account erstellt:
Code:
/usr/local/bin/newwebuser.sh <old_domain_name> <new_webuser_name>
newwebuser.sh
Code:
#!/bin/bash
cat <<EOF >>/var/www/vhosts/$1/conf/vhost.conf
<Directory /var/www/vhosts/$1/web_users/$2>
	<IfModule sapi_apache2.c>
		php_admin_value open_basedir none
		php_admin_value open_basedir /var/www/vhosts/$1/web_users/$2/
		php_admin_value upload_tmp_dir /var/www/vhosts/$1/tmp
		php_admin_value safe_mode_exec_dir /var/www/vhosts/$1/bin
		php_admin_value session.save_path /var/www/vhosts/$1/var
	</IfModule>
	<IfModule mod_php5.c>
		php_admin_value open_basedir none
		php_admin_value open_basedir /var/www/vhosts/$1/web_users/$2/
		php_admin_value upload_tmp_dir /var/www/vhosts/$1/tmp
		php_admin_value safe_mode_exec_dir /var/www/vhosts/$1/bin
		php_admin_value session.save_path /var/www/vhosts/$1/var
	</IfModule>
</Directory>
EOF
/usr/local/psa/admin/sbin/websrvmng -ur --vhost-name=$1
Gruß flyingoffice
 
Last edited by a moderator:
habe nun mal in die vhost.conf dieses eingetragen, trotzdem läöuft mod_perl nicht oder ist der aufruf domain.de - Domainabfrage falsch für ein testscript ?

Code:
ScriptAlias  /perl/ /var/www/vhosts/reserve-domain.de/cgi-bin/

        <Directory /var/www/vhosts/reserve-domain.de/cgi-bin>
        <IfModule mod_perl.c>
        <Files ~ (\.pl$)>
                SetHandler perl-script
                PerlHandler ModPerl::Registry
                Options ExecCGI
                allow from all
                PerlSendHeader On
        </Files>
        </IfModule>
				</Directory>
lg Dirk
 
Wenn Du mod_perl einsetzten willst ist ExecCGI falsch. CGI und Mod geht nicht gleichzeitig, denn as sind zwei verschiedene Dinge!

Und dann bin ich mir mit Deinem Files-Eintrag unsicher.
Ich habe einfach folgendes:
Code:
<Files *.pl>

huschi.
 
Ich habe es nun so in die vhost.conf eingetragen.

Code:
ScriptAlias /perl /srv/www/vhosts/reserve-distanzchat.de/cgi-bin
ScriptAlias /cgi-perl /srv/www/vhosts/reserve-distanzchat.de/cgi-bin

<Location /perl>
  SetHandler perl-script
#	Options +ExecCGI
	PerlSendHeader On
	allow from all
</Location>
<Directory /srv/www/vhosts/reserve-distanzchat.de/cgi-bin>
	<IfModule mod_perl.c>
		<Files *.pl>
			SetHandler perl-script
			PerlHandler Apache::Registry
#			Options ExecCGI
			allow from all
			PerlSendHeader On
		</Files>
	</IfModule>
</Directory>

Kann zwar das Testscript nun mit http://www.reserve-distanzchat.de/perl/test.pl aufrufen, aber das script sagt mir
Schade, kein Mod_Perl installiert!

Noch jemand eine Idee was ich da falsch mache ?

Dirk
 
Dann sind evtl. noch an anderen Stellen Direktiven für CGI in cgi-bin gesetzt.
Denn cgi-bin hat seinen Namen von der CGI-Schnittstelle.
Perl-Mod hat man z.B. in einem Verzeichnis namens "perl" oder ähnliches um es eben vom CGI abzugrenzen.

Zum anderen ist die Frage wie test.pl feststellt ob es unter CGI oder mod_perl läuft. Wenn es nur Env-Variablen abfragt, kann dies schon mal in die Hose gehen. Er müßte wirklich eine Abfrage auf die Apache::API machen um es einwandfrei festzustellen.

huschi.
 
oki, habe die vhost.conf mal so angepasst, ist das richtig ?

Code:
ScriptAlias /perl /srv/www/vhosts/reserve-distanzchat.de/cgi-perl
ScriptAlias /cgi-perl /srv/www/vhosts/reserve-distanzchat.de/cgi-perl

<Location /perl>
  SetHandler perl-script
#	Options +ExecCGI
	PerlSendHeader On
	allow from all
</Location>
<Directory /srv/www/vhosts/reserve-distanzchat.de/cgi-perl>
	<IfModule mod_perl.c>
		<Files *.pl>
			SetHandler perl-script
			PerlHandler Apache::Registry
#			Options ExecCGI
			allow from all
			PerlSendHeader On
		</Files>
	</IfModule>
</Directory>

und das testscript macht wirklich diese ENV abfrage, siehe:

Code:
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html>";
print "<head>";
print "</head>";
print "<body text='#000000' bgcolor='#E0E0E0' link='#FF0000' alink='#FF0000' vlink='#FF0000'>";
print "<br>";
if ($ENV{GATEWAY_INTERFACE} =~ /MOD_PERL/) {
     print "Herzlichen Glückwunsch $ENV{MOD_PERL} ist installiert";
} else {
     print "Schade, kein Mod_Perl installiert!";
}
print "</body>";
print "</html>";

wie müßte denn eine richtige abfrage aussehen ?

lg Dirk
 
Last edited by a moderator:
so dank google noch was gefunden denke ich,

Code:
#!/usr/bin/perl -W


use strict;
# Benutzung der Perl5 CGI-Bibliothek
use CGI;
#
use DBI;

my $query = new CGI;

print $query->header;
print "<!doctype html public \"-//W3C/DTD HTML 4.0/EN\">\n";

print $query->start_html(-title=>'Testseite f¸r CGI via
Perl',-author=>'Andreas Grupp',-BGCOLOR=>'white');
print "<H2>Testseite f&uuml;r Perl via CGI</H2>\n";

print "<H3>Jetzt testen wir erst mal die Umgebung in der dieses Skript
l&auml;uft</H3><OL>\n";


print "<LI>";
if(exists $ENV{MOD_PERL}) {
   #we're running under mod_perl
   print "Skript l&auml;uft unter <B>mod_perl Version ". $ENV{MOD_PERL} .
"</B>\n";
}
else {
   #we're NOT running under mod_perl
   print 'Umgebungsvariable $ENV{MOD_PERL} nicht gefunden. Skript l&auml;uft
demnach nicht unter mod_perl.' . "\n";
}        
#-----------------------------------------------------
print "<LI>";
if ( $CGI::VERSION ne "" ){
    print "Es wird das Perl5 CGI-Modul <B>CGI.pm Version $CGI::VERSION </B>
verwendet!\n";
}
else{
    print "Perl5 CGI-Modul CGI.pm scheint nicht vorhanden zu sein!\n";
}
#-----------------------------------------------------
print "<LI>";
if ( $DBI::VERSION ne "" ){
   print "<B>DBI-Modul-Version $DBI::VERSION </B> wurde geladen.<BR>\n";
   my @drivers = DBI->available_drivers;
   my $i=0;
   my $drivers_num = @drivers;
   print "Es wurden <B>$drivers_num DBD-Treiber</B> gefunden!<BR>\n";

   if ($drivers_num > 0 ) {
     print "<UL>\n";
     while ( $i < $drivers_num ){
       print "<LI>Treiber[$i]: <B>" . $drivers[$i] . "</B>\n";
       $i++;
     }
     print "</UL>\n";
   } 
}
else{
   print "DBI wurde nicht gefunden!\n";
}
print "</OL>\n";


print "Server Name:      ", $ENV{'SERVER_NAME'}, "<BR>", "\n";
print "Running on Port:  ", $ENV{'SERVER_PORT'}, "<BR>", "\n";
print "Server Software:  ", $ENV{'SERVER_SOFTWARE'}, "<BR>", "\n";
print "Server Protocol:  ", $ENV{'SERVER_PROTOCOL'}, "<BR>", "\n";
print "CGI Revision:     ", $ENV{'GATEWAY_INTERFACE'}, "<BR>", "\n";
print "<HR></PRE>", "\n";

# Erzeuge HTML-Footer
print $query->end_html();

Dieses habe ich gefunden zum Testen ob mod_perl läuft.

Die ausgabe ergibt dieses.

Code:
Testseite für Perl via CGI
Jetzt testen wir erst mal die Umgebung in der dieses Skript läuft
Skript läuft unter mod_perl Version mod_perl/2.0.2 
Es wird das Perl5 CGI-Modul CGI.pm Version 3.15 verwendet! 
DBI-Modul-Version 1.50 wurde geladen.
Es wurden 6 DBD-Treiber gefunden!

Treiber[0]: DBM 
Treiber[1]: ExampleP 
Treiber[2]: File 
Treiber[3]: Proxy 
Treiber[4]: Sponge 
Treiber[5]: mysql 
Server Name: www.reserve-distanzchat.de
Running on Port: 80
Server Software: Apache/2.2.0 (Linux/SUSE)
Server Protocol: HTTP/1.1
CGI Revision: CGI/1.1

Sehe ich das richtig das mod_perl nun läuft ?

Habe das alte script mal etwas angepasst, ist das so richtig zum Testen von mod_perl ?

Code:
#!/usr/bin/perl
use strict;
use CGI;

print "Content-type: text/html\n\n";
print "<html>";
print "<head>";
print "</head>";
print "<body text='#000000' bgcolor='#E0E0E0' link='#FF0000' alink='#FF0000' vlink='#FF0000'>"; print "<br>"; if(exists $ENV{MOD_PERL}){print "Herzlichen Glückwunsch $ENV{MOD_PERL} ist installiert";} else {print "Schade, kein Mod_Perl installiert!";} print "</body>"; print "</html>";

Rufe ich das con mir angepasste script nun so auf
http://www.reserve-distanzchat.de/perl/modperl.cgi

kommt als antwort:
Herzlichen Glückwunsch mod_perl/2.0.2 ist installiert

rufe ich es aber so auf
http://www.reserve-distanzchat.de/cgi-bin/modperl.cgi

kommt als antwort
Schade, kein Mod_Perl installiert!

Sehe ich nun richtig das mod_perl läuft wenn ich es mit perl aufrufe ?

Wi mache ich denn eine abfrage mit Apache::API ?

lg Dirk
 
Back
Top