[Howto] Debian, Plesk, PHP4/5 (CGI) mit php.ini pro Domain

neutron

New Member
Hallo,

Dieses Howto ist inspiriert von dem original Howto von "server4downs" welches hier zu finden ist.

Man kann sagen das ist die Methode für faule bzw. Leute die nicht groß am System fummeln wollen.

1. Ins Plesk Control Panel gehen auf den "Updater" und "SiteBuilder and Sitebuilder module for Plesk" herunterladen.

Hintergrund: Dieser installiert das Plesk eigene php5-cgi binary mit.

2. suexec neu kompilieren wie in https://serversupportforum.de/threads/mini-howto-suexec-neukompilieren.2540/ beschrieben, allerdings mit den Anpassungen suexec.h:

Code:
#ifndef AP_HTTPD_USER
#define AP_HTTPD_USER "www-data"
#endif

Code:
#ifndef AP_LOG_EXEC
#define AP_LOG_EXEC "/var/log/apache2/suexec.log" /* Need me? */
#endif

Code:
#ifndef AP_DOC_ROOT
#define AP_DOC_ROOT "/var/www/vhosts"
#endif

besonders die letzte Änderung hier bewirkt das wir hinterher das php Binary im Pfad der jeweiligen Domain "/var/www/vhosts/domain.tld/bin" ausführen können ohne dass das File dem FTP-Benutzer gehören muss und wir trotzdem immernoch eine eigene "php.ini" pro Domain verwenden können.

Änderungen an der suexec.c (von Freel@ncer14):

Code:
    /*
     * 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);
    }

ändern in:

Code:
    /*
     * Error out if the target name/group is different from
     * the name/group of the cwd or the program.
     */
[COLOR="Red"]/* Disabled[/COLOR]
    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);
    }
[COLOR="Red"]*/[/COLOR]

Die nun neu kompilierte suexec in den entsprechenden Pfad kopieren und ein chmod 4755 darauf ausführen.
Den Pfad wo der Apache die suexec erwartet kann man mit "apache2 -V" erfahren.

3. Unter "/var/www/vhosts/domain.tld/conf/" oder "/var/www/vhosts/domain.tld/subdomain/name/conf" (falls Subdomain) eine vhost.conf mit folgendem Inhalt anlegen:

ScriptAlias /php5-cgi-custom /var/www/vhosts/domain.tld/bin
Action application/x-httpd-php5-custom "/php5-cgi-custom/php5"
AddType application/x-httpd-php5-custom .php

Wobei "domain.tld" natürlich zu ersetzen ist mit euren Daten. Ich habe mir wie man oben sieht unter "/var/www/vhosts/domain.tld/bin" die php5 binary abgelegt.

Das php5 binary was Ihr braucht befindet sich in "opt/php52/bin" und heißt "php5-cgi". Nach obigem Beispiel der vhost.conf also:

cp /opt/php52/bin/php5-cgi /var/www/vhosts/domain/bin/php5
cd /var/www/vhosts/domain
chown -R root.root bin/
chmod 755 bin/

Wer noch eine php.ini Datei "pro User" verwenden möchte, kopiert in den gleichen Pfad noch die entsprechende php.ini:

cp /opt/php52/etc/php5/cgi/php.ini /var/www/vhosts/domain/bin
cd /var/www/vhosts/domain/bin
chown root.root php.ini
chmod 644 php.ini

Damit das ganze nun greift, wie üblich bei Plesk einmal:

/opt/psa/admin/sbin/websrvmng -a -v

ausführen und die vhost.conf wird für die jeweilige Domain mit verwendet.

Die entsprechende php.ini für die CGI Version findet man unter "/opt/php52/etc/php5/cgi/" und kann diese gemäß seinen Vorstellungen anpassen.

Im Control Panel von Plesk sollte man schließlich noch php und cgi für die Domain aktivieren und schon läuft das ganze und zwar einfach ohne weiter etwas machen zu müssen, weder braucht man suexec noch php5 selbst kompilieren. Um das ganze wieder loszuwerden, also die Domain wieder unter php4 als mod laufen zu lassen einfach das jeweilige vhost.conf file löschen und nochmal

/opt/psa/admin/sbin/websrvmng -a -v

