Mehrere PHP Versionen (PHP-FPM & FastCGI) mit ISPConfig 3 benutzen (Ubuntu 12.04 LTS)
Mehrere PHP Versionen (PHP-FPM & FastCGI) mit ISPConfig 3 benutzen (Ubuntu 12.04 LTS)
Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Follow me on Twitter
Seit ISPConfig Version 3.0.5 ist es möglich, mehrere verschiedene PHP Versionen auf einem Server zu benutzen und die optimale PHP Version für eine Webseite auszuwählen. Dieses Feature funktioniert mit PHP-FPM (ab PHP 5.3) und FastCGI (alle PHP 5.x Versionen). Das Tutorial zeigt Ihnen, wie Sie PHP 5.3 und PHP 5.4 als PHP-FPM und FastCGI Version auf einem Ubuntu 12.04 Server bauen. Diese PHP Versionen können in ISPConfig zusammen mit dem standard PHP benutzt werden (mit apt installiert).
Für die Richtigkeit der Inhalte dieses Tutorials gebe ich keinerlei Garantie!
1 Vorbemerkung
Ich werde PHP 5.3.22 und PHP 5.4.12 installieren, die neusten PHP 5.3 und 5.4 Versionen zur Zeit dieses Schreibens. Außerdem werde ich zeigen, wie man einige zusätzliche PHP Erweiterungen baut, wie zum Beispiel APC, memcache, memcached und ioncube.
Beachten Sie bitte, dass PHP-FPM sowohl auf Apache als auch auf nginx Servern eingesetzt werden kann, während FastCGI nur auf Apache Servern verfügbar ist.
PHP-FPM und FastCGI sind jeweils exklusiv in PHP 5.3 und 5.4, weshalb ich zwei Wege zeigen werde, auf die Sie PHP bauen können; einen für PHP-FPM und einen für FastCGI, wobei Sie PHP zwei Mal kompilieren können um beide zu erhalten, ein Mal mit –enable-fpm und ein Mal mit –enable-cgi (stellen Sie sicher, dass sie verschiedene Stammverzeichnisse benutzen, zum Beispiel /opt/php-5.3.22 für PHP-FPM und /opt/phpfcgi-5.3.22 für FastCGI).
2 PHP 5.3.22 bauen (PHP-FPM)
Laden Sie PHP 5.3.22 herunter und entpacken es:
mkdir /opt/php-5.3.22
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget http://de.php.net/get/php-5.3.22.tar.bz2/from/this/mirror -O php-5.3.22.tar.bz2
tar jxf php-5.3.22.tar.bz2
cd php-5.3.22/
Installieren Sie die vorausgesetzten Pakete zum Bauen von PHP5:
apt-get install build-essential
apt-get build-dep php5
apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a
(Der letzte Befehl ist nötig, falls Sie Ihr PHP mit –with-imap bauen, denn andernfalls würde ./configure mit folgendem Fehler abbrechen:
checking for crypt in -lcrypt… yes
configure: error: Cannot find imap library (libc-client.a). Please
check your c-client installation.
root@server1:/usr/local/src/php5-build/php-5.3.22#
)
Konfigurieren und bauen Sie PHP 5.3.22 folgendermaßen (Sie können den ./configure Befehl Ihren Wünschen nach anpassen. Sehen Sie sich
./configure –help
an um eine Liste der verfügbaren Optionen zu erhalten; benutzen Sie einen anderen ./configure Befehl, ist es möglich, dass zusätzliche Libraries benötigt werden, oder der Bauprozess wird fehlschlagen):
./configure –prefix=/opt/php-5.3.22 –with-pdo-pgsql –with-zlib-dir –with-freetype-dir –enable-mbstring –with-libxml-dir=/usr –enable-soap –enable-calendar –with-curl –with-mcrypt –with-zlib –with-gd –with-pgsql –disable-rpath –enable-inline-optimization –with-bz2 –with-zlib –enable-sockets –enable-sysvsem –enable-sysvshm –enable-pcntl –enable-mbregex –with-mhash –enable-zip –with-pcre-regex –with-mysql –with-pdo-mysql –with-mysqli –with-jpeg-dir=/usr –with-png-dir=/usr –enable-gd-native-ttf –with-openssl –with-fpm-user=www-data –with-fpm-group=www-data –with-libdir=/lib/x86_64-linux-gnu –enable-ftp –with-imap –with-imap-ssl –with-kerberos –with-gettext –enable-fpm
Die letzte Option (–enable-fpm) stellt sicher, dass diese PHP Version mit PHP-FPM funktioniert.
make
make install
Kopieren Sie php.ini und php-fpm.conf in die korrekten Verzeichnisse:
cp /usr/local/src/php5-build/php-5.3.22/php.ini-production /opt/php-5.3.22/lib/php.ini
cp /opt/php-5.3.22/etc/php-fpm.conf.default /opt/php-5.3.22/etc/php-fpm.conf
Öffnen Sie /opt/php-5.3.22/etc/php-fpm.conf und passen die folgenden Einstellungen an – in der listen Zeile muss ein ungenutzter Port benutzt werden (z.B. 8999; Port 9000 könnte bereits von Ubuntus standard PHP-FPM benutzt werden) und die Zeile include=/opt/php-5.3.22/etc/pool.d/*.conf muss am Ende hinzugefügt werden:
vi /opt/php-5.3.22/etc/php-fpm.conf
[...] pid = run/php-fpm.pid [...] user = www-data group = www-data [...] listen = 127.0.0.1:8999 [...] include=/opt/php-5.3.22/etc/pool.d/*.conf |
Erstellen Sie das Pool Verzeichnis für PHP-FPM:
mkdir /opt/php-5.3.22/etc/pool.d
Erstellen Sie als nächstes ein init Skript für PHP-FPM:
vi /etc/init.d/php-5.3.22-fpm
#! /bin/sh ### BEGIN INIT INFO # Provides: php-5.3.22-fpm # Required-Start: $all # Required-Stop: $all # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php-5.3.22-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFO php_fpm_BIN=/opt/php-5.3.22/sbin/php-fpm php_fpm_CONF=/opt/php-5.3.22/etc/php-fpm.conf php_fpm_PID=/opt/php-5.3.22/var/run/php-fpm.pid php_opts="--fpm-config $php_fpm_CONF" wait_for_pid () { try=0 while test $try -lt 35 ; do case "$1" in 'created') if [ -f "$2" ] ; then try='' break fi ;; 'removed') if [ ! -f "$2" ] ; then try='' break fi ;; esac echo -n . try=`expr $try + 1` sleep 1 done } case "$1" in start) echo -n "Starting php-fpm " $php_fpm_BIN $php_opts if [ "$?" != 0 ] ; then echo " failed" exit 1 fi wait_for_pid created $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; stop) echo -n "Gracefully shutting down php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -QUIT `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed. Use force-exit" exit 1 else echo " done" echo " done" fi ;; force-quit) echo -n "Terminating php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -TERM `cat $php_fpm_PID` wait_for_pid removed $php_fpm_PID if [ -n "$try" ] ; then echo " failed" exit 1 else echo " done" fi ;; restart) $0 stop $0 start ;; reload) echo -n "Reload service php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi kill -USR2 `cat $php_fpm_PID` echo " done" ;; *) echo "Usage: $0 {start|stop|force-quit|restart|reload}" exit 1 ;; esac |
Machen Sie das Skript ausführbar und erstellen Sie die Systemstartlinks:
chmod 755 /etc/init.d/php-5.3.22-fpm
update-rc.d php-5.3.22-fpm defaults
Starten Sie PHP-FPM danach:
/etc/init.d/php-5.3.22-fpm start
Solange keine Pools in /opt/php-5.3.22/etc/pool.d vorhanden sind, wird diese Warnung angezeigt werden, welche Sie jedoch ignorieren können:
root@server1:/usr/local/src/php5-build/php-5.3.22# /etc/init.d/php-5.3.22-fpm start
Starting php-fpm [04-Mar-2013 14:58:41] WARNING: Nothing matches the
include pattern ‚/opt/php-5.3.22/etc/pool.d/*.conf‘ from
/opt/php-5.3.22/etc/php-fpm.conf at line 512.
done
root@server1:/usr/local/src/php5-build/php-5.3.22#
Das war’s – wenn Sie möchten, können Sie nun einige zusätzliche Module wie APC, memcache, memcached und ioncube installieren.
Die APC, memcache und memcached Module können durch PEAR installiert werden, welches Sie zuerst installieren und initialisieren müssen:
apt-get -y install php-pear
cd /opt/php-5.3.22/etc
pecl -C ./pear.conf update-channels
APC kann nun wie folgt installiert werden:
pecl -C ./pear.conf install apc
Bestätigen Sie alle Standardwerte. Öffnen Sie anschließend /opt/php-5.3.22/lib/php.ini…
vi /opt/php-5.3.22/lib/php.ini
… und fügen die Zeile extension=apc.so am Ende der Datei hinzu (Sie können außerdem zusätzliche APC Einstellungen konfigurieren):
[...] extension=apc.so apc.enabled=1 apc.shm_size=128M apc.ttl=0 apc.user_ttl=600 apc.gc_ttl=600 apc.enable_cli=1 apc.mmap_file_mask=/tmp/apc.XXXXXX ;apc.mmap_file_mask=/dev/zero ;apc.shm_segments = 5 |
Die memcache Erweiterung kann folgendermaßen installiert werden:
pecl -C ./pear.conf install memcache
Öffnen Sie /opt/php-5.3.22/lib/php.ini…
vi /opt/php-5.3.22/lib/php.ini
… und fügen am Ende der Datei die Zeile extension=memcache.so hinzu:
[...] extension=memcache.so |
Die memcached Erweiterung kann folgendermaßen installiert werden:
apt-get install libmemcached-dev
ln -s /usr/include/libmemcached /usr/include/libmemcached-1.0
pecl -C ./pear.conf install memcached
Öffnen Sie /opt/php-5.3.22/lib/php.ini…
vi /opt/php-5.3.22/lib/php.ini
… und fügen die Zeile extension=memcached.so am Ende der Datei hinzu:
[...] extension=memcached.so |
Der ionCube Loader kann wie folgt installiert werden:
cd /tmp
Laden Sie als nächstes das korrekte ionCube Loader Paket für Ihre Architektur (x86_64 oder x86) herunter und entpacken es.
Für x86_64:
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86-64.tar.gz
tar xfvz ioncube_loaders_lin_x86-64.tar.gz
Für x86:
wget http://downloads2.ioncube.com/loader_downloads/ioncube_loaders_lin_x86.tar.gz
tar xfvz ioncube_loaders_lin_x86.tar.gz
Fahren Sie wie folgt fort:
cp ioncube/ioncube_loader_lin_5.3.so /opt/php-5.3.22/lib/php/extensions/no-debug-non-zts-20090626/ioncube.so
vi /opt/php-5.3.22/lib/php.ini
Fügen Sie die Zeile zend_extension = /opt/php-5.3.22/lib/php/extensions/no-debug-non-zts-20090626/ioncube.so gleich am Anfang der Datei ein (vor der [PHP] Zeile):
zend_extension = /opt/php-5.3.22/lib/php/extensions/no-debug-non-zts-20090626/ioncube.so [PHP] [...] |
Laden Sie PHP-FPM danach neu:
/etc/init.d/php-5.3.22-fpm reload
In ISPConfig 3.0.5 können Sie die neue PHP Version unter System > Additional PHP Versions konfigurieren. Im Name Reiter tragen Sie lediglich einen Namen für die PHP Version ein (z.B. PHP 5.3.22) – die PHP Version wird unter dem eingetragenen Namen in den Webseiteneinstellungen von ISPConfig aufgeführt werden:
Begeben Sie sich in den PHP-FPM Settings Reiter (der FastCGI Settings Reiter kann leer gelassen werden) und füllen Sie die Felder wie folgt aus: