Chris: Apache & CGI funktioniert nur mangelhaft

Hallo,

Ich bin ein wenig am verzweifeln: Ich habe RedHat 7.1 installiert mit Apache und mod_perl. Hab den Apache nun so konfiguriert, das er das macht, was ich haben will. Wenn ich jedoch ein Perl-Script aufrufe, bekomme ich dauernd einen internen Serverfehler. Ausser wenn es was ganz simples ist (z.B. echo "irgendwas" oder der gleichen), dann führt er es sehr wohl aus. Hab zum testen nun einmal ein Formmailer-Skript von Matt's Archiv genommen und eingebunden, aber da ist genau das selbe. Im Log steht leider auch nicht mehr drinnen, als interner Serverfehler.

Habe schon dutzende Docus gelesen, das Inernet durchsucht, das Buch von Oreilly aufgesaugt und die Man-Page vom Mod_perl verschlungen, aber ich komm einfach nicht drauf, was ich falsch gemacht haben könnte. Hab dann auch mal die neueste Version von Apache und mod_perl eingespielt, aber das hat auch nichts gebracht.

Was hab ich vergessen zu beachten?

Wäre echt mega Dankbar, wenn mich wer von der Leitung heben könnte, bevor ich noch total ausflippe  :-)

Vielleicht hilft es ja auch, wenn ich einfach einmal die httpd.conf mit reinschreibe:

Global Environment

ServerType standalone ServerRoot "/etc/httpd" Timeout 600 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 30 MinSpareServers 15 MaxSpareServers 30 StartServers 25 MaxClients 250 MaxRequestsPerChild 30 LockFile /var/lock/httpd.lock PidFile /var/run/httpd.pid ScoreBoardFile /var/run/httpd.scoreboard

'Main' Server configuration

Listen 80 Port 80 User apache Group apache ServerAdmin root@localhost ServerName localhost DocumentRoot "/var/www/html" ServerSignature On AccessFileName .htaccess UseCanonicalName On HostnameLookups On ErrorLog /var/log/httpd/error_log LogLevel warn IdentityCheck On ServerTokens ProductOnly

LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule env_module         modules/mod_env.so LoadModule config_log_module  modules/mod_log_config.so LoadModule agent_log_module   modules/mod_log_agent.so LoadModule referer_log_module modules/mod_log_referer.so LoadModule mime_module        modules/mod_mime.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule status_module      modules/mod_status.so LoadModule info_module        modules/mod_info.so LoadModule includes_module    modules/mod_include.so LoadModule autoindex_module   modules/mod_autoindex.so LoadModule dir_module         modules/mod_dir.so LoadModule cgi_module         modules/mod_cgi.so LoadModule asis_module        modules/mod_asis.so LoadModule imap_module        modules/mod_imap.so LoadModule action_module      modules/mod_actions.so LoadModule userdir_module     modules/mod_userdir.so LoadModule alias_module       modules/mod_alias.so LoadModule rewrite_module     modules/mod_rewrite.so LoadModule access_module      modules/mod_access.so LoadModule auth_module        modules/mod_auth.so LoadModule anon_auth_module   modules/mod_auth_anon.so LoadModule db_auth_module     modules/mod_auth_db.so LoadModule expires_module     modules/mod_expires.so LoadModule headers_module     modules/mod_headers.so LoadModule setenvif_module    modules/mod_setenvif.so LoadModule includes_module    modules/mod_include.so <IfDefine HAVE_PERL> LoadModule perl_module        modules/libperl.so </IfDefine> <IfDefine HAVE_PHP> LoadModule php_module         modules/mod_php.so </IfDefine> <IfDefine HAVE_PHP3> LoadModule php3_module        modules/libphp3.so </IfDefine> <IfDefine HAVE_PHP4> LoadModule php4_module        modules/libphp4.so </IfDefine> <IfDefine HAVE_DAV> LoadModule dav_module         modules/libdav.so </IfDefine> <IfDefine HAVE_ROAMING> LoadModule roaming_module     modules/mod_roaming.so </IfDefine> <IfDefine HAVE_SSL> LoadModule ssl_module         modules/libssl.so </IfDefine>

ClearModuleList AddModule mod_vhost_alias.c AddModule mod_env.c AddModule mod_log_config.c AddModule mod_log_agent.c AddModule mod_log_referer.c AddModule mod_mime.c AddModule mod_negotiation.c AddModule mod_status.c AddModule mod_info.c AddModule mod_include.c AddModule mod_autoindex.c AddModule mod_dir.c AddModule mod_cgi.c AddModule mod_asis.c AddModule mod_imap.c AddModule mod_actions.c AddModule mod_userdir.c AddModule mod_alias.c AddModule mod_rewrite.c AddModule mod_access.c AddModule mod_auth.c AddModule mod_auth_anon.c AddModule mod_auth_db.c AddModule mod_expires.c AddModule mod_headers.c AddModule mod_so.c AddModule mod_setenvif.c

