Installer PHP 7.0 avec Apache2 sous Debian 8 (Jessie)

Comme je l'ai annoncé sur Twitter il y a quelques jours, j'effectue des opérations de maintenance en ce moment, en ce qui concerne l'hébergement du site. Ces opérations ont été motivées par la panne d'un disque dur du serveur hébergeant le site. Plutôt que d'interrompre le site pendant une heure (le temps de remplacer le disque) puis de resynchroniser le RAID, je me suis dis que j'allais en profiter pour faire quelques modifications sur cet hébergement. Du coup, j'ai temporairement migré le site chez moi, sur un serveur Debian avec le tout récent PHP 7.0 histoire de voir comme cela tourne et de déceler, pourquoi pas, quelques incompatibilités ou problèmes. Et, au passage, j'ai remplacé MySQL par MariaDB. Bon je vous passe tous les détails. Tout ça pour dire que j'ai un peu galéré avec la dernière version de PHP, n'ayant pas trouvé de tutoriel correspondant à ma situation. C'est la raison pour laquelle je vous propose ici un petit tuto.

 

PHP 7.0 : un peu d'histoire...

Quelques explications avant de passer au tutoriel. La version 7.0 de PHP est sortie en 2015. Elle succède à la version 5. La version 6 de PHP a, en effet, été abandonnée après de nombreux reports récurrents. Finalement, les développeurs ont décidé de repartir sur de bonnes bases et ont donc abandonné cette version PHP 6. PHP 7.0 apporte donc de nombreuses optimisations du langage PHP, permettant d'améliorer considérablement les performances de celui-ci. Ainsi, la version 7 de PHP permet de rivaliser avec les produits concurrents et notamment avec HHVM (qui reste légèrement meilleur en terme de performances dans de nombreux benchmarks).