ausführen.


Wer möchte kann natürlich auch in dem vhost.conf file einfach die Zeile

AddType application/x-httpd-php5-custom .php

in

AddType application/x-httpd-php5-custom .php5

ändern und hat so den Effekt das alle php Dateien die mit .php5 enden mit der CGI Version ausgeführt werden, der rest mit php4 als mod.

Natürlich wird aufgrund der bereits vorhandenen SuExexUserGroup Direktive die Plesk ja anlegt (/var/www/vhosts/domain/conf/httpd.include) alles brav als der jeweils richtige Benutzer ausgeführt.

Im Endeffekt haben wir das gleiche was "server4downs" mit seinem Patch gemacht hat, allerdings wie ich finde auf einen etwas schnelleren weg, außerdem angepasst an Plesk ohne viel Aufwand. Zusätzlich können wir noch pro Domain eine php.ini benutzen (optional) was mit seiner Methode nicht möglich war, wobei das natürlich sicherlich realisierbar ist.

Im Anhang hier noch die angepasste suexec.h und suexec.c

Gruß nEUTRon.
 

Attachments

Last edited by a moderator:
Hallo,
vielen Dank für dieses modifizierte HowTo. Aus Performance-Sicht würde ich gerne wissen, ob es unter Plesk ebenfalls so einfach ist, php als fast-cgi laufen zu lassen. Google hat mir bislang noch nicht sehr viel weitergeholfen...

Gruß
 
Habe das von neutron gepostete HowTo erfolgreich anwenden können.

Vielen Dank dafür!

Einziger Knackpunkt war mein OS und dementsprechend der Pfad für die suexec2:

- Debian 3.1 mit Plesk 8.1.1

Die neukompilierte suexec2 musste nicht wie gemäss Punkt 2 des im HowTo's angegebenen Link nach /usr/sbin/ kopiert werden sondern nach
/usr/lib/apache2/.

ein

Code:
apache2 -V

in der Konsole lieferte den eindeutigen Pfad wo der Apache die suexec2 erwartet:

Code:
-D SUEXEC_BIN="/usr/lib/apache2/suexec2"

Nach weiterem Suchen gab mir der nachstehend gelinkte Post von Dawn die nötige Sicherheit dies auch auszuführen.

Post von Dawn:

FAZIT:
Funktioniert wie es sollte!

Grüsse aus der Schweiz und nochmals
herzlichen Dank an diese Super Community!

pcss
 
PHP5 mod -- PHP als cgi

Hi Ihr Tüfftler...

ich habe versucht das Spielchen andersrum zu testen.

Ergebnis: :confused:

Bin ím Grunde nach diesem HowTo gefolgt, allerdings läuft bei mir schon PHP5 und ich wollte PHP4 als Cgi dazu konfigurieren.

Meine Daten
Plesk 8.2.1
Debian Etch
PHP5

Beim Aufruf der Datei test.php4 kommt folgendes

"The requested document was not found on this server."

Wo ist mein Denkfehler?

vhost.conf
Code:
ScriptAlias /php4-cgi-custom /var/www/vhosts/domain.tld/bin
Action application/x-httpd-php4-custom "/php4-cgi-custom/php4"
AddType application/x-httpd-php4-custom .php4
Wo muß das folgende hinein?
Code:
<Directory "/usr/bin/php4">
AllowOverride None
Options +ExecCGI +FollowSymLinks
Order allow,deny
Allow from all
</Directory>
ScriptAlias /php4 /usr/bin/php4
Action php4-cgi /php/php
AddType php4-cgi .php4
Oder ist diese Abänderung total verkehrt.

Steh grad auf'm Schlauch.

Danke soweit.
 
Last edited by a moderator:
Sers,

ich habe hier nochn klein großes Problem.
Sobald die vhost.conf aktiv ist läuft php auf meinem apachen nicht mehr.
Wo kann ich mit der Fehlersuche ansetzen ?

suexec.log