<IfDefine HAVE_PERL> AddModule mod_perl.c </IfDefine> <IfDefine HAVE_PHP> AddModule mod_php.c </IfDefine> <IfDefine HAVE_PHP3> AddModule mod_php3.c </IfDefine> <IfDefine HAVE_PHP4> AddModule mod_php4.c </IfDefine> <IfDefine HAVE_DAV> AddModule mod_dav.c </IfDefine> <IfDefine HAVE_ROAMING> AddModule mod_roaming.c </IfDefine> <IfDefine HAVE_SSL> AddModule mod_ssl.c </IfDefine>

ExtendedStatus Off

<Directory />     AuthUserFile  /etc/httpd/passwd     AuthGroupFile /etc/httpd/group     Options None     AllowOverride None </Directory>

<Directory "/var/www/html">     Options None     AllowOverride None     Order allow,deny     Allow from all </Directory>

DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.pl

<Files ~ "^.ht">     Order allow,deny     Deny from all </Files>

TypesConfig /etc/mime.types DefaultType text/plain

<IfModule mod_mime_magic.c>     MIMEMagicFile conf/magic </IfModule>

ScriptLog /var/log/httpd/script_log

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined LogFormat "%h %l %u %t "%r" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent

CustomLog /var/log/httpd/access_log combined CustomLog /var/log/httpd/referer_log referer CustomLog /var/log/httpd/agent_log agent CustomLog /var/log/httpd/access_log combined

Alias /icons/ "/var/www/icons/"

<Directory "/var/www/icons">     Options Indexes MultiViews     AllowOverride None     Order allow,deny     Allow from all </Directory>

