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.
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
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.
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
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.
server1:~# uname -a Linux server1 2.6.30-2-amd64
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:
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib --includedir=/usr/include --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
Kompilier-Befehl für 64Bit:
./configure --prefix=/usr/share/php52 --datadir=/usr/share/php52 --mandir=/usr/share/man --bindir=/usr/bin/php52 --with-libdir=lib64 --includedir=/usr/include --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
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
make make test # optional make install
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.
a2enmod fcgid a2enmod suexec /etc/init.d/apache2 force-reload
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.
mkdir -p /etc/php52/php-fcgi vim /etc/php52/php-fcgi/php-starter
Der Inhalt der Datei:
#!/bin/sh FCGID_STARTER_PHPBIN="/usr/bin/php52/php-cgi -c /etc/php52/cgi/" exec $FCGID_STARTER_PHPBIN
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.
chmod 750 /etc/php52/php-fcgi/php-starter chattr +i /etc/php52/php-fcgi/php-starter
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:
cd /var/www/web1/ ls -ld web # Ausgabe: # drwxrwxr-x 14 web1_webmaster web1 4.0K Mar 5 04:00 web
In diesem Beispiel müsste also {WEB_ID} durch web1 und {WEB_USER} durch web1_webmaster ersetzt werden.
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
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:
SuexecUserGroup {WEB_USER} {WEB_ID}
<FilesMatch \.php$>
SetHandler fcgid-script
</FilesMatch>
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
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:
cd /var/www/{WEB_ID}/web
find /var/www/{WEB_ID}/web -user www-data -exec chown {WEB_USER}:{WEB_ID} {} \;
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:
<?php phpinfo(); ?>
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
#!/bin/sh
WEB_USER=$1
WEB_ID=$2
if [ "$WEB_USER" = "" ] ; then
echo "$0 <WEB_USER> <WEB_ID>.";
exit 1;
fi
if [ "$WEB_ID" = "" ] ; then
echo "$0 <WEB_USER> <WEB_ID>.";
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 "<FilesMatch \.php$>"
echo " SetHandler fcgid-script"
echo "</FilesMatch>"
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 "====================================="
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.
#!/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 --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 ;
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 --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 ;
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 <WEB_USER> <WEB_ID>.";
echo "z. B. $0 web4_ftp_adm web4";
exit 1;
fi
if [ "$WEB_ID" = "" ] ; then
echo "$0 <WEB_USER> <WEB_ID>.";
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 "<FilesMatch \.php$>"
echo " SetHandler fcgid-script"
echo "</FilesMatch>"
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."
Nach diesen Begriffen suchten die Benutzer:
- ispconfig update debian lenny squeeze
- debian squeeze libxml2 downgrade
- ispconfig und mysqli
- debian 6 php 5 2 5 3 parallel
- debian 6 php
- ispconfig php version einstellungen
- ispconfig upload limit
- php version debian 6
- mehrere php versionen debian
- mehrere php versionen debian
- ispconfig php 5 2 cgi
- mehrere php versionen debian 6
- php52 scan this dir for
- ispconfig php 5 2 cgi
- debian squeeze exec ausführen über php
- debian mysql xml pcre
- debian 6 0 squeeze php
- debian fastcgi php 5 3 5 2
- debian sqeeze php ini path
- debian pear mod_fcgid
- debian php 5 3 and 5 2
- apache installieren debian 6
- was bedeutet php squeeze
- apache2 php aktivieren debian squeeze
- linux debian squeeze php 5 2
MRZ




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.