Code:
[2008-03-24 22:44:10]: uid: (10001/torrent) gid: (2523/2523) cmd: php5
[2008-03-24 22:44:10]: target uid/gid (10001/2523 or 2522) mismatch with directory (0/0) or program (0/0)
[2008-03-24 22:47:59]: uid: (10001/torrent) gid: (2523/2523) cmd: php5
[2008-03-24 22:47:59]: target uid/gid (10001/2523 or 2522) mismatch with directory (0/0) or program (0/0)
[2008-03-24 22:48:11]: uid: (10001/torrent) gid: (2523/2523) cmd: php5

torrent ist hier mein ftp user

Sobald Ich die vhost umbenannt habe funktioniert php wieder !?
 
Moin,

ich würde nicht das psa binary nehmen, sonderen das php5-cgi des Ubutus oder Debians.

aptitude install php5-cgi

Nicht

cp /opt/php52/bin/php5-cgi /var/www/vhosts/domain/bin/php5


sondern
Code:
cp /usr/bin/php5-cgi /var/www/vhosts/domain/bin/php5
Ansonsten aber sehr gute Arbeit.


Wieso geht eigentlich ein ln -s nicht... ?
 
Last edited by a moderator:
Sers,

ich hab nen kleinen bash script zur automatisierung geschrieben.

Dieser Part beginnt nachdem die suexec geschichte erfolgreich abgehandelt wurde.
Paket php5-cgi muss installiert sein.

Für alle Domains

Code:
#!/bin/bash

#
# Legt automatisch den Space auf php via cgi
# Voraussetzung php5-cgi paket installiert
#
#

WEBDIR="/var/www/vhosts"
vhost=/tmp/vhost.tmp
domlist=`ls $WEBDIR`

for dom in $domlist; do

# Erstellung der vhost.conf und vhost_ssl.conf

echo "Schreibe Einstellungen fuer Domain $dom"

cat <<EOF > $vhost
ScriptAlias /php5-cgi-custom $WEBDIR/$dom/bin
Action application/x-httpd-php5-custom "/php5-cgi-custom/php5"
AddType application/x-httpd-php5-custom .php .php5 .php4 .phtml
EOF

cat $vhost > $WEBDIR/$dom/conf/vhost.conf
cat $vhost > $WEBDIR/$dom/conf/vhost_ssl.conf

echo "vhosts fuer $dom geschrieben"

# binary kopieren

cp /usr/bin/php5-cgi $WEBDIR/$dom/bin/php5
chown -R root.root $WEBDIR/$dom/bin
chmod 755 $WEBDIR/$dom/bin

echo "binary erledigt"

# php.ini

cp /opt/php52/etc/php5/cgi/php.ini $WEBDIR/$dom/bin
chown root.root $WEBDIR/$dom/bin/php.ini
chmod 644 $WEBDIR/$dom/bin/php.ini

echo "php.ini erfolgreich eingebunden"

# reload psa Webserver

/opt/psa/admin/sbin/websrvmng -a -v

echo "Webserver wurde reloaded"

########

infophp="<?php phpinfo(); ?>"

# Lege moddir an

mkdir $WEBDIR/$dom/httpdocs/moddir
mkdir $WEBDIR/$dom/httpsdocs/moddir

echo $infophp > $WEBDIR/$dom/httpdocs/moddir/info.php
echo $infophp > $WEBDIR/$dom/httpsdocs/moddir/info.php

done
Für einzelne Domains:

./script [domname]

Code:
#!/bin/bash

#
# Legt automatisch den Space auf php via cgi
# Voraussetzung php5-cgi paket installiert
#
#

WEBDIR="/var/www/vhosts"
vhost=/tmp/vhost.tmp
# Erstellung der vhost.conf und vhost_ssl.conf

echo "Schreibe Einstellungen fuer Domain $1"

cat <<EOF > $vhost
ScriptAlias /php5-cgi-custom $WEBDIR/$1/bin
Action application/x-httpd-php5-custom "/php5-cgi-custom/php5"
AddType application/x-httpd-php5-custom .php .php5 .php4 .phtml
EOF

cat $vhost > $WEBDIR/$1/conf/vhost.conf
cat $vhost > $WEBDIR/$1/conf/vhost_ssl.conf

echo "vhosts fuer $1 geschrieben"

# binary kopieren

cp /usr/bin/php5-cgi $WEBDIR/$1/bin/php5
chown -R root.root $WEBDIR/$1/bin
chmod 755 $WEBDIR/$1/bin

