Esprit & Schmackes

Nginx mit verschiedenen PHP-Versionen laufen lassen

wie man mit Nginx und PHP-FPM pro Subdomain eine andere PHP-Version verwenden kann so um die 726 Wörter

Derzeit läuft auf einem Ubuntu Server 12.04 das normale PHP 5.3.10. Da ich für meine Dev-Schmiede aber bevorzugt das aktuellste Stable verwende, will ich das derzeit aktuellste Stable PHP 5.5.0 auch zum Laufen bringen.

 

  1. Download
  2. Installieren
  3. Einrichten
  4. Sockets
  5. Nginx Vhosts
  6. Anmerkungen

 

Download

mkdir /opt/php-5.5.0
wget http://www.php.net/get/php-5.5.0.tar.gz/from/de1.php.net/mirror -O php.tar.gz
tar xfz php.tar.gz 

/opt/php-5.5.0 wird das installationsverzeichnis, das später auch im configure-Kommando angegeben werden muss.

 

Installieren

Zum Bauen von PHP braucht's noch die entsprechenden Abhängigkeiten, zu erhalten mit

sudo apt-get install build-essential
sudo apt-get build-dep php5
sudo apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-dbg libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev

 

cd php-5.5.0/

Folgende Angaben sind beim Kompilieren zwingend erforderlich; für eine Liste aller möglichen Paramater ./configure --help aufrufen.

./configure --prefix=/opt/php-5.5.0  --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data
make
sudo make install

 

Einrichten

Wenn alles gut lief sollten wir in /opt/php-5.5.0 jetzt ordentlich was reingewamst bekommen haben. Damit dieses PHP genauso komfortabel zu starten/stoppen ist erstellen wir noch ein init-Script dafür.

sudo vi /etc/init.d/php-5.5.0-fpm

 

#! /bin/sh
### BEGIN INIT INFO
# Provides:          php-5.5.0-fpm
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php-5.5.0-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
### END INIT INFO
php_fpm_BIN=/opt/php-5.5.0/sbin/php-fpm
php_fpm_CONF=/opt/php-5.5.0/etc/php-fpm.conf
php_fpm_PID=/opt/php-5.5.0/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

 

Sockets

Unter /etc/php5/fpm/pool.d wird jetzt pro Vhost eine Konfigurationsdatei angelegt. Hier wird eingetragen, welches PHP auf welchem Socket sitzt.

Für Vhosts, die auf der Paketinstallation von PHP laufen sollen (main.conf) also

listen = /var/run/php5-fpm/main.sock

Für Vhosts mit PHP 5.5.0 (php550.conf):

prefix = /opt/php-5.5.0
listen = /var/run/php5-fpm/php550.sock

 

Abschließend beide Daemons neustarten.

sudo service php5-fpm restart
sudo service php-5-5.0-fpm restart

 

Nginx' Vhosts sagen wo es lang geht

vi /etc/nginx/sites-available/default
location ~ \.php {
   fastcgi_split_path_info ^(.+\.php)(.*)$;
   fastcgi_pass unix:/var/run/php5-fpm/main.sock;
   fastcgi_index index.php;
   include fastcgi_params;
}

 

Und für die Verwendung von PHP 5.5.0:

 

location ~ \.php {
   fastcgi_split_path_info ^(.+\.php)(.*)$;
   fastcgi_pass unix:/var/run/php5-fpm/php550.sock;
   fastcgi_index index.php;
   include fastcgi_params;
}

 

Anschließend Nginx neustarten und mit phpinfo() die Versionen gegenchecken.

 

Anmerkungen

Wenn man selbstkompilierte Programme erweitern will, muss man natürlich ein paar Augen auf die jeweiligen Installationsverzeichnisse werfen. Um hier jetzt z. B. PHP 5.5.0 um xDebug zu erweitern, muss man a) das PHP-Installationsverzeichnis explizit mit angeben und b) abhängige Kommandos mit absoluten Pfaden aufrufen, also zum Beispiel

/opt/php-5.5.0/bin/phpize

statt nur

phpize

Weiterhin sollte man sich über Securityfixes der jeweiligen Versionen auf dem Laufen halten, weil apt uns ja nur die Version aus den Paketquellen upgradet.

 

[ unter , ]

Kommentare

was zu melden?