J'avoue que je me suis posé la question pendant un temps : PHP 7 ou HHVM. J'ai finalement retenu PHP car HHVM ne supporte pas toutes les fonctions PHP (même s'il supporte la quasi totalité de celles-ci). Et puis PHP ne m'est pas inconnu contrairement à HHVM. Enfin, étant donné les réelles différences de performances avec la version 5, j'avais vraiment envie de tester cela.

L'environnement de ce tutoriel

Avant de vous lancer, lisez bien ce tutoriel jusqu'au bout afin de ne pas avoir de mauvaises surprises. Pour réaliser ce tutoriel, je me suis appuyé sur un serveur Debian 8.4 "Jessie". Malheureusement, les choses ne sont pas simples car PHP 7.0 est encore très jeune et il n'est donc pas intégré dans les dépôts officiels de Debian. Deux solutions sont alors envisageables : utiliser un dépôt alternatif, ou bien récupérer les sources de PHP 7.0 et les compiler avec les options nécessaires.

Je tiens à attirer votre attention sur l'utilisation de PHP 7.0. Le langage reprend beaucoup de fonctions de PHP 5, mais la compatibilité n'est pas de 100%. Il se peut donc que vous rencontriez des soucis. J'ai, par exemple, lu sur le net que Owncloud ne fonctionnait pas (ou mal) avec cette version de PHP. Il faut également ajouter que si vous utiliser PHPMyAdmin depuis les dépôts officiels, cela ne sera plus possible. PHPMyAdmin est lié à PHP 5 au niveau des paquets. Si vous voulez continuer à utiliser PHPMyAdmin, il vous faudra télécharger les sources et les compiler... Soyez prudent, donc, et testez au préalable PHP 7.0 dans un environnement de recette. Cela vous évitera des surprises !!!

Pour la partie serveur web, je suis resté fidèle à Apache2 (version 2.4.10). Sur le net, on trouve beaucoup de tutoriels concernant Nginx mais peu concernant Apache2. Je me suis dis donc que c'était l'occasion de proposer mon tuto sur le sujet. Certains seraient peut être tentés de me demander pourquoi Apache et pas Nginx ? Et bien tout simplement car la robustesse d'Apache2 n'est plus à démontrer. Ses performances sont largement à la hauteur de mes attentes et les modules sont très nombreux. De plus, on peut recenser quelques avantages d'Apache, comme par exemple l'utilisation des fichiers htaccess, chose que Nginx ne supporte pas. Nginx apporte un plus incontestable pour servir du contenu statique en cas de nombreuses requêtes simultanées (plusieurs milliers par secondes). Le jour où j'arriverai à un tel niveau d'audience sur JusteGeek.fr, je pourrai légitimement me reposer la question... 

Enfin, pour ce qui est des bases de données, j'ai tenté l'expérience MariaDB en remplacement de MySQL. Ok, le changement n'est pas significatif, je vous le concède.

Installer PHP 7.0 avec Apache2

Pour mon test de PHP 7.0, j'ai décidé d'utiliser le dépôt Dotdeb, maintenu par Guillaume Plessis par "simplicité".

En premier lieu, et pour être tranquille, vérifiez que tous vos paquets sont à jour :

apt-get update && apt-get upgrade && apt-get dist-upgrade -y

Ensuite, puisque PHP 7.0 n'est pas dans les dépôts Debian (et ne le sera sans doute pas avant la version 9 de Debian), il va falloir commencer par ajouter ce dépôt Dotdeb aux sources logicielles.

echo "deb http://packages.dotdeb.org jessie all" > /etc/apt/sources.list.d/dotdeb.list

Attention, pensez à remplacer "jessie" par le nom de votre distribution si vous utilisez une autre version de Debian.

wget https://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg

On va maintenant mettre à jour les sources logicielles :

apt-get update

Je pars ici d'un serveur fraîchement installé. Si vous utilisez ce tutoriel sur un serveur possédant une autre version de PHP, il est préférable de désinstaller cette ancienne version :

apt-get --purge remove php5*

Nous sommes maintenant prêts pour installer PHP 7.0 :

apt-get install php7.0 php7.0-fpm

Si vous vous contentez de ces paquets, PHP 7.0 sera effectivement installé, mais il ne fonctionnera pas avec Apache2. Il vous faudra installer en plus le module adéquate :

apt-get install  libapache2-mod-php7.0

Installer également tous les modules dont vous aurez besoin. Pour voir les modules disponibles, saisissez la commande suivante dans votre terminal :

apt-cache search PHP7.0*

Pour ma part, j'ai installé les modules suivants :

apt-get install php7.0-gd php7.0-mysql php7.0-bz2 php7.0-json php7.0-curl

Vous pouvez maintenant vérifier que PHP7.0 est bien installé avec la commande :

php -v

Une fois que c'est fait, on va passer à un peu de configuration, car oui, désolé mais il en faut un peu pour que ça marche.

 

Configurer PHP 7.0

À ce stade, PHP 7.0 est installé mais n'est pas encore fonctionnel. On va donc modifier un peu sa config. Ouvrez le fichier php.ini de php7.0-fpm avec votre éditeur de texte préféré (nano, vi...)

nano /etc/php/7.0/fpm/php.ini

Localisez la ligne 

cgi.fix_pathinfo=1 

Et modifiez-la pour obtenir :

cgi.fix_pathinfo=0

 On va ensuite modifier le socket d'écoute de php7.0-fpm. Pour cela, utilisez une fois encore votre éditeur de texte préféré :

nano /etc/php/7.0/fpm/pool.d/www.conf

Localisez la ligne :

listen = /run/php/php7.0-fpm.sock

Et remplacez-la par :

listen = 127.0.0.1:9000

 

Voilà. Maintenant PHP 7.0 devrait être opérationnel. On va donc redémarrer les différents services et tester :

service php7.0-fpm restart

service apache2 restart

Pour vérifier que PHP est bien fonctionnel, créez simplement un fichier info.php à la racine de votre site, et collez le code suivant dedans :

<?php
phpinfo();
?>

Rendez-vous ensuite sur votre site : http://votresite/info.php et si vous voyez votre page de configuration PHP, c'est que c'est tout bon 🙂

 

Sandstorm

Sandstorm

Ingénieur Systèmes passionné d'informatique et de High-Tech, Sandstorm a créé JusteGeek.fr en 2013. Il aime les geekeries en tout genre.

Vous aimerez aussi...

19 réponses

  1. BaZiik dit :

    Salut, j'ai relevé deux erreurs
    Il n'y a pas de majuscules à service: http://prntscr.com/bmk05u
    Et, il vaut mieux utiliser les tags php complets, car en configuration fresh (Debian fresh + Apache Fresh + PHP Fresh), PHP ne reconnait pas les shorts opening tags http://prntscr.com/bmk0lh

    Merci du tuto

  2. lalbert dit :

    Salut,

    Il est dommage d'utiliser PHP-FPM sur TCP plutôt que sur le socket unix qui est plus performant.

    Perso, je conseille de conserver dans "/etc/php/7.0/fpm/pool.d/www.conf"

    [code]listen = /run/php/php7.0-fpm.sock[/code]

    Je vire le module PHP d'apache pour ajouter PHP-FPM (à travers un proxy)
    [code]
    a2dismod php7.0
    a2enmod proxy_fcgi
    a2enconf php7.0-fpm
    [/code]

    Le vhost apache ressemble ensuite à quelque chose comme :

    [code]

    ServerAdmin webmaster@localhost
    ServerName example.tld
    ServerAlias http://www.example.tld

    SetHandler proxy:unix:/run/php/php7.0-fpm.sock|fcgi://127.0.0.1:9001

    DocumentRoot /var/www/html/

    ...

    [/code]

    Bien que beaucoup continue à utiliser le module PHP d'apache (plus -simple- rapide à installer et configurer peut-être...), l'utilisation de PHP-FPM offre de nombreux atouts non négligeables (performance, possibilités d'avoir un utilisateur distinct par vhost à la manière de suexec par exemple, ...).

  3. paul dit :

    Bonjour, j'ai essayé plusieurs fois avec un vps sur OVH ( installation wordpress sur deb 8 ) , ça ne marche pas ...

  4. paul dit :

    Job for apache2.service failed. See "systemctl status apache2.service" and "journalctl -xe" for details.
    j'ai préféré migrer sur serverpilot finalement.

  5. Cyril dit :

    Bonjour,

    Pour ma part il m'est désormais impossible d'accéder à PHPMyAdmin.

    Cdt.

  6. emz0 dit :

    Bonjour.

    J'ai suivi votre tuto, mais il semble qu'après le passage à PHP7, mysql ne réponde plus (erreur 503). :/ Auriez-vous une idée d'où peut venir le problème, s'il vous plaît ?

  7. Mathieu dit :

    Bonjour
    Moi j'ai un serveur sous debian 8 avec webmin/virtualmin et avec mariadb10 et php5.6 et tout fonctionne, par contre quand je remplace php 5.6 par php 7, la j'ai acces aux pages html mais pour les pages php je me retrouve avec Internal Server Error.
    J'ai essayé ca : https://www.developpez.net/forums/blogs/92421-poulain/b1257/virtualmin-php7-erreur-500/
    Mais rien y fait
    Cela fait 2 jours que j'essaye de trouver la solution mais sans succés
    Merci par avance de votre aide

    • emz0 dit :

      J'ai eu le même problème, mais j'ai pu le régler. Regarde si le premier lien donné dans mon commentaire précédent peut t'aider... Sinon, je ne sais pas. :/

  8. Mathieu dit :

    Bonjour emz0
    Merci pour ton aide, cependant les liens gitub présent sur le site sur lequeltu me renvoi ne fontionne pas : 404.
    Peut tu me décrire en détail ce que tu a fait pour résoudre cette erreur 500 ?

  9. emz0 dit :

    Aïe, je voudrais bien mais ce n'est plus très frais dans ma tête - j'ai essayé pas mal de choses.

    J'ai installé les paquets suivants :

    php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-json php7.0-gd php7.0-mcrypt php7.0-msgpack php7.0-memcached php7.0-intl php7.0-sqlite3 php7.0-gmp php7.0-geoip php7.0-mbstring php7.0-xml php7.0-zip

    ... Trouvé l'extension manquante ici, si je me souviens bien : https://github.com/php/pecl-database-mysql

    J'ai du la compiler, puis ajouter la ligne suivante à mon php.ini pour l'activer :

    extension = /usr/local/lib/php/extensions/no-debug-non-zts-20151012/mysql.so

    Mais à vrai dire je ne suis pas bien sûr : j'ai du faire d'autres choses, et je bricole, étant loin d'être un pro.

  10. Mathieu dit :

    j'ai suivi un autre tuto et tout fonctionne : https://angristan.fr/installer-php-7-debian-8-jessie-depot-dotdeb/
    merci pour votre aide

  11. emz0 dit :

    En plus, ce tuto m'a permis d'optimiser mon installation : merci à toi !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.