06/01/2016

Installer PHP 7 avec PHP-FPM et FastCGI pour ISPConfig 3 sur Debian 8 (Jessie)

Installation à partir de la distrib ovh ispconfig-debian 8  jessie

Ispconfig 3 php7 php-fpm debian 8 jessie
Faire fonctionner PHP7 sur son serveur - Ispconfig 3 php7 php-fpm debian 8 jessie


Comme j'en avais marre d'aller chercher les infos à droite à gauche pour l'install de php7 et faire fonctionner php-fpm, je les ai rassemblé ici pour mon confort personnel, et parce que je pourrais plus facilement le retrouver dans google.

Si ça peut vous rendre service tant mieux, mais je n'assure aucun support et je ne suis pas responsable de ce que vous allez faire sur votre serveur. Je pars du principe que vous venez de commander un serveur dédié chez ovh que votre serveur est donc vierge.

Si vous voulez le blabla explicatif, voici la source sans qui je n'y serais arrivé (thanks guy) :
https://www.howtoforge.com/tutorial/how-to-install-php-7-on-debian/

Installer Mysql 5.6

Si vous installez magento 2 en ligne de commande il vous dira que vous n'avez pas la bonne version de mysql, on va commencer par mettre à jour mysql

sudo apt-get install mysql-server-5.6

 

Pourquoi  installer php 7 ? 

Parce qu'il exécute plus rapidement le code que php 5.6 et que vos wordpress 4.4, et magento2 pourront en tirer parti, jusqu'à 2 fois plus rapide ont été annoncé les différents benchmarks php7 avec wordpress.

Pourquoi installer php-fpm (FastCGI Process Manager) ?

Parce qu'il garde en mémoire les requêtes effectuées précédemment. Avec PHP-FPM, les éléments et instructions invoqués lors d’une requête sont conservés en mémoire, c’est-à-dire mis en cache au niveau du serveur, pour être réutilisés directement si cette même requête est à nouveau demandée. On constate des accès en général 7 fois plus rapide.

Une fois installé, connectez-vous en ssh avec les paramètres que vous aurez reçu par mail. Vous pourrez changer les mots de passe par la suite.

On commence par activer ces modules pour le support de fastcgi .

sudo a2enmod actions fastcgi alias

Ensuite on passe à l'installation de php 7

mkdir -p /opt/php-7.0.0
mkdir /usr/local/src/php5-build
cd /usr/local/src/php5-build
wget http://de1.php.net/get/php-7.0.0.tar.bz2/from/this/mirror -O php-7.0.0.tar.bz2
tar jxf php-7.0.0.tar.bz2
cd php-7.0.0/
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 libicu-dev snmp

ln -s /usr/lib/libc-client.a /usr/lib/x86_64-linux-gnu/libc-client.a

./configure --prefix=/opt/php-7.0.0 --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 --enable-intl

L'option --enable-intl c'est parce qu'il est demandé par magento2 et j'en avais besoin pour le tester, sinon vous ne pourrez pas installer magento2

make
make install
cp /usr/local/src/php5-build/php-7.0.0/php.ini-production /opt/php-7.0.0/lib/php.ini
cp /opt/php-7.0.0/etc/php-fpm.conf.default /opt/php-7.0.0/etc/php-fpm.conf
cp /opt/php-7.0.0/etc/php-fpm.d/www.conf.default /opt/php-7.0.0/etc/php-fpm.d/www.conf

nano /opt/php-7.0.0/etc/php-fpm.conf

ctrl w, tapez pid

décommenter pid = run/php-fpm.pid

ctrl o entrée, ctrl x

nano /opt/php-7.0.0/etc/php-fpm.d/www.conf

ctrl w, tapez listen = 127

Changer port listen = 127.0.0.1:8999

ctrl o entrée, ctrl x

nano /etc/init.d/php-7.0.0-fpm

Copier-coller ça dedans

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

ctrl o entrée, ctrl x


Ensuite faire

chmod 755 /etc/init.d/php-7.0.0-fpm
insserv php-7.0.0-fpm

nano /lib/systemd/system/php-7.0.0-fpm.service

copiez-coller ça

[Unit]
Description=The PHP 7 FastCGI Process Manager
After=network.target

[Service]
Type=simple
PIDFile=/opt/php-7.0.0/var/run/php-fpm.pid
ExecStart=/opt/php-7.0.0/sbin/php-fpm --nodaemonize --fpm-config /opt/php-7.0.0/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

systemctl enable php-7.0.0-fpm.service
systemctl daemon-reload


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

nano /opt/php-7.0.0/lib/php.ini

ajouter zend_extension=opcache.so à la fin

Tester

cd /opt/php-7.0.0/bin
./php --version

On a bien PHP7

Ensuite on va restaurer nos bdd et phpmyadmin ne vous permettra pas d'uploader vos fichiers volumineux, sinon utilisez la ligne de commande.

nano /etc/php5/apache2/php.ini

ctrl w, upload_max_filesize 

upload_max_filesize = 20M
post_max_size = 20M
Redémarrez apache.

/etc/init.d/apache2 start

Voilà maintenant il faut vous connecter à votre ispconfig


https://votreserveur.com:8080

Ensuite vous allez dans système > additionnal php versions et vous cliquez sur le bouton add new PHP version pour ajouter votre nouvelle version.

Ajouter la version de PHP7 en plus de PHP5.6


Aller dans le panneau name et dans PHP Name vous mettez php7


Ensuite dans l'onglet FastCGI Settings

Path to the PHP FastCGI binary: /opt/php-7.0.0/bin/php-cgi
Path to the php.ini directory: /opt/php-7.0.0/lib

Ensuite dans PHP-FPM Settings


Path to the PHP-FPM init script: /etc/init.d/php-7.0.0-fpm
Path to the php.ini directory: /opt/php-7.0.0/lib
Path to the PHP-FPM pool directory: /opt/php-7.0.0/etc/php-fpm.d


Vous n'avez plus qu'à aller dans l'onglet site remplir les champs et ensuite aller sélectionner votre nouvelle version de PHP, sinon il utilisera php 5.6 par défaut

Activation de php 7 pour un nom de domaine dans ispconfig
Sélectionnez la version de php 7 que vous voulez utiliser


Voilà maintenant le petit truc qui va faire que vous allez me faire un don, lorsque vous installez wordpress 4.4 ou magento et que vous voyez qu'il ne se connecte pas à la base de donnée, c'est juste qu'il faut utiliser 127.0.0.1 à la place de localhost. Parce que php-fpm lance un nouveau processus pour chaque site.

Vous pouvez faire un fichier phptest.php

et y mettre un phpinfo() pour vérifier que vous avez bien php 7 qui fonctionne en mode php-fpm. N'oubliez pas de supprimer le fichier après votre vérification.
 

php info php7 server API FPM/FastCGI
On voit bien marqué FPM/FastCGI au niveau de Server API, donc c'est good




Que faire si après l'activation de php-fpm et php7 mon site n'interprète pas php ?

C'est parcque php-fpm est mal lancé, essayez cette commande :

sudo systemctl start php-7.0.0-fpm.service -l

et pour vérifier que c'est bien relancé

sudo systemctl status php-7.0.0-fpm.service

vous devriez voir ceci :

Vérifier que les processus php7-fpm fonctionnent

sudo a2enmod actions fastcgi alias

Autres utilitaires à installer


J'oubliais il me manque jpegtran  pour optimiser les images et pngcrush

sudo apt-get install libjpeg-progs pngcrush

Je voulais remercier aussi @matt_refeo qui m'a aidé aussi ;-)