IndexOptions FancyIndexing

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/* AddIconByType (IMG,/icons/image2.gif) image/* AddIconByType (SND,/icons/sound2.gif) audio/* AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe AddIcon /icons/binhex.gif .hqx AddIcon /icons/tar.gif .tar AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip AddIcon /icons/a.gif .ps .ai .eps AddIcon /icons/layout.gif .html .shtml .htm .pdf AddIcon /icons/text.gif .txt AddIcon /icons/c.gif .c AddIcon /icons/p.gif .pl .py AddIcon /icons/f.gif .for AddIcon /icons/dvi.gif .dvi AddIcon /icons/uuencoded.gif .uu AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl AddIcon /icons/tex.gif .tex AddIcon /icons/bomb.gif core AddIcon /icons/back.gif .. AddIcon /icons/hand.right.gif README AddIcon /icons/folder.gif ^^DIRECTORY^^ AddIcon /icons/blank.gif ^^BLANKICON^^ DefaultIcon /icons/unknown.gif

ReadmeName README.html HeaderName HEADER.html

IndexIgnore .??* ~ # HEADER README RCS CVS *,v *,t

AddEncoding x-compress Z AddEncoding x-gzip gz tgz

AddLanguage en .en AddLanguage fr .fr AddLanguage de .de AddLanguage da .da AddLanguage el .el AddLanguage it .it

LanguagePriority de en

<IfModule mod_php4.c>   AddType application/x-httpd-php .php4 .php3 .phtml .php   AddType application/x-httpd-php-source .phps </IfModule>

<IfModule mod_php3.c>   AddType application/x-httpd-php3 .php3   AddType application/x-httpd-php3-source .phps </IfModule>

<IfModule mod_php.c>   AddType application/x-httpd-php .phtml </IfModule>

AddType application/x-tar .tgz

AddHandler cgi-script .pl

AddType text/html .shtml AddHandler server-parsed .shtml

AddHandler imap-file map

BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0 BrowserMatch "RealPlayer 4.0" force-response-1.0 BrowserMatch "Java/1.0" force-response-1.0 BrowserMatch "JDK/1.0" force-response-1.0

<Location /server-status>     SetHandler server-status     Order deny,allow     Deny from all     Allow from localhost 192.168.0.1 </Location>

<Location /server-info>     SetHandler server-info     Order deny,allow     Deny from all     Allow from localhost 192.168.0.1 </Location>

Alias /doc/ /usr/share/doc/ <Location /doc>   order deny,allow   deny from all   allow from localhost 192.168.0.1   Options Indexes FollowSymLinks </Location>

<IfDefine HAVE_SSL> Listen 443 SSLSessionCache shm:/var/cache/ssl_gcache_data(524288) </IfDefine>

<VirtualHost *:80>   ServerName bimmer.at   ServerAlias *.bimmer.at   ServerAdmin root@localhost   DocumentRoot /home/bimchr01/www/public   Options +IncludesNOEXEC   ErrorLog /home/bimchr01/www/log/error_log   TransferLog /home/bimchr01/www/log/access_log   CustomLog /home/bimchr01/www/log/common_log vcommon   AccessFileName .htaccess   ErrorDocument 401 /home/bimchr01/www/error/401.htm   ErrorDocument 403 /home/bimchr01/www/error/403.htm   ErrorDocument 404 /home/bimchr01/www/error/404.htm   ErrorDocument 500 /home/bimchr01/www/error/500.htm

ScriptAlias /cgi/ /home/bimchr01/www/cgi-bin/   <Directory /home/bimchr01/www/cgi-bin>     AllowOverride None     SetHandler perl-script     PerlHandler Apache::Registry     Options +ExecCGI   </Directory> </VirtualHost>

  1. Hi,

    Ich habe RedHat 7.1 installiert mit Apache und
    mod_perl.

    mod_perl - aha. Interessant.

    Wenn ich jedoch ein Perl-Script aufrufe, bekomme
    ich dauernd einen internen Serverfehler.

    ... welcher besagt, daß Dein Skript nicht tut, was es tun soll.

    Hab zum testen nun einmal ein Formmailer-Skript
    von Matt's Archiv genommen

    Eieiei. Keine gute Idee bei mod_perl.

    Im Log steht leider auch nicht mehr drinnen, als
    interner Serverfehler.

    Hast Du ein separates "ScriptLog" eingeschaltet?

    Was hab ich vergessen zu beachten?

    Mit mod_perl mußt Du viel sauberer programmieren, als wenn Du normale Perl-Skripte über die CGI-Schnittstelle laufen läßt.

    Sind alle Variablen deklariert und initialisiert?
    Ist Dein Skript mit "perl -w" und "use strict;" ohne Warnungen lauffähig?

    Es ist einfach ein Unterschied, ob ein Skript vom normalen Perl-Interpreter immer wieder neu geladen wird, oder ob es über mod_perl resident im Speicher liegt und ggf. noch irgendwelche Daten vorheriger Ausführungen dort herum stehen.
    Das alles darf Deinem Skript nichts ausmachen - es muß sich eben darum kümmern, seine Datenstrukturen ordentlich aufzubauen.
    mod_perl verzeiht keinerlei Schlamperei.

    Vielleicht hilft es ja auch, wenn ich einfach
    einmal die httpd.conf mit reinschreibe:

    Wenn eines Deiner Skripte mit mod_perl korrekt läuft und andere nicht, dann liegt es ziemlich sicher an den anderen Skripten.

    Viele Grüße
          Michael
    (der es übrigens abenteuerlich findet, daß Du den Apache für Deine Skript-Fehler verantwortlich machst - was machen denn die vielen Betreiber der aktuell 10,4 Millionen aktiven Apache-Sites anders als Du?)

    1. Hallo,

      Hab zum testen nun einmal ein Formmailer-Skript
      von Matt's Archiv genommen
      Eieiei. Keine gute Idee bei mod_perl.

      Was gibt es für Alternativen?
      Hast Du eine URL, wo ich was runterladen kann, sodass auch die ganzen CGI's laufen, die es im Netz zum saugen gibt?

      Im Log steht leider auch nicht mehr drinnen, als
      interner Serverfehler.
      Hast Du ein separates "ScriptLog" eingeschaltet?

      Eigentlich schon, nur eigenartigerweise ist das File nicht vorhanden. Hab im entsprechenden Abschnitt folgende Zeile stehen:
        ScriptLog /home/bimchr01/www/log/script_log

      Wenn eines Deiner Skripte mit mod_perl korrekt läuft und andere
      nicht, dann liegt es ziemlich sicher an den anderen Skripten.

      Naja, ich bin leider darauf angewiesen, dass auch Scripte wie von Matt's Script-Archiv und andere laufen müssen.
      Wäre Dir sehr dankbar, wenn Du mir sagen könntest, was ich tun bzw. installieren oder ändern muss, damit dies möglich ist?

      (der es übrigens abenteuerlich findet, daß Du den Apache für Deine Skript-Fehler verantwortlich machst - was machen denn die vielen Betreiber der aktuell 10,4 Millionen aktiven Apache-Sites anders als Du?)

      Ich mache nicht Apache dafür verantwortlich, sondern nur meine "unfähigkeit" auf die richtige Lösung zu kommen, deshlab hab ich ja meine Frage hier gepostet.  :-)

      Schonmal Danke für Deine Antwort!

      Chris

      1. Hoi,

        Hab zum testen nun einmal ein Formmailer-Skript
        von Matt's Archiv genommen
        Eieiei. Keine gute Idee bei mod_perl.

        Was gibt es für Alternativen?

        Selber schreiben.

        Im Log steht leider auch nicht mehr drinnen, als
        interner Serverfehler.
        Hast Du ein separates "ScriptLog" eingeschaltet?

        Eigentlich schon, nur eigenartigerweise ist das File nicht
        vorhanden. Hab im entsprechenden Abschnitt folgende Zeile stehen:
          ScriptLog /home/bimchr01/www/log/script_log

        Sicher, dass das Verzeichnis existiert? Sicher, dass der Apache die
        richtigen Rechte hat? Sicher, dass das im richtigen Abschnitt steht?

        Wenn eines Deiner Skripte mit mod_perl korrekt läuft und andere
        nicht, dann liegt es ziemlich sicher an den anderen Skripten.

        Naja, ich bin leider darauf angewiesen, dass auch Scripte wie von
        Matt's Script-Archiv und andere laufen müssen.

        Warum?

        Wäre Dir sehr dankbar, wenn Du mir sagen könntest, was ich tun
        bzw. installieren oder ändern muss, damit dies möglich ist?

        Nicht mod_perl benutzen.
        Die Matt-Wright-Scripte sind groesstenteils in Perl4-Syntax. Und
        AFAIK ist die nunmal zu grossen Teilen nicht mod_perl-faehig.

        Gruesse,
         CK

        1. Hi,

          Zuerst mal Danke für Deine Antwort.

          Was gibt es für Alternativen?
          Selber schreiben.

          Naja, eigentlich wollte ich den Server noch in diesem Jahr fertig haben  :-)

          ScriptLog /home/bimchr01/www/log/script_log
          Sicher, dass das Verzeichnis existiert? Sicher, dass der Apache die
          richtigen Rechte hat? Sicher, dass das im richtigen Abschnitt steht?

          Die anderen Log-Files funktionieren prächtig, nur dieses will er nicht verwenden, stehen tuts dort, wo ich das cgi-verzeichnis einbinde.

          Naja, ich bin leider darauf angewiesen, dass auch Scripte wie von
          Matt's Script-Archiv und andere laufen müssen.
          Warum?

          Weil auf dem Server außer mir noch andere Leute Ihren Webspace bekommen sollen, und ich will dann nicht lauter Anfragen bekommen, wieso dieses und jenes nicht geht, weil sonst bin ich den ganzen Tag damit beschäfitgt, den Leuten klar zu machen, dass sie es "anderst" machen müssen und, naja, du weißt was ich meine, oder?

          Nicht mod_perl benutzen.

          Sondern?
          Was verwenden die Provider, die den Kunden cgi anbieten?
          Hast Du vielleicht ein paar nützliche Adressen für mich?

          Schonmal Danke!

          cu Chris

          1. Hoi,

            Weil auf dem Server außer mir noch andere Leute Ihren Webspace
            bekommen sollen, und ich will dann nicht lauter Anfragen bekommen,
            wieso dieses und jenes nicht geht, weil sonst bin ich den ganzen
            Tag damit beschäfitgt, den Leuten klar zu machen, dass sie es
            "anderst" machen müssen und, naja, du weißt was ich meine, oder?

            Dann sagst du ihnen halt, wieso das so ist.

            Nicht mod_perl benutzen.

            Sondern?

            CGI.

            Was verwenden die Provider, die den Kunden cgi anbieten?

            Na, CGI.

            Hast Du vielleicht ein paar nützliche Adressen für mich?

            http://httpd.apache.org/

            Gruesse,
             CK

          2. Hi,

            Weil auf dem Server außer mir noch andere Leute Ihren Webspace
            bekommen sollen, und ich will dann nicht lauter Anfragen
            bekommen, wieso dieses und jenes nicht geht, weil sonst bin
            ich den ganzen Tag damit beschäfitgt, den Leuten klar zu
            machen, dass sie es "anderst" machen müssen und, naja, du
            weißt was ich meine, oder?

            Nicht mod_perl benutzen.

            Dem schließe ich mich an.

            mod_perl ist eine Tuning-Maßnahme. Entsprechend sauber programmiert müssen die Skripte dann eben auch sein.
            Diese Voraussetzung erfüllen Deine Benutzer nicht.

            Sondern?
            Was verwenden die Provider, die den Kunden cgi anbieten?

            In der Tat eben "nur" CGI, d. h. der Perl-Interpreter wird für jedes Skript neu geladen.

            Du kannst aber - wenn Du Dich traust - Deinen Leuten zwei unterschiedliche Endungen für "perl über CGI" und "perl über mod_perl" anbieten, denke ich - und ausführlich dokumentieren, was man bei Verwendung von mod_perl eben alles nicht tun darf.
            Dann müssen die Leute selbst entscheiden, was sie wollen: Komfort _oder_ Performance.

            Viele Grüße
                  Michael