PHP multi-versions sur le même Apache

27099 vues
09 septembre 2016
Jérémie
monday

Le but du tutoriel est de faire tourner plusieurs versions de PHP sur le même serveur Apache. A la fin de ce tutoriel vous serez capable de tester votre site sur autant de versions de PHP que vous avez installé en modifiant une petite ligne dans votre Vhost, c'est pas beau ça? :)

 

 Installation d'Apache et du 1er php

mondayEn premier lieu si vous n'avez pas de serveur Apache d'installer, nous allons l'installer :

apt-get install apache2
apt-get install mysql-server
apt-get install php5 php-pear
apt-get install php5-mysql


Nous installons ensuite Php-fpm qui est une alternative à FastCGI avec de meilleures performances :

apt-get install php5-fpm


Pour qu'Apache puisse communiquer avec Php5 Fpm nous devons installer ce module ci :

apt-get install libapache2-mod-fastcgi



Il est possible qu'il mette une erreur comme quoi il ne connait pas ce module, il faut alors modifier votre fichier /etc/apt/sources.list et rajoutez non-free à chaque fin de lignes. De base Debian ne donne que les programmes entièrement libre, le fait de rajoutez non-free permet d'avoir aussi accès au non-libre. Il faut aussi que nous activions le module action d'Apache  :

a2enmod actions


Nous allons modifier le module qui se trouve dans /etc/apache2/mods-enable/fast-cgi.conf:

AddHandler fastcgi-script .fcgi
#FastCgiWrapper /usr/lib/apache2/suexec
FastCgiIpcDir /var/lib/apache2/fastcgi
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
Require all granted

Nous devrions maintenant avoir un PHP qui fonctionne bien, faites un test en créant un index.php avec un php.info();

Installation du second PHP

Nous allons maintenant installer notre seconde version de PHP, pour cela on se rend dans /opt, puis on va télécharger sur le site de php.net la version de PHP que l'on veut:

cd /opt
wget http://fr2.php.net/get/php-7.0.9.tar.gz/from/this/mirror
tar -xvf mirror


Maintenant que votre archive est décompressée on va passer à l'installation manuelle de cette nouvelle version de PHP, pour cela on va avoir besoin de certains paquets :

apt-get install build-essential nano
apt-get install libfcgi-dev libfcgi0ldbl libjpeg62-turbo-dbg libmcrypt-dev 
libssl-dev libc-client2007e libc-client2007e-dev libxml2-dev libbz2-dev libcurl4-openssl-dev
libjpeg-dev libpng12-dev libfreetype6-dev libkrb5-dev libpq-dev libxml2-dev libxslt1-dev
ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a


Nous pouvons maintenant lancer l'installation:

cd php-7.0.9
./configure --prefix=/opt/php-7.0.9 --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
--enable-exif --enable-bcmath --with-mhash --enable-zip --with-pcre-regex --with-pdo-mysql
--with-mysqli --with-mysql-sock=/var/run/mysqld/mysqld.sock --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 --with-xmlrpc --with-xsl --enable-opcache --enable-fpm


La seule option à modifier est le --prefix qui doit pointer à l’endroit où vous avez télécharger votre PHP.

make
make install


Apres l'installation :

cp /opt/php-7.0.9/etc/php-fpm.conf.default /opt/php-7.0.9/etc/php-fpm.conf

 

cp /opt/php-7.0.9/etc/php-fpm.d/www.conf.default /opt/php-7.0.9/etc/php-fpm.d/www.conf

Création du service du second PHP


Nous allons maintenant devoir créer deux choses , le script d'initialisation dans init.d puis le service dans systemd.

vi /etc/init.d/php-7.0.9-fpm


On colle ceci :

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


On rend le script exécutable.

insserv php-7.0.9-fpm


Création du lien système d'initialisation.Et maintenant pour le service :

vi /lib/systemd/system/php-7.0.9-fpm.service


On colle ça :

[Unit]

Description=The PHP 7 FastCGI Process Manager

After=network.target

[Service]

Type=simple

PIDFile=/opt/php-7.0.9/var/run/php-fpm.pid

ExecStart=/opt/php-7.0.9/sbin/php-fpm --nodaemonize --fpm-config /opt/php-7.0.9/etc/php-fpm.conf

ExecReload=/bin/kill -USR2 $MAINPID

[Install]

WantedBy=multi-user.targetsystemctl enable php-7.0.9-fpm.service systemctl daemon-reload

On active le service et on reload le tout.Maintenant le test final :

/etc/init.d/php-7.0.9-fpm start


Si il met une erreur comme quoi il a un problème avec le PID il est possible qu'il n'ai pas créé le fichier PID dans /opt/php-7.0.9/var/run/php-fpm.pid, il faut alors le créé. Normalement on a une ligne qui s'affiche de ce genre :

/etc/init.d/php-7.0.9-fpm start
Starting php-fpm done


Nous avons maintenant 2 versions de PHP d’installer maintenant il faut qu'elles puissent cohabiter place à la dernière partie......

Cohabitation des PHP

Nous allons utiliser les Vhosts d'Apache ainsi que le module proxy d'Apache qui va nous permettre de charger des conf de php.fpm différentes en fonction du Vhost.

a2enmod proxy
a2enmod proxy_fcgi


Nous allons aller modifier la configuration de nos php.fpm.

vi /etc/php5/fpm/pool.d/www.conf


La ligne qui nous intéresse est celle ci : listen = /var/run/php5-fpm.sock

Nous allons modifier par :listen = 127.0.0.1:8889

En gros on lui dit de faire la liaison avec apache sur un port défini sur lui même.On fait pareil pour notre 2e version de PHP mais sur un port différent évidemment, c'est là qu'est toute la subtilité ^^ :

vi /opt/php-7.0.9/etc/php-fpm.d/www.conf

On modifie :

listen = 127.0.0.1:8888

Il faut maintenant configurer nos vhosts :

vi /etc/apache2/sites-enables/php5.conf


On rajoute cette ligne : ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:8889/var/www/html/$1

Pareil pour le second Vhosts :

vi /etc/apache2/sites-enabled/php7.conf


On met :

ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:8888/var/www/html/$1

Si vous allez sur un php.info avec l'un ou l'autre des vhosts vous devriez avoir maintenant deux versions différentes sur le même serveur.

Si vous avez la moindre question n'hésitez pas à la poser dans les commentaires ;)