echo "binary erledigt"

# php.ini

cp /opt/php52/etc/php5/cgi/php.ini $WEBDIR/$1/bin
chown root.root $WEBDIR/$1/bin/php.ini
chmod 644 $WEBDIR/$1/bin/php.ini

echo "php.ini erfolgreich eingebunden"

# reload psa Webserver

/opt/psa/admin/sbin/websrvmng -a -v

echo "Webserver wurde reloaded"

########

infophp="<?php phpinfo(); ?>"

# Lege moddir an
mkdir $WEBDIR/$1/httpdocs/moddir
mkdir $WEBDIR/$1/httpsdocs/moddir

echo $infophp > $WEBDIR/$1/httpdocs/moddir/info.php
echo $infophp > $WEBDIR/$1/httpsdocs/moddir/info.php
 
Ich habe das mal soweit durchgeführt, allerdings habe ich RedHat EL.

Ich habe die php5 nach Anleitung richtig kopiert und eine vhost.conf angelegt. Allerdings kommt lediglich folgende Meldung, wenn ich eine php-Datei aufrufe:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Kann mir da jemand weiterhelfen?
 
Veralteter Thread xDD
ich schreibe die geänderte domain.sh trozdem
ist unter plesk 9.3.0 problemlos gegangen :D
(habe auch ubuntu 8.04 LTS ^^)

PHP:
#!/bin/bash

#
# Legt automatisch den Space auf php via cgi
# Voraussetzung php5-cgi paket installiert
#
#

WEBDIR="/var/www/vhosts"
vhost=/tmp/vhost.tmp
domlist=`ls $WEBDIR`

for dom in $domlist; do

# Erstellung der vhost.conf und vhost_ssl.conf

echo "Schreibe Einstellungen fuer Domain $dom"

cat <<EOF > $vhost
ScriptAlias /php5-cgi-custom $WEBDIR/$dom/conf
Action application/x-httpd-php "/php5-cgi-custom/php5"
AddType application/x-httpd-php .php .php5 .php4 .phtml
EOF

cat $vhost > $WEBDIR/$dom/conf/vhost.conf
cat $vhost > $WEBDIR/$dom/conf/vhost_ssl.conf

echo "vhosts fuer $dom geschrieben"

# binary kopieren
cp /usr/bin/php-cgi $WEBDIR/$dom/conf/php5
chown -R root.root $WEBDIR/$dom/conf
chmod 0755 $WEBDIR/$dom/conf

echo "binary erledigt"

# php.ini

cp /etc/php5/cgi/php.ini $WEBDIR/$dom/conf
chown root.root $WEBDIR/$dom/conf/php.ini
chmod 0644 $WEBDIR/$dom/conf/php.ini

echo "php.ini erfolgreich eingebunden"

# reload psa Webserver

/opt/psa/admin/sbin/websrvmng -a -v

echo "Webserver wurde reloaded"

########

infophp="<?php phpinfo(); ?>"

# Lege moddir an

mkdir $WEBDIR/$dom/httpdocs/moddir
mkdir $WEBDIR/$dom/httpsdocs/moddir

echo $infophp > $WEBDIR/$dom/httpdocs/moddir/info.php
echo $infophp > $WEBDIR/$dom/httpsdocs/moddir/info.php

done
 
Unter psa 9.x ist es doch garnicht mehr nötig.
In Plesk lässt sich definieren ob modul, php cgi, oder fcgi.

Habe noch 8.6, dort trifft der script zu.
 
Hm, gute Frage..
Wie gesagt, ich habe noch 8.6, weil 9.x keinen Mehrwert für mich hat.
In diesem Fall hättest du dann recht.
 
Mit je eigene INI Datei pro Domain ?

Es ist zwar richtig, das man Pro Domain einstellen kan, ob php cgi, oder fcgi.
Aber, man kann diese nicht manuell für jeden einzeln konfigurieren wie unter Confixx.

Möchte ein Kunde ein Max-FileSize von 64 MB (Wegen WBB) so muss man das auf dem kompletten Server ändern.

Da kommt das Script genau richtig ;)
 
Back
Top