[HowTo] PHP5 als CGI in den Apache einbinden + SUEXEC fixxen

Freel@ncer14

Registered User
Dieses HowTo bezieht sich auf:

Hi Leute,

ich habe seit Tagen mitgelesen hier und habe es auf einem 'Spiel-Root' von mir versucht und hatte den selben Misserfolg wie ihr.

BITTE ZUERST _GANZ_ DURCHLESEN!
Ich gehe davon aus, dass man sich mit der Materie auskennt und nicht erst erklärt bekommen muss, wie man mit PuTTY umgeht und was das überhaupt ist ;)
Also das Tutorial richtet sich an FORTGESCHRITTENE Linux Administratoren.



Zuerst den bekannten Fehler mit der 500er:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Und in dem error_log:
(DATUM + IP geändert, da rekonstruiert)
[DATUM] [warn] Cannot get media type from 'php5-cgi'
[DATUM] [warn] Cannot get media type from 'php5-cgi'
[DATUM] [warn] Cannot get media type from 'php5-cgi'
[DATUM] [error] [client IP] failed to open log file
[DATUM] [error] [client IP] fopen: No such file or directory
[DATUM] [error] [client IP] Premature end of script headers: php

Dann an der vhost.conf rumgeschraubt und es kam zum bekannten Fehler, dass einem das File zum DL angeboten wurde.

Also wieder zurückgeändert und es blieb beim 500er.
In der suexec.log stand dann:
(DATUM + user geändert, da rekonstruiert)
[DATUM]: uid: (10001/user) gid: (10001/10001) cmd: php
[DATUM]: command not in docroot (/usr/bin/php5/php)

Also ging es nicht mehr anders und ich musste suexec neucompilieren.
Dies habe ich nach der Anleitung von server4downs gemacht:
Wobei der erste Schritt (suexec -V bzw. suexec2 -V nicht ging, da ich keine Ausgabe von suexec bekommen habe (bei mir war es suexec2).
Der Grund:
SWsoft möchte seine Pfade nicht bekanntgeben und hat vor dem compilieren die Funktion ausgebaut.

Schritt 6 des Tutorials habe ich dann wie folgt angepasst:
#ifndef AP_DOC_ROOT
#define AP_DOC_ROOT "/usr/bin/php5"
#endif

Außerdem sollte man darauf achten, dass man die Zeile des LogFiles anpasst, damit man nachher die Logs betrachten kann.
Bei mir sah sie dann so aus:
#define AP_LOG_EXEC "/var/log/apache2/suexec.log" /* Need me? */
.

So jetzt dachte ich mir alles supi, ich habe ein neucompiliertes suexec und jetzt habe ich meinen Spass mit PHP5 als CGI.
->Pustekuchen!
Der docroot-Fehler war ja umgangen aber es kam zum nächsten, welcher sich als graviernd rausstellte.
In meiner suexec.log stand nun:
(DATUM + user geändert, da rekonstruiert)
[DATUM]: uid: (10001/user) gid: (10001/10001) cmd: php
[DATUM]: target uid/gid (10001/10001) mismatch with directory (0/0) or program (0/0)

Ich erkläre euch die Fehlermeldung kurz:
suexec möchte, dass das Script ('program') als 10001/10001 ausgeführt wird und der Ordner in dem es sich befindet auch 10001/10001 gehört.
Bei meinem System war 10001 der User user
und 10001 die Gruppe 'psacln'.
Die Datei und das Directory gehörten auch 10001/10001 doch egal was man machte suexec nahm es nicht an und behauptet steif und fest, dass es 0/0 gehörte. (0/0 bedeutet dem User root und der Gruppe root).
Bis ich dann herrausgefunden habe, dass suexec es auf einen anderen Ordner angewandt hat (was IMHO keinen Sinn macht - aber tut ja nix zur Sache).
Denn suexec wollte gerne, dass der Ordner
/var/www/vhosts/domain.tld/httpdocs
10001/10001 gehört.
Dies ist jedoch nicht möglich, da das httpdocs Verzeichnis dem User 'psaserv' gehören muss.
Andernfalls bekommt man beim Zugriff auf die HP nur noch einen 403 - Forbidden und KEINE! Datei ist dieser Domain ist mehr über das HTTP Protokoll erreichbar.
Wie man die Sache nun auch dreht und wendet, es gibt KEINE Lösung, dass suexec denkt, es würde 'psacln' gehören und PLESK es erlaubt, dass es nichtmehr 'psaserv' gehört.
Ich habe auch schon den suexec User geändert in der CFG und wirklich sogut wie ALLES Mögliche gemacht doch es gibt schier keinen Ausweg.
Also dachte ich mir, wenn suexec es nicht akzeptiert, dann darf es eben nicht wissen.
Also habe ich es erneut recompiliert und diesmal auch in der suexec.c etwas geändert.
Öffnet also die Datei suexec.c (in der Source, die auch schon weiter oben in dem Tutorial angesprochen wurde) mit einem beliebigen Editor.
Findet den Block:
/*
* Error out if the target name/group is different from
* the name/group of the cwd or the program.
*/
if ((uid != dir_info.st_uid) ||
(gid != dir_info.st_gid) ||
(uid != prg_info.st_uid) ||
(gid != prg_info.st_gid)) {
log_err("target uid/gid (%ld/%ld) mismatch "
"with directory (%ld/%ld) or program (%ld/%ld)\n",
uid, gid,
dir_info.st_uid, dir_info.st_gid,
prg_info.st_uid, prg_info.st_gid);
exit(120);
}
/*
* Error out if the program is not executable for the user.

in:

/*
* Error out if the target name/group is different from
* the name/group of the cwd or the program.
*/
/* suexec ist doof und darf nicht wissen wem das File und der Ordner gehört
if ((uid != dir_info.st_uid) ||
(gid != dir_info.st_gid) ||


(uid != prg_info.st_uid) ||
(gid != prg_info.st_gid)) {
log_err("target uid/gid (%ld/%ld) mismatch "
"with directory (%ld/%ld) or program (%ld/%ld)\n",
uid, gid,
dir_info.st_uid, dir_info.st_gid,
prg_info.st_uid, prg_info.st_gid);
exit(120);
}
*/
/*
* Error out if the program is not executable for the user.

Jetzt wird suexec wahrscheinlich meckern, wenn ihr es neucompilieren wollt mir:
make suexec
Deswegen zuerst
make clean
ausführen!
Danach folgendes machen:
cp suexec /usr/sbin/suexec2
chmod 4755 /usr/sbin/suexec2
(Den restart des Apaches könnt ihr euch sparen, da suexec jedesmal neugestartet wird, wenn es aufgerufen wird.

Zusätzlich vielleicht ganz praktisch für euch meine vhost.conf:
<Directory "/usr/bin/php5">
AllowOverride None
Options +ExecCGI +FollowSymLinks
Order allow,deny
Allow from all
</Directory>
ScriptAlias /php5-cgi /usr/bin/php5
Action application/php5-cgi /php5-cgi/php
AddType application/php5-cgi .php5

Jetzt solltet ihr einen Luftsprung machen und euch freuen, dass jmd die Lösung gefunden hat ;)

Es ist selbstverständlich nicht nötig die Kompilation in 2 Schritten zu machen!
Ich habe es nur so geschildert, damit man den Kompletten Weg nachvollziehen kann!

Für die komplette Herausarbeitung dieser Lösung inklusive allem Hinterwissen zu suexec (ich hatte vorher noch nix damit zu tun) habe ich ca. 2 1/2 Tage(Nächte) gebräucht.
Ich hoffe, dass es geschätzt wird, dass ich mir sehr viel Arbeit gemacht habe und auch in diesem Tutorial (wie ich finde) sehr ausführlich beschrieben habe, wie man es nun in den Apache einbindet und suexec einem dabei nicht in die Quere kommt.


Dieser Lösungsschritt konnte von mir auf folgenden Systemen nachvollzogen werden:

SUSE Linux 9.3 mit PLESK 8.0.1
&&
SUSE Linux 9.3 mit PLESK 7.5.4
Die Apache Version sollte irrelevant sein!
Lieben Gruß
Freel@ncer14

© 2006 by Freel@ncer14
Ich kann nicht verhindern, dass dieses Tutorial ohne mein Einverständnis weiterverbreitet und kopiert wird, aber ich hoffe, dass man schon beim Lesen merkt wieviel Arbeit dahinter steckt und soviel Anstand hat und es nicht 'klaut'!
 
Back
Top