PHP 5.2 unter Debian 6 Squeeze parallel zu PHP 5.3 mit ISPConfig (mod_php/mod_fcgid)
Das noch relativ frisch als stabil veröffentlichte Debian 6 mit dem Namen „Squeeze“ enthält unter Anderem das Update auf PHP 5.3, während bis zuletzt unter Debian 5 „Lenny“ noch PHP 5.2 zum Einsatz kam.
Durch das Update ergeben sich mit vielen älteren PHP Projekten Probleme durch deprecated Funktionen und andere Verhaltensweisen. Wem der Aufwand zu hoch ist die entsprechenden Projekte auf den neuesten Stand zu bringen oder aus anderen Gründen parallel zur 5.3 Version noch die ältere 5.2 Version verwenden möchte, dem möchte ich eine kleine Anleitung geben, wie dies auf deinem Server mit ISPConfig 2 möglich ist.
Die Anleitung funktioniert vermutlich auch für Server mit anderer Verwaltungssoftware, getestet habe ich dies jedoch nicht.
Wie immer gilt auch bei dieser Anleitung: Verwendung auf eigene Gefahr.
Da die PHP 5.2 Version für die Nutzung mit mod_fcgid selbst kompiliert werden muss, stellen wir zuerst einmal sicher, dass wir die benötigten Pakete zum kompilieren installiert haben.
Davon, dass die grundlegenden Programme zum Kompilieren von Quellcode (z. B. gcc) installiert sind, gehe ich an dieser Stelle einmal stillschweigend aus.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
apt-get install libapache2-mod-fcgid apache2-suexec libpcre3-dev libpcre++-dev libpng12-dev libbz2-dev libcurl4-openssl-dev libc-client2007e-dev libjpeg-dev libgif-dev libgif4 libpthread-stubs0 libpthread-stubs0-dev libx11-dev libxau-dev libxcb1-dev libxdmcp-dev libxpm-dev x11proto-core-dev x11proto-input-dev x11proto-kb-dev xtrans-dev libxml2-dev libmysqlclient-dev libfreetype6-dev
[/pastacode]
In Debian Squeeze ist das Standard-Upload Limit für das fcgid Modul auf ca. 128kb gesetzt.
Dies können wir in der Datei /etc/apache2/mods-available/fcgid.conf durch das Setzen von
FcgidMaxRequestLen 104857600
auf 100MB anheben. Natürlich können dort auch andere Werte gesetzt werden, sie sollten jedoch höher sein als das in der php.ini eingestellte Upload-Limit.
Als nächstes laden wir uns die aktuelle Version des PHP Quellcodes. Zum Zeitpunkt dieses Artikels war die aktuellste Version 5.2.17.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
cd /tmp
wget "http://de.php.net/get/php-5.2.17.tar.bz2/from/this/mirror" -O php.tar.bz2
tar xjf php.tar.bz2
cd php-5.2.17
[/pastacode]
Nach dem Entpacken und Wechseln in das Quellcode-Verzeichnis kommt es beim Kompilieren nun darauf an, ob wir eine 64Bit oder eine 32Bit Installation von Debian verwenden.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
server1:~# uname -a
Linux server1 2.6.30-2-amd64
[/pastacode]
In meinem Fall ist das System also mit einem 64Bit Kernel ausgestattet, wenn dort i386 oder i686 statt des amd64 steht kann man davon ausgehen, dass eine 32Bit Version installiert ist.
Kompilier-Befehl für 32Bit:
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib --includedir=/usr/include/php52 --sysconfdir=/etc/php52/apache2 --with-config-file-path=/etc/php52/apache2 --with-config-file-scan-dir=/etc/php52/conf.d --enable-libxml --enable-session --with-pcre-regex=/usr --enable-xml --enable-simplexml --enable-filter --disable-debug --enable-inline-optimization --disable-rpath --disable-static --enable-shared --with-pic --with-gnu-ld --with-mysql --with-gd --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-exif --enable-fastcgi --enable-force-cgi-redirect --with-zlib --with-bz2 --with-curl --with-ldap --with-mysqli --with-ttf --with-freetype-dir --enable-soap --enable-sockets --enable-calendar --enable-ftp --enable-mbstring --enable-gd-native-ttf --enable-bcmath --enable-zip --with-pear --with-openssl --with-imap --with-imap-ssl --with-kerberos --enable-pdo --with-pdo-mysql --with-mysqli
[/pastacode]
Kompilier-Befehl für 64Bit:
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib64 --includedir=/usr/include/php52 --sysconfdir=/etc/php52/apache2 --with-config-file-path=/etc/php52/apache2 --with-config-file-scan-dir=/etc/php52/conf.d --enable-libxml --enable-session --with-pcre-regex=/usr --enable-xml --enable-simplexml --enable-filter --disable-debug --enable-inline-optimization --disable-rpath --disable-static --enable-shared --with-pic --with-gnu-ld --with-mysql --with-gd --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-exif --enable-fastcgi --enable-force-cgi-redirect --with-zlib --with-bz2 --with-curl --with-ldap --with-mysqli --with-ttf --with-freetype-dir --enable-soap --enable-sockets --enable-calendar --enable-ftp --enable-mbstring --enable-gd-native-ttf --enable-bcmath --enable-zip --with-pear --with-openssl --with-imap --with-imap-ssl --with-kerberos --enable-pdo --with-pdo-mysql --with-mysqli
[/pastacode]
Der einzige Unterschied besteht eigentlich darin, dass bei der 64Bit-Variante bei der Option –with-libdir einen anderen Pfadnamen übergeben bekommt.
Die weiteren Optionen stellen sicher, dass die PHP Version später auch IMAP, MySQL, GD (Grafikbibliothek), Curl und ein paar weitere Module enthält.
Wenn der configure Befehl ohne Fehler beendet ist, kann das Kompilieren und Installieren durch die Befehlsfolge
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
make
make test # optional
make install
[/pastacode]
gestartet werden.
Der Befehl make test ist optional, sollte aber vor der Installation verwendet werden um sicherzustellen, dass PHP korrekt kompiliert wurde.
Nach der Installation befindet sich in /usr/bin/php52/ nun ein eigenes Verzeichnis für die PHP Binaries der Version 5.2.17.
Nun müssen wir noch sicherstellen, dass die Apache-Module mod_fcgid (Fast-CGI) und SuExec aktiv sind.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
a2enmod fcgid
a2enmod suexec
/etc/init.d/apache2 force-reload
[/pastacode]
Als nächstes erstellen wir uns eine Starter-Datei für PHP als Vorlage für unsere Web-User. Was genau eine solche Datei tut, darüber wurde an anderen Stellen schon so viel geschrieben, dass ich mir die Erläuterungen hier spare. Eine Google Suche nach PHP FCGI wird sicherlich einige Ergebnisse bringen.
Natürlich bieten diese Skripte oft noch einige Funktionen, die an dieser Stelle bewusst weggelassen wurden. Hier wird wirklich nur eine minimale Version verwendet.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
mkdir -p /etc/php52/php-fcgi
vim /etc/php52/php-fcgi/php-starter
[/pastacode]
Der Inhalt der Datei:
[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]
#!/bin/sh
FCGID_STARTER_PHPBIN="/usr/bin/php52/php-cgi -c /etc/php52/cgi/"
exec $FCGID_STARTER_PHPBIN
[/pastacode]
Nach dem Speichern versehen wir die Datei mit den passenden Zugriffsrechten und setzen danach das Immutable Bit. Dadurch sind keine Änderungen mehr an der Datei möglich (auch nicht durch root-User), bis das Immutable Bit wieder gelöscht wird.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
chmod 750 /etc/php52/php-fcgi/php-starter
chattr +i /etc/php52/php-fcgi/php-starter
[/pastacode]
Damit sind die Vorbereitungen abgeschlossen.
Was nun folgt sind die Einstellungen für die einzelnen Web-User, für die die alte PHP Version aktiviert werden sollen. Der Standard unter ISPConfig 2 ist PHP 5.3 als Apache mod_php.
Die folgenden Einstellungen müssen separat für jeden Benutzer vorgenommen werden, der die alte Version 5.2.17 verwenden soll.
Bei allen folgenden Befehlen und Dateien muss das {WEB_ID} jeweils durch den Namen des Webs ersetzt werden, z. B. web1, web17 oder web216.
{WEB_USER} muss durch den Besitzer des Webverzeichnisses ersetzt werden. Dies ist in den meisten Fällen der angelegte FTP Admin Account (z. B. web7_ftp oder web16_adminis). Wie die korrekten Werte sind, kann man sich leicht anzeigen lassen, indem man in das Webverzeichnis wechselt und sich dort die Dateiberechtigung ansieht:
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
cd /var/www/web1/
ls -ld web
# Ausgabe:
# drwxrwxr-x 14 web1_webmaster web1 4.0K Mar 5 04:00 web
[/pastacode]
In diesem Beispiel müsste also {WEB_ID} durch web1 und {WEB_USER} durch web1_webmaster ersetzt werden.
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
cp -a /etc/php52/php-fcgi /var/www/{WEB_ID}/
chown -R {WEB_USER}:{WEB_ID} /var/www/{WEB_ID}/php-fcgi
chattr +i /var/www/{WEB_ID}/php-fcgi/php-starter
[/pastacode]
Nachdem die Vorlagendatei in das Webverzeichnis kopiert wurde und die korrekten Dateirechte vergeben wurden, muss nun noch die Einstellung für den Apache VHost gemacht werden. Dies geschieht über ISPConfig in den Apache Direktiven:
[pastacode lang=“bash“ message=“Apache Direktiven“ highlight=““ provider=“manual“]
SuexecUserGroup {WEB_USER} {WEB_ID}
SetHandler fcgid-script
AddHandler fcgid-script .php .php4 .php5
FCGIWrapper "/var/www/{WEB_ID}/php-fcgi/php-starter" .php
FCGIWrapper "/var/www/{WEB_ID}/php-fcgi/php-starter" .php5
FCGIWrapper "/var/www/{WEB_ID}/php-fcgi/php-starter" .php4
[/pastacode]
Eigentlich war es das schon und das Web sollte auf PHP 5.2.17 laufen.
Durch die Umstellung kann es sein, dass PHP keinen Zugriff mehr auf zuvor von PHP angelegte Dateien hat. Dies liegt dann daran, dass der Besitzer von Dateien, die mit PHP (mod_php) angelegt wurden www-data als Besitzer haben, da PHP als Apache Modul unter diesem Benutzer ausgeführt wird.
In der hier eingerichteten Variante wird PHP mit SuExec als {WEB_USER} ausgeführt.
Man kann sehr einfach alle Dateien finden, die www-data gehören und den Besitzer ändern:
[pastacode lang=“bash“ message=“Kommandozeile“ highlight=““ provider=“manual“]
cd /var/www/{WEB_ID}/web
find /var/www/{WEB_ID}/web -user www-data -exec chown {WEB_USER}:{WEB_ID} {} \;
[/pastacode]
Natürlich muss auch hier wieder {WEB_USER} und {WEB_ID} ersetzt werden. Achtung: das {} am Ende wird nicht ersetzt!
Zum Testen der PHP Version ist es am einfachsten eine einfache PHP Datei in das Web-Verzeichnis zu legen, die nur den folgenden Inhalt hat:
[pastacode lang=“php“ message=“PHP“ highlight=““ provider=“manual“]
< ?php phpinfo(); ?>
[/pastacode]
Falls beim Aufruf dieser Datei im Webbrowser noch die falsche PHP Version angezeigt wird oder ein Fehler 500 auftritt, oder der Apache sich nicht starten lässt hilft es die Fehlermeldungen in den Logdateien zu lesen.
Die wichtigsten Meldungen sind hierbei im SuExec Log (/var/log/apache2/suexec.log) und im Apache Log (/var/www/webXY/log/error.log) zu finden.
Der häufigste Fehler sind fehlerhafte Berechtigungen der php-starter Datei, die zu einem Streik von SuExec führen.
Jetzt noch ein Shellskript, das die Vorlage für den php-starter automatisch in das Webverzeichnis kopiert und den Text für die Apache Direktiven ausgibt. Der Aufruf erfolgt mit ./fcgi-copy.sh {WEB_USER} {WEB_ID}
Also z. B. ./fcgi-copy.sh web1_ftp_admin web1
[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]
#!/bin/sh
WEB_USER=$1
WEB_ID=$2
if [ "$WEB_USER" = "" ] ; then
echo "$0 .";
exit 1;
fi
if [ "$WEB_ID" = "" ] ; then
echo "$0 .";
exit 1;
fi
if [ ! -e "/var/www/${WEB_ID}" ] ; then
echo "Das Verzeichnis /var/www/${WEB_ID} existiert nicht."
exit 1;
fi
if [ ! -e "/etc/php52/php-fcgi" ] ; then
echo "Das Vorlagenverzeichnis /etc/php52/php-fcgi existiert nicht."
exit 1;
fi
cp -a /etc/php52/php-fcgi /var/www/${WEB_ID}/
chown -R ${WEB_USER}:${WEB_ID} /var/www/${WEB_ID}/php-fcgi
chattr +i /var/www/${WEB_ID}/php-fcgi/php-starter
find /var/www/${WEB_ID}/web -user www-data -exec chown ${WEB_USER}:${WEB_ID} {} \;
echo "Bitte den folgenden Abschnitt in die Apache Direktiven von ${WEB_ID} einfügen:"
echo "====================================="
echo "SuexecUserGroup ${WEB_USER} ${WEB_ID}"
echo ""
echo " SetHandler fcgid-script"
echo " "
echo ""
echo "AddHandler fcgid-script .php .php4 .php5"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php5"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php4"
echo ""
echo "====================================="
[/pastacode]
Ganz zum Schluss noch ein Shell-Skript, das eigentlich alle oben genannten Schritte automatisiert und auch das fcgi-copy Skript im /root Verzeichnis anlegt.
Ich übernehme keine Gewähr für die Funktionalität – Verwendung auf eigene Gefahr.
[pastacode lang=“bash“ message=“Shell-Script“ highlight=““ provider=“manual“]
#!/bin/sh
if [[ $(id -u) -ne 0 ]] ; then
echo "Dieses Script funktioniert nur als root!" ;
exit 2 ;
fi
DEBIAN_OK=`cat /etc/debian_version`
if [[ "$DEBIAN_OK" = "" ]] ; then
echo "Dies scheint nicht Debian zu sein...";
exit;
fi
read -p "ACHTUNG! Es werden nun Pakete installiert und Dateien modifiziert. Soll die Installation gestartet werden (y/j/N)? " DOIT
if [[ "$DOIT" != "j" && "$DOIT" != "y" ]] ; then
echo "Abgebrochen." ;
exit 0 ;
fi
apt-get install -q -y libapache2-mod-fcgid apache2-suexec libpcre3-dev libpcre++-dev libpng12-dev libbz2-dev libcurl4-openssl-dev libc-client2007e-dev libjpeg-dev libgif-dev libgif4 libpthread-stubs0 libpthread-stubs0-dev libx11-dev libxau-dev libxcb1-dev libxdmcp-dev libxpm-dev x11proto-core-dev x11proto-input-dev x11proto-kb-dev xtrans-dev libfreetype6-dev libxml2-dev libmysqlclient-dev libfreetype6-dev
a2enmod fcgid
a2enmod suexec
cd /tmp
wget -q "http://de.php.net/get/php-5.2.17.tar.bz2/from/this/mirror" -O php.tar.bz2
tar xjf php.tar.bz2
cd php-5.2.17
CHECK=`grep "FcgidMaxRequestLen" /etc/apache2/mods-available/fcgid.conf`
if [[ "$CHECK" = "" ]] ; then
CHECK=`grep "FcgidConnectTimeout" /etc/apache2/mods-available/fcgid.conf`
if [[ "$CHECK" = "" ]] ; then
echo "FcgidMaxRequestLen 1073741824" >> /etc/apache2/mods-available/fcgid.conf ;
else
sed -i -e "s/^\(\s*FcgidConnectTimeout.*\)$/\1\n FcgidMaxRequestLen 1073741824/" /etc/apache2/mods-available/fcgid.conf ;
fi
else
sed -i -r "s/^\s*FcgidMaxRequestLen\s+\d+.*$/FcgidMaxRequestLen 1073741824/" /etc/apache2/mods-available/fcgid.conf ;
fi
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
CHECK=`uname -a | grep 'amd64'`
if [[ "$CHECK" = "" ]] ; then
echo "Kompiliere auf 32Bit System" ;
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib --includedir=/usr/include/php52 --sysconfdir=/etc/php52/apache2 --with-config-file-path=/etc/php52/apache2 --with-config-file-scan-dir=/etc/php52/conf.d --enable-libxml --enable-session --with-pcre-regex=/usr --enable-xml --enable-simplexml --enable-filter --disable-debug --enable-inline-optimization --disable-rpath --disable-static --enable-shared --with-pic --with-gnu-ld --with-mysql --with-gd --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-exif --enable-fastcgi --enable-force-cgi-redirect --with-zlib --with-bz2 --with-curl --with-ldap --with-mysqli --with-ttf --with-freetype-dir --enable-soap --enable-sockets --enable-calendar --enable-ftp --enable-mbstring --enable-gd-native-ttf --enable-bcmath --enable-zip --with-pear --with-openssl --with-imap --with-imap-ssl --with-kerberos --enable-pdo --with-pdo-mysql --with-mysqli ;
else
echo "Kompiliere auf 64Bit System" ;
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib64 --includedir=/usr/include/php52 --sysconfdir=/etc/php52/apache2 --with-config-file-path=/etc/php52/apache2 --with-config-file-scan-dir=/etc/php52/conf.d --enable-libxml --enable-session --with-pcre-regex=/usr --enable-xml --enable-simplexml --enable-filter --disable-debug --enable-inline-optimization --disable-rpath --disable-static --enable-shared --with-pic --with-gnu-ld --with-mysql --with-gd --with-jpeg-dir --with-png-dir --with-xpm-dir --enable-exif --enable-fastcgi --enable-force-cgi-redirect --with-zlib --with-bz2 --with-curl --with-ldap --with-mysqli --with-ttf --with-freetype-dir --enable-soap --enable-sockets --enable-calendar --enable-ftp --enable-mbstring --enable-gd-native-ttf --enable-bcmath --enable-zip --with-pear --with-openssl --with-imap --with-imap-ssl --with-kerberos --enable-pdo --with-pdo-mysql --with-mysqli ;
fi
make && make install
echo "Kompilierung ist abgeschlossen. Sollten Fehler aufgetreten sein, bitte jetzt STRG+C druecken!"
read -p "Lege nun Skripte an... ENTER um fortzufahren (STRG+C um abzubrechen)"
cp /etc/php5/apache2/php.ini /etc/php52/apache2/
mkdir /etc/php52/cgi
cp /etc/php5/apache2/php.ini /etc/php52/cgi/
mkdir -p /etc/php52/php-fcgi/
echo '#!/bin/sh
FCGID_STARTER_PHPBIN="/usr/bin/php52/php-cgi -c /etc/php52/cgi/"
exec $FCGID_STARTER_PHPBIN
' > /etc/php52/php-fcgi/php-starter
chmod 750 /etc/php52/php-fcgi/php-starter
chattr +i /etc/php52/php-fcgi/php-starter
echo '#!/bin/sh
WEB_USER=$1
WEB_ID=$2
if [ "$WEB_USER" = "" ] ; then
echo "$0 .";
echo "z. B. $0 web4_ftp_adm web4";
exit 1;
fi
if [ "$WEB_ID" = "" ] ; then
echo "$0 .";
echo "z. B. $0 web4_ftp_adm web4";
exit 1;
fi
if [ ! -e "/var/www/${WEB_ID}" ] ; then
echo "Das Verzeichnis /var/www/${WEB_ID} existiert nicht."
exit 1;
fi
if [ ! -e "/etc/php52/php-fcgi" ] ; then
echo "Das Vorlagenverzeichnis /etc/php52/php-fcgi existiert nicht."
exit 1;
fi
cp -a /etc/php52/php-fcgi /var/www/${WEB_ID}/
chown -R ${WEB_USER}:${WEB_ID} /var/www/${WEB_ID}/php-fcgi
chattr +i /var/www/${WEB_ID}/php-fcgi/php-starter
find /var/www/${WEB_ID}/web -user www-data -exec chown ${WEB_USER}:${WEB_ID} {} \;
echo "Bitte den folgenden Abschnitt in die Apache Direktiven von ${WEB_ID} einfügen:"
echo "====================================="
echo "SuexecUserGroup ${WEB_USER} ${WEB_ID}"
echo ""
echo " SetHandler fcgid-script"
echo " "
echo ""
echo "AddHandler fcgid-script .php .php4 .php5"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php5"
echo "FCGIWrapper \"/var/www/${WEB_ID}/php-fcgi/php-starter\" .php4"
echo ""
echo "====================================="' > /root/fcgi-copy.sh
chmod 700 /root/fcgi-copy.sh
echo "FERTIG!"
echo "Mit dem Befehl /root/fcgi-copy.sh kann nun ein Web fuer PHP 5.2 vorbereitet werden."
[/pastacode]
Hi, vielen Dank für das HowTo! Hat mir einiges an Recherchearbeit erspart. Beim Kompilieren von PHP 5.2 fehlte mir noch das Paket „libfreetype6-dev“ auf einem frischen Squeeze. Beste Grüße, Ingo
Danke für den Hinweis, hab ich mit eingefügt.
Danke, funktioniert einwandfrei.
Hab das ganze unter Debian Squeeze und ISPConfig3 am laufen, hab dann noch Deinen Starter verändert bzgl. open_basedir usw. und die Apache Direktiven musste ich auch anpassen, ging aber problemlos.
#!/bin/sh
PHPRC=“/etc/php52/cgi/“
export PHPRC
PHP_DOCUMENT_ROOT=“/var/www/clients/client1/web1″
export PHP_DOCUMENT_ROOT
# The variable PHP_FCGI_CHILDREN is onyl useful for lighty or nginx as apache
# mod_fcgi will control the number of childs themself and never use the additional processes.
# PHP_FCGI_CHILDREN=8
# export PHP_FCGI_CHILDREN
PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_MAX_REQUESTS
exec /usr/bin/php52/php-cgi \
-d open_basedir=“/var/www/clients/client1/web1/web:/var/www/clients/client1/web1/tmp:/var/www/peter.local/web:/srv/www/peter.local/web:/usr/share/php5:/tmp“ \
-d upload_tmp_dir=/var/www/clients/client1/web1/tmp \
-d session.save_path=/var/www/clients/client1/web1/tmp \
$1
Hi, freut mich, dass es klappt 🙂
Ab ISPConfig 3.0.5 wirst du nur noch den ersten Teil benötigen, da es dann eine Funktion gibt um verschiedene PHP Versionen in ISPConfig einzutragen und für Webseiten auszuwählen.
In der aktuellen SVN Developer Version ist das schon enthalten. Im Admin Bereich wird dann nur noch der Pfad zur php-cgi Binary und zum php.ini Verzeichnis angegeben.
Hallo Marius,
ist Voraussetzung für Dein Tutorial hier, dass ich bereits ein Debian 6 mit ISPConfig eingerichtet habe?
Z.B. nach einem Tut. von howtoforge?
Oder nur ein Debian 6 Minimal? Auf anhieb hat es bei mir, mit Deb Minimal, nicht geklappt…
Cheers
axel
Ich vermute mal, dass es an fehlenden Paketen bei einer Minimal-Installation liegt.
Wenn du deine Fehler hier postest, kann ich schauen, ob ich das Tut dahingehend erweitern kann.
Danke für die Rückmeldung.
Die Frage war auch, ob ich bereits ein ISPConfig laufen haben sollte?
Die build-essentials etc sind installiert und das ./configure lief sauber durch.
Grundsätzlich benötigst du nicht unbedingt ein ISPConfig hierfür. Allerdings werden ohne ISPConfig die Pfade, User und Gruppen für die Webseiten vermutlich anders sein.
Dann müsste, damit es funktioniert, alles angepasst werden, was die FCGI-Starter Datei angeht.
Vielleicht kannst du ja schreiben, welche Probleme bei dir genau auftreten.
Ah, ok. Ich fahre gerade einen neuen Test und installier ISPConfig mal. Was da alles im Einzelnen nicht mehr ging, spare ich mir erstmal. Würde es vmtl. auch durcheinander bringen, weil ich seit vielen Stunden ein passendes System suche und immer wieder installiere, damit ich PHP5.2.x nutzen kann. Vom ISP bekomm ich nur „moderne“ Images zum installieren und alle laufen mit PHP5.3.x… damit läuft aber ein Webshop hier nicht mehr.
Das nun x-te Howto, also Deins, vllt. hilfts mir letztlich ja noch. Ich komm drauf zurück, wenn es weiterhin nicht klappen will.
Danke soweit!
Ich hätte jetzt noch das Problem anzubieten, dass der Web-User keine Scripte aufrufen darf/kann:
[Thu Sep 06 02:11:42 2012] [error] [client IP.ADRESSE] client denied by server configuration: /var/www/domain.eu/web/info.php
cp -a /etc/php52/php-fcgi /var/www/clients/client1/
chown -R web35:client1 /var/www/clients/client1/php-fcgi
chattr +i /var/www/clients/client1/php-fcgi/php-starter
Apache Direktiven:
SuexecUserGroup web35 client1
SetHandler fcgid-script
AddHandler fcgid-script .php .php4 .php5
FCGIWrapper „/var/www/clients/client1/php-fcgi/php-starter“ .php
FCGIWrapper „/var/www/clients/client1/php-fcgi/php-starter“ .php5
FCGIWrapper „/var/www/clients/client1/php-fcgi/php-starter“ .php4
In ISPConfig unter Webseiten/Web Domain/domain.eu muss man den Punkt PHP deaktivieren, schätze ich?
Wo könnte sich sonst der Fehlerteufel eingeschlichen haben?
Also PHP muss aktiviert bleiben in ISPConfig. Die Apache Direktiven werden beim Kunden in das vorgesehene Feld in ISPConfig eingetragen, zusätzlich zu den normalen Einstellungen (also aktiviertem PHP).
Ok, FCGI habe ich wieder aktiviert und PHP funktioniert nun wieder auf der Testseite.
Aber, PHP Version 5.3.3-7+squeeze14 teilt mit info.php mit. Trotz der Direktiven scheint hier von php52 keine Spur?!
.configure
make
make test
make install
alles ohne Fehler durchgelaufen. Hast Du noch einen Tipp, woran es hier scheitern könnte?
thx
Ganz blöde Frage… 😉 Hast du mal in die von ISPC generierte vhost Datei geschaut, ob die Direktiven auch übernommen wurden?
Sollte in irgendeinem(!) Host ein Fehler in den Direktiven sein, so dass Apache nicht mehr startet, übernimmt ISPC keine Änderungen.
Jo, die Einstellungen werden übernommen, ebenso wie die PHP Einstellungen, die ich extra angegeben habe.
Du schreibst oben „Der Standard unter ISPConfig 2 ist PHP 5.3 als Apache mod_php.“
Ich habe ISPC3 installiert mit FCGI (PHP5.3). Wenn ich z.B. unter einer der Website mod-PHP einstelle, anstelle von FCGI, bekomme ich nur noch einen 403 zurück.
Zurückgestellt auf FCGI funktioniert alles wieder, aber eben nur mit PHP 5.3.3.x.
Also ich komm da mal gar nicht weiter im Moment und stelle mir die Frage, was hier wohl falsch gelaufen sein könnte. Ist doch im Grunde idiotensicher Deine Anleitung und gut nachvollziehbar, was da passieren soll, wenn man die eigenen Apache Direktiven einstellt. Hmmmm… Als würde er sie komplett ignorieren.
Nach „make test“ kommt diese Meldung:
EXPECTED FAILED TEST SUMMARY
———————————————————————
output buffering – fatalism [tests/output/ob_011.phpt]
ob_start(): Ensure unerasable buffer cannot be flushed by ob_flush() [tests/output/ob_start_basic_unerasable_005.phpt]
Bug #42718 (unsafe_raw filter not applied when configured as default filter) [ext/filter/tests/bug42718.phpt]
SPL: ArrayObject::exchangeArray() basic usage with object as underlying data store. [ext/spl/tests/arrayObject_exchangeArray_basic3.phpt]
Bug #39863 (file_exists() silently truncates after a null byte) [ext/standard/tests/file/bug39863.phpt]
Ist das zu vernachlässigen?
@Axel:
probier einfach mal ein „/usr/bin/php52/php -v“ auszuführen und schau ob php grundsätzlich läuft.
Ob die failed Tests bei dir wichtig wären, kann ich ehrlich gesagt nicht beantworten.
Danke noch mal für die Zeit und Mühe. Ich musste einen anderen Lösungsansatz wählen, da ich es mit dieser Hilfestellung hier nicht hinbekommen habe.
🙂 Kein Problem. Hauptsache es funktioniert hinterher.
Vielen Dank für das tolle Howto. Die Kompilierung hat soweit gut funktioniert, nur leider scheitere ich bei der Einbindung im ispconfig3. Wie muss ich das Script fcgi-copy.sh modifizieren? Danke und Grüße, Sven
Nachtrag: Ich erhalte den Fehler:
Connection reset by peer: mod_fcgid: error reading data from FastCGI server
Premature end of script headers: phpinfo.php
Hallo Sven,
ich würde dir empfehlen auf den Release von ISPConfig 3.0.5 zu warten, der nicht mehr lange dauern dürfte (Alpha Version wurde schon veröffentlicht).
Dort gibt es als Admin die Möglichkeit verschiedene PHP Versionen einzutragen und muss nur den Pfad zum entsprechenden php-cgi Binary sowie zur php.ini eintragen und kann dann in den Webs bei fast-cgi die gewünschte PHP Version wählen.
ISPConfig kümmert sich dann um die korrekten Einstellungen für das jeweilige Web wie z.b. die fcgi Starterdatei.
Das klingt Super, ich danke Dir für den Tipp! Tolle Arbeit und weiter so! 🙂
Vielen Dank, alles hat prima geklappt!
Ich habe nur nicht rausgekriegt, wie man extensions für die PHP 5.2 Version kompiliert (in meinem Fall bräuchte ich ffmpeg-php). Ich habe ffmeg-php für PHP 5.3 kompiliert, aber anscheinend kann man nicht einfach in der php.ini (PHP 5.2) den Pfad angeben, da die Kompilierung versionspezifisch ist.
Hallo Dirk.
Ich habe es zwar noch nicht selbst ausprobiert, aber ich glaube du musst dafür sorgen, dass bei der Kompilierung die richtigen Pfade verwendet werden.
Ich meine du müsstest ja „phpize“ aufrufen um solche Module zu kompilieren. Achte darauf, dass du die 5.2er Version davon verwendest, die ja in /usr/bin/php52 liegen sollte.
Außerdem musst du darauf achten, dass er den Include Pfad /usr/include/php52 statt /usr/include nimmt (bzw. zusätzlich).
Super Anleitung, aber was muss ich denn bei ISPConfig 3.0.5 in den Pfad zum PHP FastCGI Binary und Pfad zum php.ini Verzeichnis eintragen bitte?
mit diesen Einstellungen bekomme ich Server 500 Error.
Danke
Der Pfad zum Binary ist ja /usr/bin/php52/php-cgi
Der Pfad zur ini ist
/etc/php52/cgi/
Allerdings musst du aufpassen, dass du keine php.ini Einstellungen von deiner anderen Installation übernimmst, die in 5.2 nicht gültig waren.
Wenn du sichergehen
möchtest, dann kopiere am besten die php.ini-production bzw. php.ini-recommended aus dem heruntergeladenen tar.gz von PHP 5.2 nach /etc/php52/cgi/php.ini